Duda en el comienzo del programa de un pic 16f873A I/SP

Hola buenos dias, vengo con una pequeña duda que tengo en la programación en ensambler de el pic 16f873 I/SP, lo que pasa es que hace cerca de un año me compre uno, y pues lo programe y si compilo bien en mplab pero al momento de usar un programador icprog, me aparecio error 0000h, solo que tengo dudas porque quizas no estaba bien configurado.
Perdi los programas y ahora lo he vuelto a tomar de nuevo a mi viejo pic, no se si se siguen los mismo pasos que un 16f84A agregando solo los puertos c
es asi? o ya me equivoque, aqui les dejo el programa para encender un led en tres puertos distintos.


Código:
  List p=16f873a
  INCLUDE <P16F873A.INC> 
 
__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC
 
status     equ    0x03
portc      equ    0x07
portb      equ    0x06
porta      equ    0x05
timer1     equ    0x0a
timer2     equ    0x0b
timer3     equ    0x0c
#DEFINE  ledrojo      PORTA,0
#DEFINE  ledverde   PORTB,0
#DEFINE  ledamarillo PORTC,0
 
 
ORG 0x0000 
        goto    encendido 
ORG 0x0004 
        nop
encendido bsf      STATUS,RP0 
              movlw  b'00000000' 
              movwf  TRISA 
              movlw   b'00000000' 
              movwf  TRISB
              movlw   b'00000000' 
              movwf  TRISC 
              bcf       STATUS,RP0 
    clrf PORTA 
    clrf PORTB
    clrf PORTC
inicio     bsf    ledrojo
            call   retardo
            bcf   ledrojo
            bsf   ledamarillo
            call   retardo
            bcf   ledamarillo
            bsf   ledverde
            call   retardo
            bcf   ledverde
            goto inicio
 
retardo   movlw   d'9'
            movwf   timer1
retardo1 movlw   d'45'
            movwf   timer2
retardo2 movlw    d'99'
            movwf    timer3
retardo3 decfsz   timer3,1
            goto      retardo3
            decfsz   timer2,1 
            goto      retardo2
            decfsz   timer1,1
            goto      retardo1
            return
 
END

Quizas mi pic si este averiado aunque quisera saber si podria rescatarlo o si yo cometi el error. pobresito ya venia muerto u.u un minuto se silencio....

PD: bye jejejeje por mas que intento editarle al programa no queda bien jejej mmm como se colocan las sangrias aqui o tengo que brincar espacio y espacio, al oprimir el boton de sangria me manda a guardar :s
 
Última edición:
Saludos. Solo quisiera saber un ejemplo en este pic aunque sea uno pequeñito mmm me he encotrado en la red algunos pero con otro lenguaje creo es c mm no se, pues el lenguaje que uso actualmente me resulta mas comodo, pero asi se empieza a programar? igual que un pic 16f84a? Es que lo necesitaré.

Por cierto, este programa puede ser posible?, mmm aun no lo he pasado al mplab pero tambien quisiera saber si se puede resumir el paso 1 y 2 es que no se usar unas tablas que e visto.
Tambien tengo duda en el paso 3 que es cargar w con un valor, y no se si w siempre sera ese valor permanentemente hasta que se vuelva a indicar que se cargue con otro valor, es decir que con solo una vez usada la instruccion movlw puedan usarse muchas intrucciones movwf...
otra cosa si se carga en w un cero al momento de usar el decfsz este hara el salto? o no se puede cargar cero?

Código:
 ;paso uno: se monitorean 2 entradas que nos indicaran el valor que de cargara en
; el contador
              btfsc         valor1            ;salta si es cero
              goto          ver1
              btfsc         valor2            ;salta si es cero
              goto          ver2
              movlw        d'0'                ;se carga con un cero? o sera 
              goto          pasodos          ;el 1???? brinca al paso dos
ver1        btfsc         valor2
              goto          ver3
              movlw        d'1'                ; o es 2???   :s    01 = 1
              goto          pasodos
ver2        movlw       d'2'                 ;2 o 3???             10=2
              goto          pasodos
ver3        movlw       d'3'                 ; 3 o 4 ???            11=3
                                
pasodos   movwf       contador         ;paso dos
              movlw       d'10'               ; se cargara w con un valor que indicara el
              decfsz      contador          ;el numero que se repetira el ciclo de la frec.
              movlw       d'20'
              decfsz      contador
              movlw       d'30'
              defsz        contador
              movlw       d'40'             ; que solo se cargue w 
 
frec1       movwf       timer1           ; aqui tenemos dos tonos "segun"
              bsf            bocina          ;aqui no estan bien diseñados pero
              nop                              ;es un ejemplo o como puedo hacer
              nop                              ;para que se cumpla esta parte del programa
              nop                              ; asi como quiero
              bcf           bocina
frec1a     decfsz       timer1
              goto          frec1a
 
frec2       movwf       timer1
              bsf            bocina
              nop
              nop
              nop
              bcf           bocina
frec2a     decfsz       timer1
              goto          frec1a
              goto          frec1
 
END

Olvidense ahora del programa anterior mas respondan al final, porque este programa es muy sencillo a comparacion con lo que debo hacer, pues necesito encontrar la forma de tener una sola rutina donde vengan tres frecuencias diferentes, ejem 875, 925, 875, 825, 875 asi hasta que se presione stop., el problema es que yo hice un programa que si funciono con estas frecuencias pero para esto use muchas lineas de codigo para este programa, pero me temo que si no encuentro una solucion como el programa que les puse arriba tendre que hacer una rutina para diferentes frecuencias en ves de solo hacer una donde se sustituyan sus variables, todo esto es muy confuso y oficialmente me acabo de revolver al escribir aqui jejej mmm cuando llegue a mi casa pondre el programa que les mencione donde hice variar las frecuencias, mmm la meta es la siguiente espero me apoyen:
todos los pics se comunicaran no se como pero lo haran.

pic1'
monitorea un teclado decimal del 0 al 9, aparte una tecla ok y una tecla de play/pause, dependiendo de esto mandara una señal a los demas pics, funciona así:

1.-led encendido, se presiona 0, se apaga led, se espera cuarto de segundo se prende led, se presiona 8, apaga led, pasa cuarto de segundo se enciende led, se presiona 7, apaga led, cuarto de segundo, enciende led, se presiona 5, mismo del led, tenemos cuatro cifras, 875Hz, se presiona ok, manda señal del numero obtenido y se pasa a la siguiente fase.

2.-introducir un rango en el que se variara la frecuencia, es decir en el caso anterior fue 100, (925 y 825, de la frecuencia ideal que era 875Hz)
Se presiona 0, apaga y prende led, se presiona 0, 5 y 0 igual que lo anterior. se presiona ok, se transmite el dato.

3.-Indicara el numero de veces que se repetira el ciclo. (para el programa que elabore anteriormente y que pondre aqui mas tarde, use 1,2,4,8,16,32,64,128,256) mismo procedimiento que los pasos anteriores, se manda el numero. Al presionar ok
se regresara al paso 1, pero si quieres puedes presionar play para escuchar tu creacion. Pause para detener y modificar los valores, que solo con escribir 0000 se pondra todo en 0 o si escribes 0050 pues sera 50Hz mmm.

pic2
mostrara en displays de 7 segmentos los valores ingresados, seran cuatro displays.
Ademas dispondra de tres leds, para paso 1, paso 2 o paso3 segun en el que se este. La meta controlar todo con el menor numero de salidas, mi idea es por frecuencias, que con siete salidas y una extra que activara un transistor, con esto se encendera un display con el numero indicado, pasado unos microsegundos, se desactivara el transistor 1 y se activara el dos, acivando otro display ya asi en los cuatro. Los leds si requieren que sean tres salidas una para cada uno.

pic3
El importante, dependiendo de la combinacion de los 4 digitos introducidos, mas los tres pasos, pues se generara el tono y el armonico complejo, si hiciese una rutina para cada combinacion uff ya sabran, asi que es mejor hacer menos subrutinas pero que sean capaces de modificar sus valores.




En el programa que hice y probe, tenia que cargar constantemente w para que se repitieran tantas veces los ciclos de cada frecuencia(paso3 del pic1) al terminar el conteo se pasaba a la otra frecuencia y pues se cargaba el mismo valor y asi sucesivamente. quiero evitar esto.

Mas complicado sera cuando tenga que usar tres rangos diferentes, pues la vocal a requiere de una frecuencia armonica de 875, 1200 y 2600 algo asi, :s me meti en algo grande que quiero terminar.

Todo esto son solo pruebas experimentales pues como dije anteriormente quiero lograr que con circuitos se reprodusca la palabra hola.

saludos y hasta luego
 
Última edición:
Hola n.n... logre crear un a e i o u pero muy robotico, sin chiste ni escencia humana, como si tocaras tres notas en un piano, tambien pues realmente ya no me sirven mucho los 16f84a debido a su poca memoria, me recomendaron usar los 16f2550 o 16f4550, mmm creo que el primero es de 28 pines igual que el 16f873a la diferencia es que tengo el programador para este ultimo y tendria que comprarme o hacerme uno para los 2550, que me recomendarian?

Ahora mi pregunta, como puedo producir una onda senoidal. Porque miren conecte los tres pics a una sola bocina porque no supe como usar las series de fourier para controlar los tres tonos al mismo tiempo en el mismo pic.
En una ecuacion de fourier me explican que si se tiene una frecuencia digamos de 1000 Hz y otra de 2000 Hz, se mezclan formando una onda no senoidal :S y si no se forma una onda no senoidal pues ya no funciona mi tecnica para generar los tonos que consistia en prender y apagar la bocina, esto a que si en un semiciclo tenemos una onda positiva, en el camino ascendente de esa onda esta se dividira en dos ondas pequeñas, segun fourier, pero esas ondas no regresan a 0 si no que si el pico era 5V las ondas mas pequeñas bajan a 3V y sube y ya regresan a 0 volts, creen que si conecto dos transistores al pic, uno que deje pasar 5 v y otro a 3 y se activen secuencialmente precisos se genere esta onda, bueno probare con esto haber que pasa, espero que con esto las vocales obtenidas se escuchen mas agradable al oido humano.
 
ya me atore :LOL: no puedo crear una onda senoidal de voltaje sobre tiempo con un pic16f84a se supone que ademas necesito variar su amplitud y variar la longitud del ciclo completo u.u, adios memoria es muy poca pero no puedo invertir ahorita, aun dispongo de mis tres pics.
Saludos.
 
Zettaextremo si pones la directiva #include "p16f873a" no hace falta que definas los registros ni los bit del micro, esa directica te los incluye de antemano, osea, pones poner para pasar al banco 1
BSF STATUS,RP0
BCF STATUS,RP1

sin necesidad de declarar ni el registro status ni los bit's rp0 o rp1
porque ha eso o hace la directiva #INCLUDE "P16873A.INC"

RECORDA PONER LOS NOMBRES DE LOS REGISTRO Y DE LOS BITS EN MAYUSCULA PORQUE OSI NO NO LOS RECONOCE.
 
Atrás
Arriba