TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: nacha4 en 23 de Febrero de 2006, 19:12:00

Título: RECEPCION DE UN BYTE
Publicado por: nacha4 en 23 de Febrero de 2006, 19:12:00
Hola hice este programa pero no funciona no se si es por el VB en la PC o por el programa del PIC, lo que yo quiero que haga es que reciba un BYTE por el puerto serie (esta configurado como me digeron en el foro) que compare los 4 bits mas significativos si son iguales a una que yo puse pasan a comparar los 4 bits menos significativos si son iguales a lo que yo puse que aga algo, pero no funciona, aca les mando parte del programa a ver si alguien se da cuenta de que errores estoy cometiendo

BUCLE   GOTO BUCLE      ;bucle infinito
RSI   BTFSS PIR1,5   ;Comprueva si la interupcion es por recepcion
   GOTO BUCLE      ;si no es asi buelve al bucle infinito
   BCF pir1,5      ;se baja el Flag de interrupcion
   movf RCREG,w      ;mueve entrada a W
   movwf DATORX   ;Mueve la entrada a DATORX
   andlw 0xF0      ;Comprueva si las 4 bit mas significativos
   subwf b"00010000",w   ;Modificar para los siguientes pics
   btfsc STATUS,2
   GOTO PIC
   GOTO BUCLE
PIC   movf DATORX,w
   andlw 0x0F
   subwf b"00000001",w   ;Modificar para los siguientes pasos
   btfsc STATUS,2
   GOTO LUZ4
   GOTO BUCLE
Título: RE: RECEPCION DE UN BYTE
Publicado por: maunix en 23 de Febrero de 2006, 20:15:00
Escrito originalmente por nacha4
Hola hice este programa pero no funciona no se si es por el VB en la PC o por el programa del PIC, lo que yo quiero que haga es que reciba un BYTE por el puerto serie (esta configurado como me digeron en el foro) que compare los 4 bits mas significativos si son iguales a una que yo puse pasan a comparar los 4 bits menos significativos si son iguales a lo que yo puse que aga algo, pero no funciona, aca les mando parte del programa a ver si alguien se da cuenta de que errores estoy cometiendo

BUCLE   GOTO BUCLE      ;bucle infinito
RSI   BTFSS PIR1,5   ;Comprueva si la interupcion es por recepcion
   GOTO BUCLE      ;si no es asi buelve al bucle infinito
   BCF pir1,5      ;se baja el Flag de interrupcion
   movf RCREG,w      ;mueve entrada a W
   movwf DATORX   ;Mueve la entrada a DATORX
   andlw 0xF0      ;Comprueva si las 4 bit mas significativos
   subwf b"00010000",w   ;Modificar para los siguientes pics
   btfsc STATUS,2
   GOTO PIC
   GOTO BUCLE
PIC   movf DATORX,w
   andlw 0x0F
   subwf b"00000001",w   ;Modificar para los siguientes pasos
   btfsc STATUS,2
   GOTO LUZ4
   GOTO BUCLE


Amigo, todo lleva a BUCLE y BUCLE mismo lleva a BUCLE!
El software nunca sale de ahí....

Corrije eso.

Título: RE: RECEPCION DE UN BYTE
Publicado por: nacha4 en 23 de Febrero de 2006, 21:29:00
perdon me olvide de aclarar que esta en un bucle infinito hasta que llega un byte al que es cuando se produce una interrupcion
gracias
Título: RE: RECEPCION DE UN BYTE
Publicado por: maunix en 24 de Febrero de 2006, 05:08:00
Escrito originalmente por nacha4
perdon me olvide de aclarar que esta en un bucle infinito hasta que llega un byte al que es cuando se produce una interrupcion
gracias


En tu código he visto un par de cosas que realmente creo que no funcionan bien.
fijate lo siguiente
Codigo:

   movf   RCREG,w      ;mueve entrada a W
   movwf   DATORX      ;Mueve la entrada a DATORX
PIC   movf   DATORX,w
   andlw   0x0F
   subwf   b"00000001",w   ;Modificar para los siguientes pasos



Fijate, aquí supongo que lo que quieres hacer es comparar el nibble inferior si es igual a 1.  Pero tu usas subwf.  Esta instrucción espera como parámetro un file register, es decir una posición de memoria.  Tu estas comparando con la posición de memoria.  

En realidad debieras hacer un sublw ya que tu lo quieres comparar con una constante.

Saludos
Título: RE: RECEPCION DE UN BYTE
Publicado por: nacha4 en 24 de Febrero de 2006, 13:55:00
hola hice la modificacion que me digiste y no funciona que podra ser te voy a ponerel programa completo a ver si es en otro lado
gracias

LIST P=16F628   
   Radix HEX
   #Include <P16F628.inc>
   
TATUS equ 0x03
portA equ 0x05
trisA equ 0x05
portB equ 0x06   
trisB equ 0x06
TXSTA equ 0x98
SPBRG equ 0x99
PIE1 equ 0x8c
RCSTA equ 0x18
INTCON equ 0x0b
pir1 equ 0x0c
RCREG equ 0x1a
TXREG equ 0x19
cmcom equ 0x1f
DATORX equ 0x70      ;dato a recibido
DATOTX equ 0x71      ;dato a trasmitir
      ORG 0
      GOTO INICIO
      ORG 4
      GOTO RSI
INICIO bcf STATUS,5   ;banco 0
      bcf STATUS,6   
   movlw .7
   movwf cmcom
   BSF STATUS,5      ;Banco 1
   BCF STATUS,6
   movlw b"11100010"   ;RB1 enntrada resto salida modificar las entradas y salida menos rb1,rb2
   movwf trisB         ;EEESSSES
   movlw b"11110000"      ;EEEESSSS
   movwf trisA
   movlw b"00100100"   ;8bit dato, trasmision activa, modo asincronico
   BCF STATUS,5
   movlw b"11000000"   ;Habilito las interrupciones en general
   movwf INTCON
   BSF STATUS,5
   movlw b"00100000"
   movwf PIE1
   BCF STATUS,5      ;Banco cero
   BSF STATUS,5
   movlw b"00100100"   
   movwf TXSTA      ;y alta velocidad
   movlw d"25"      ;se configura SPBRG de 9600 baudios
   movwf SPBRG
   BCF STATUS,5
   movlw b"10010000"   ;habilito el puerto serie en modo continuo
   movwf RCSTA
                BUCLE GOTO BUCLE ;bucle infinito
          RSI BTFSS PIR1,5 ;Comprueva si la interupcion es por recepcion
                GOTO BUCLE ;si no es asi buelve al bucle infinito
                BCF pir1,5 ;se baja el Flag de interrupcion
                movf RCREG,w ;mueve entrada a W
                movwf DATORX ;Mueve la entrada a DATORX
                andlw 0xF0 ;Comprueva si las 4 bit mas significativos
                subwf b"00010000",w ;Modificar para los siguientes pics
                btfsc STATUS,2
                GOTO PIC
                GOTO BUCLE
         PIC movf DATORX,w
                andlw 0x0F
                subwf b"00000001",w ;Modificar para los siguientes pasos
                btfsc STATUS,2
                GOTO LUZ4
                GOTO BUCLE
Título: RE: RECEPCION DE UN BYTE
Publicado por: maunix en 25 de Febrero de 2006, 09:32:00
Mmmm, veamos que veo ahi en tu código.

1) LUZ4 no lleva a ninguna parte.  Lo agregué en tu código ya que sino no compilaba bien.
2) Si usas la declaracion de registros de microchip (esto lo haces cuando haces el include del

PIC16F628.inc) no necesitas declarar los registros STATUS, TRIS, etc.
3) Cambién tus STATUS,5 por STATUS,RPO, y así con otras instrucciones similares.  Hacerlo de

esa manera aclara mucho el código.
4) Veo que no has hecho caso para nada a mi consejo anterior! sobre lo de hacer subwf

!!!  Ahi sique en tu código.
5) Habiendo cambiado esa línea, incluso tu código así como lo tienes ejecutará 1 vez, ya que

NUNCA vuelves de la interrupcion!  Al finalizar la rutina tu haces un "goto bucle" y en

realidad estás con el GIE apagado, esto es porque se apaga automáticamente al ingresar en la

interrupcion
6) No se hacee BCF PIR1,RCIF porque esto se hace "automáticamente" al leer el RCREG.
7) Si solo tienes una interrupción habilitada, no debiera generarse interrupcion por otra

causa.  Esto implica que tu chequeo al principio por el FLAG RCIF, es innecesario.
8) Habiendo corregido estas cositas, te paso el código corregido y que a mi me funciona.

Codigo:

   LIST P=16F628
   Radix HEX
   #Include <P16F628.inc>
   
DATORX equ 0x70 ;dato a recibido
DATOTX equ 0x71 ;dato a trasmitir

   ORG 0
   GOTO   INICIO
   ORG 4
   GOTO   RSI
INICIO   bcf   STATUS,RP0   ;banco 0
   bcf   STATUS,RP1
   movlw   .7
   movwf   CMCON
   BSF    STATUS,RP0   ;Banco 1
   BCF    STATUS,RP1
   movlw   b"11100010"   ;RB1 enntrada resto salida modificar las entradas y salida

menos rb1,rb2
   movwf   TRISB       ;EEESSSES
   movlw   b"11110000"   ;EEEESSSS
   movwf   TRISA

;ESTA LINEA ESTA DE MAS Y NO LLEVA A NADA --> BORRARLA
   movlw   b"00100100"    ;8bit dato, trasmision activa, modo asincronico

   bcf    STATUS,RP0
   movlw    b"11000000"    ;Habilito las interrupciones en general
   movwf   INTCON
   BSF    STATUS,RP0
   movlw    b"00100000"
   movwf   PIE1
   BCF    STATUS,RP0    ;Banco cero
   BSF    STATUS,RP0
   movlw    b"00100100"
   movwf   TXSTA       ;y alta velocidad
   movlw   d"25"      ;se configura SPBRG de 9600 baudios
   movwf   SPBRG
   BCF    STATUS,RP0
   movlw    b"10010000"   ;habilito el puerto serie en modo continuo
   movwf   RCSTA

BUCLE:
   GOTO   BUCLE       ;bucle infinito




RSI
;Estas 2 líneas, tranquilamente podrían ser eliminadas
   BTFSS   PIR1,RCIF    ;Comprueba si la interupcion es por recepcion
   retfie         ;Cambié el GOTO BUCLE por el RETFIE

;ESTA LINEA ESTA DE MAS Y NO LLEVA A NADA ya que se hace automáticamente --> BORRARLA
;   BCF   PIR1,RCIF   ;se baja el Flag de interrupcion
   movf   RCREG,w   ;mueve entrada a W
   movwf   DATORX   ;Mueve la entrada a DATORX
   andlw   0xF0    ;Comprueva si las 4 bit mas significativos

;ESTA LINEA ESTABA MAL... cambié subwf por sublw y eliminé el ,w ya que no es usado en dicha

instrucción
   sublw    b"00010000"   ;Modificar para los siguientes pics
   btfsc   STATUS,Z
   GOTO   PIC
   retfie      ;Cambié el GOTO BUCLE por el RETFIE
PIC   movf   DATORX,w
   andlw   0x0F
;ESTA LINEA ESTABA MAL... cambié subwf por sublw y eliminé el ,w ya que no es usado en dicha

instrucción   sublw    b"00000001" ;Modificar para los siguientes pasos
   sublw   b"00000001"
   btfsc   STATUS,Z
   GOTO   LUZ4
   retfie      ;Cambié el GOTO BUCLE por el RETFIE

LUZ4:
   retfie      ;Linea agregada por mi para que compile bien



   end



Creo qeu tu error ocurrió porque has puesto la rutina de atención de interrupción pegada al

código normal y esto te confundió , seguramente pensabas que era un código normal y en

realidad estabas atendiendo una interrupción.


9) Me tomé la libertad de postearte otro código de como organizaría yo el texto de tu

software.



Moví tu rutina de interrupcion a la posicion 0x04.   No es "pecado" hacer esto, para nada, es

tan bueno como ponerla en otro lugar.  Además hacer un "goto" a una direccion asi sin

almacenar el estado del PLATH, STATUS, etc... te traerá muchos dolores de cabeza cuando uses

un pic mas grande.  Esto está documentado en las datasheet donde se habla del "context saving"

cuando usas interrupciones.


Codigo:

   LIST P=16F628
   Radix HEX
   #Include <P16F628.inc>
   
DATORX equ 0x70 ;dato a recibido
DATOTX equ 0x71 ;dato a trasmitir

   ORG 0
   goto   INICIO
   ORG 4
RSI:
   movf   RCREG,w      ;mueve entrada a W
   movwf   DATORX      ;Mueve la entrada a DATORX
   andlw   0xF0       ;Comprueba si las 4 bit mas significativos

   sublw    b"00010000"   ;Modificar para los siguientes pics
   btfsc   STATUS,Z
   goto   PIC
   retfie         
PIC
   movf   DATORX,w
   andlw   0x0F
   sublw   b"00000001"
   btfsc   STATUS,Z
   goto   LUZ4
   retfie         

LUZ4:
   retfie         



INICIO
   bcf   STATUS,RP0   ;banco 0
   bcf   STATUS,RP1
   movlw   .7
   movwf   CMCON
   BSF    STATUS,RP0   ;Banco 1
   BCF    STATUS,RP1
   movlw   b"11100010"   ;RB1 enntrada resto salida modificar las entradas y salida

menos rb1,rb2
   movwf   TRISB       ;EEESSSES
   movlw   b"11110000"   ;EEEESSSS
   movwf   TRISA

   bcf    STATUS,RP0
   movlw    b"11000000"    ;Habilito las interrupciones en general
   movwf   INTCON
   BSF    STATUS,RP0
   movlw    b"00100000"
   movwf   PIE1
   BCF    STATUS,RP0    ;Banco cero
   BSF    STATUS,RP0
   movlw    b"00100100"
   movwf   TXSTA       ;y alta velocidad
   movlw   d"25"      ;se configura SPBRG de 9600 baudios
   movwf   SPBRG
   BCF    STATUS,RP0
   movlw    b"10010000"   ;habilito el puerto serie en modo continuo
   movwf   RCSTA

BUCLE:
   GOTO   BUCLE    ;bucle infinito





   end



Espero se te haya aclarado el tema.  Lo probé con el MPLAB 7.3 y me andubo muy bien.

Saludos
Título: RE: RECEPCION DE UN BYTE
Publicado por: nacha4 en 27 de Febrero de 2006, 14:22:00
hola muchas gracias por el programa anda muy bien, tengo una duda porque envio el byte desde la PC con un programa en Visual Basic el Byte lo envia cada ves que hago un click a un boton pero no siempre lo recibe el pic por que puede ser?
para saber si llegaba el bit le agrege

LUZ4 bsf PORTA,1
         clrf DATORX
         retfie
otra cosa que me pasa es como hago para que cada ves que entra un byte determinado cambie el estado de un puerto ej PORTA,0   
Título: RE: RECEPCION DE UN BYTE
Publicado por: maunix en 27 de Febrero de 2006, 16:34:00
Escrito originalmente por nacha4
hola muchas gracias por el programa anda muy bien, tengo una duda porque envio el byte desde la PC con un programa en Visual Basic el Byte lo envia cada ves que hago un click a un boton pero no siempre lo recibe el pic por que puede ser?
para saber si llegaba el bit le agrege

LUZ4 bsf PORTA,1
         clrf DATORX
         retfie



No es necesario que borres lo que hay en DATORX ya que nunca lo usas y además el proximo byte que leas habrás sobreescrito su contenido.
Lo de que no te salga nada, es raro ya que lo tienes como salida y has apagado los comparadores... tal vez no llegue lo que tu crees que llega!

Lo de que llega o no llega..... digamos que ahí ya no puedo ser adivino.  Tu problema también podria estar en el código en visual basic...

Con respecto a que no enciende el led, tal vez con el visual basic tu envias un "1" (el caracter ascii 1) y en el pic estas comparando por el 11h, es decir el 17d que es un caracter de control.  Si quieres enviar el "1" en ascii, deberás comparar con el 49d

Escrito originalmente por nacha4

otra cosa que me pasa es como hago para que cada ves que entra un byte determinado cambie el estado de un puerto ej PORTA,0   


Para eso antes debes guardar el estado previo del PORTA o bien, hacer

Codigo:

   btfsc   PORTA,0
   goto   _BORRAA0

_ENCIENDE0
   bsf   PORTA,0
   retfie

_BORRAA0:
   bcf   PORTA,0
   retfie




Saludos
Título: RE: RECEPCION DE UN BYTE
Publicado por: nacha4 en 27 de Febrero de 2006, 17:11:00
gracias por tanta paciencia que me tenes ante todo, lo que se envia por el VB es un byte ya esta arreglado el tema del codigo ascii, el problema entonces vos me decis que debe ser del VB porque en el programita de VB cada ves que oprimo el boton sale el byte pero es como que habeces llega y otras veces no
Título: RE: RECEPCION DE UN BYTE
Publicado por: nacha4 en 27 de Febrero de 2006, 17:50:00
puede llegar a ser que lo estoy probando en un protoboer (experimentor) y que genere ruido porque por ahi recibe y por ahi no
Título: RE: RECEPCION DE UN BYTE
Publicado por: maunix en 27 de Febrero de 2006, 20:39:00
Escrito originalmente por nacha4
puede llegar a ser que lo estoy probando en un protoboer (experimentor) y que genere ruido porque por ahi recibe y por ahi no


No creo... he hecho mil experimentos con protoboards a 57600 y a 115200 y me anduvieron bien.  Eso sí, si habia algun problema seguro que era un cable flojo pero no era el protoboard en sí.

Tienes un osciloscopio?  Yo que tu miraría por ese lado a ver si realmente salen los datos y podrías incluso ver QUE datos salen!  Segun tu código si agregas esas lineas a LUZ4 lo que ocurrirá es que el led irá cambiando de color cada vez que llegue un byte a 11h.  Seguro solucionaste el problema del ASCII??  Estas segura de que mandas un caracter 11h y no otra cosa?

Te digo porque he estado involucrado en proyectos con gente que programaba en Visual Basic y me ha costado horrores hacerles comprender la diferencia entre lo que es un 11h y lo que son dos ascii "1""1" ,  que en la pantalla los ven como 11.


Porque no te la simplificas? Porque en vez de comparar con 11h, no comparas con 40h? es el caracter "A" y mandas una A con el VBasic y así podrás tener mayor tranquilidad.


Saludos

Título: RE: RECEPCION DE UN BYTE
Publicado por: nacha4 en 27 de Febrero de 2006, 23:13:00
Hola aca de nuevo hice lo que me digiste y sigue funcionando igual es como que habeces  llega el BYTE y habeses no, que puede estar funcionando mal, puede ser el MAX 232?, el programa del PIC (no creo) el VBasic (tampoco creo es muy sencillo oprimo el boton y sale el BYTE) lo puse todo en un experimentar de plaqueta (los que se sueldan) y sigue igual.
Título: RE: RECEPCION DE UN BYTE
Publicado por: nacha4 en 27 de Febrero de 2006, 23:39:00
hola encontre un programa se llama Siow y envia los datos en hex y sigue pasando lo mismo ya no se que puede ser, otra cosa que probe fue puentiar el TX con el RX y anda joya el programa que hice y el programa Siow, queda nada mas que el programa del PIC que puede ser?
Título: RE: RECEPCION DE UN BYTE
Publicado por: maunix en 28 de Febrero de 2006, 05:11:00
Escrito originalmente por nacha4
hola encontre un programa se llama Siow y envia los datos en hex y sigue pasando lo mismo ya no se que puede ser, otra cosa que probe fue puentiar el TX con el RX y anda joya el programa que hice y el programa Siow, queda nada mas que el programa del PIC que puede ser?


Todo es posible aunque el programa de PIC parece bastante simple.  Acá no tengo el fuente donde ese ejemplo, lo tengo en mi casa como para no tener que tipear todo de nuevo y acomodarlo.

De todas formas, que recibes con el siow? Porque el siow muestra datos en ascii y en hexa, podrias pegar la pantalla de que recibes con el siow?

Otra cosa que podríamos hacer, más simple, sería un software de ECO.  En el max232 tu cableas el GND del puerto serie al GND de tu placa? Es el pin 5 del db9 del RS232 de tu pc.

Título: RE: RECEPCION DE UN BYTE
Publicado por: nacha4 en 28 de Febrero de 2006, 08:57:00
lo que envia y recibe con el Siow es siempre en HEX y lo de GND si lo tengo asi tambien pense en eso
Título: RE: RECEPCION DE UN BYTE
Publicado por: maunix en 28 de Febrero de 2006, 12:46:00
Escrito originalmente por nacha4
lo que envia y recibe con el Siow es siempre en HEX y lo de GND si lo tengo asi tambien pense en eso


Antes de ir a mi casa a revisar el código, quisiera preguntarte lo siguiente

1) Que modelo exacto de pic es? Fijate en el encapsulado y transcribelo exactamente.
2) Que cristal estas utilizando?
3) Con que configuration bits programas el microcontrolador?
4) Que baudeaje deseas utilizar?
5) Tienes osciloscopio?? Si es así, has medido que llega puntualmente al pic?


Saludos

Título: RE: RECEPCION DE UN BYTE
Publicado por: nacha4 en 28 de Febrero de 2006, 15:01:00
te respondo las preguntas:

1) PIC16F628A
abajo dice -I/P un circulo con un 83 adentro (me parece porque es muy chiquito)
2) Uno de 4 MHz en el cristal dice D400L7I
3) esa parte la configuraste vos en el programa
                movlw    b"00100100"
   movwf   TXSTA
en el VBasic es 9600,n,8,1
4) 9600 baudios
5) no tengo osciloscopio
Título: RE: RECEPCION DE UN BYTE
Publicado por: nacha4 en 28 de Febrero de 2006, 18:27:00
me figura como que contestaste pero no aparece nada
Nacha4
Título: RE: RECEPCION DE UN BYTE
Publicado por: maunix en 28 de Febrero de 2006, 19:01:00
Escrito originalmente por nacha4
me figura como que contestaste pero no aparece nada
Nacha4


Asi es, el maldito foro se comió mi post!
Ahi va de nuevo.

Aqui te puse un código que cambia levemente de tu codigo a su vez modificado por mi jeje.   Este código leera los datos recibidos por la USART y hará titilar un LED ubicado en el PORTA<0> por cada dato recibido (ya sea bien o mal).  Recibirá a 9600bps, con Cristal de 4Mhz.

Además permite manejar el error de overrun por cualquier eventualidad.

El error de framing se elimina al leer el dato del RCREG.

Quisiera además pedirte que postees como configuras los Configuration Bits a la hora de grabar tu microcontrolador.  Es importante ya que esto podria hacer resetear a tu pic.


Codigo:

   LIST P=16F628
   Radix HEX
   #Include <P16F628.inc>

   
DATORX equ 0x70 ;dato a recibido
FLAG_AUX equ 0x71   ;registro auxiliar para saber si debo prender o apagar el led

   ORG 0
   goto   INICIO
   ORG 4
RSI:
   movf   RCREG,w   ;mueve entrada a W
   movwf   DATORX   ;Mueve la entrada a DATORX

   btfsc   FLAG_AUX,0
   goto   APAGALED
ENCIENDELED:
   bsf   PORTA,0
   bsf   FLAG_AUX,0
   goto   CHEQUEO

APAGALED:
   bcf   PORTA,0
   bcf   FLAG_AUX,0

CHEQUEO:
   retfie



INICIO
   bcf   STATUS,RP0   ;banco 0
   bcf   STATUS,RP1

   movlw    b"01000000"    ;Habilito El PEIE
   movwf   INTCON

   movlw   .7
   movwf   CMCON

   bsf    STATUS,RP0   ;Banco 1

   movlw   b"11100010"   ;RB1 enntrada resto salida modificar las entradas y salida menos rb1,rb2
   movwf   TRISB    ;EEESSSES
   movlw   b"11110000"   ;EEEESSSS
   movwf   TRISA

   movlw    b"00000100"   ;No enciendo TX Usart porque ahora no se usará
   movwf   TXSTA    ;BRGH = 1

   movlw    b"00100000"
   movwf   PIE1

   bcf    STATUS,RP0
   movlw    b"10000000"   ;habilito el puerto serie en modo continuo
   movwf   RCSTA

   movlw   d"25"   ;se configura SPBRG de 9600 baudios #4Mhz - BRGH=1
   movwf   SPBRG

   clrf   FLAG_AUX
   bsf   RCSTA,CREN   ;Habilito recepcion de usart
   bsf   INTCON,GIE   ;habilito interrupciones grales

BUCLE:
   GOTO   BUCLE    ;bucle infinito


   end




Luego comentame los resultados.  Si esto funciona sería importante que cablees tambien todo lo relativo a TX para ver si la pc recibe algo.

Luego haremos un software de "eco" que retransmita lo que recibe.

Saludos


Título: RE: RECEPCION DE UN BYTE
Publicado por: nacha4 en 28 de Febrero de 2006, 23:02:00
hola aca estoy despues de probar sigue funcionando igual que antes digamos enciende el led algunas veces y habeses ni se entera, lo que paso es algo estraño, cuando lo puse tenia puesto led en RA1 y en RB0 y se encendieron apenas le di tension y otra cosa le corto la tencion y cuiando se la pongo de nuevo sigue encendido el led si habia estado encendido cuando lo page, puede estar cagado el PIC?
Título: RE: RECEPCION DE UN BYTE
Publicado por: maunix en 01 de Marzo de 2006, 12:34:00
Escrito originalmente por nacha4
muchisimas gracias ahora lo voy a probarlo y te cuento
los configuradores bits que dejo tildados son MCLR, BODEN y LVP



LVP ? para que usas el LVP??? Si lo programas convencionalmente el LVP lo debes desactivar.

MCLR? Podrias postear como es tu circuito de reset? O mejor aún, el circuito general de lo que estas armando?

Respecto a los problemas que has tenido, releí mucho tu parrafo, y la verdad no entiendo nada, podrias exponer tu problea mas claramente? Digamos, explicando paso a paso que te ha ido ocurriendo?  

Título: RE: RECEPCION DE UN BYTE
Publicado por: nacha4 en 01 de Marzo de 2006, 13:09:00
hola ya encontre el problema es que el vendedor me vendio un 16F628 de 20 Mhz en ves de uno de 4 Mhz como yo le habia pedio, modifique en el programa
movlw d"25"
movwf SPBRG

por

movlw d"129"
movwf SPBRG
y enciende y apaga el led puesto en RA0 caundo recibe un BYTE, lo que no me entendiste es que tengo puesto un led en RA1 y cuando prendo el PIC se prende ese led y en el programa yo no pongo que haga nada.
para trasmitir lo que tengo que cambiar es

movlw b"00000100"
movwf TXSTA

por

movlw b"00100100
movwf TXSTA

Desde ya muchisimas gracias por la cantidad de ayuda que me as dado voy a estar eternamente agradecido  vos
Título: RE: RECEPCION DE UN BYTE
Publicado por: maunix en 01 de Marzo de 2006, 15:39:00
Escrito originalmente por nacha4
hola ya encontre el problema es que el vendedor me vendio un 16F628 de 20 Mhz en ves de uno de 4 Mhz como yo le habia pedio, modifique en el programa
movlw d"25"
movwf SPBRG

por

movlw d"129"
movwf SPBRG
y enciende y apaga el led puesto en RA0 caundo recibe un BYTE, lo que no me entendiste es que tengo puesto un led en RA1 y cuando prendo el PIC se prende ese led y en el programa yo no pongo que haga nada.
para trasmitir lo que tengo que cambiar es

movlw b"00000100"
movwf TXSTA

por

movlw b"00100100
movwf TXSTA

Desde ya muchisimas gracias por la cantidad de ayuda que me as dado voy a estar eternamente agradecido  vos


Me alegro que hayas solucionado tu problema.  Exactamente eso es lo que tienes que cambiar.

Lo del modelo no me quedo muy claro porque los pics esos, andan a 4Mhz por defecto con oscilador interno o a 20Mhz (los modelo I) pero para eso les tenes que poner un cristal externo.  En fin, no me quedó claro pero si te funciona me alegro.

Saludos y hasta la proxima.
Título: RE: RECEPCION DE UN BYTE
Publicado por: nacha4 en 01 de Marzo de 2006, 17:07:00
tengo otro inconveniente cuando modifico un poco el programa ya no anda te podes fijar que hice mal

LIST P=16F628
   Radix HEX
   #Include <P16F628.inc>

   
DATORX equ 0x70 ;dato a recibido
FLAG_AUX equ 0x71   ;registro auxiliar para saber si debo prender o apagar el led

   ORG 0
   goto   INICIO
   ORG 4
RSI
   movf   RCREG,w   ;mueve entrada a W
   movwf   DATORX   ;Mueve la entrada a DATORX
   btfsc     FLAG_AUX,1
   GOTO   enced
   GOTO    apag
   andlw   0xF0       ;Comprueba si las 4 bit mas significativos
   sublw    b"10010000"   ;Modificar para los siguientes pics
   btfsc   STATUS,Z
   goto   PIC
   retfie         
PIC
   movf   DATORX,w
   andlw   0x0F
   sublw   b"00000001"
   btfsc   STATUS,Z
   goto   LUZ4
   movf   DATORX,w
   andlw   0x0F
   sublw   b"00000010"
   btfsc   STATUS,Z
   goto   LUZ5
   movf   DATORX,w
   andlw   0x0F
   sublw   b"00000011"
   btfsc   STATUS,Z
   goto   LUZ5
   movf   DATORX,w
   andlw   0x0F
   sublw   b"00000100"
   btfsc   STATUS,Z
   goto   enviar
   retfie         

LUZ4
   btfsc   FLAG_AUX,0
   goto   APAGALED
ENCIENDELED
   bsf   PORTA,0
   bsf   FLAG_AUX,0
   retfie
APAGALED
   bcf   PORTA,0
   bcf   FLAG_AUX,0
   retfie
LUZ5
   bsf   PORTA,1
   retfie
LUZ6
   bcf   PORTA,1
   retfie
enviar
   movlw b"01000000"   ;Envio dato a la PC que esta en OFF
   movwf TXREG
   BSF STATUS,5
   BCF STATUS,6
   GOTO TX_DAT
TX_DAT
   BTFSS TXSTA,1
   GOTO TX_DAT
   BCF STATUS,5
   retfie   
INICIO
   bcf   STATUS,RP0   ;banco 0
   bcf   STATUS,RP1

   movlw    b"01000000"    ;Habilito El PEIE
   movwf   INTCON

   movlw   .7
   movwf   CMCON

   bsf    STATUS,RP0   ;Banco 1

   movlw   b"11100010"   ;RB1 enntrada resto salida modificar las entradas y salida menos rb1,rb2
   movwf   TRISB    ;EEESSSES
   movlw   b"11110000"   ;EEEESSSS
   movwf   TRISA

   movlw    b"00100100"   ;No enciendo TX Usart porque ahora no se usará
   movwf   TXSTA    ;BRGH = 1

   movlw    b"00100000"
   movwf   PIE1

   bcf    STATUS,RP0
   movlw    b"10000000"   ;habilito el puerto serie en modo continuo
   movwf   RCSTA

   movlw   d"129"   ;se configura SPBRG de 9600 baudios #4Mhz - BRGH=1
   movwf   SPBRG

   clrf   FLAG_AUX
   bsf   RCSTA,CREN   ;Habilito recepcion de usart
   bsf   INTCON,GIE   ;habilito interrupciones grales

BUCLE:
   GOTO   BUCLE    ;bucle infinito


   end

y con respecto al bits de configuracion los puse todos desabilitados eso puede ser un error?
Título: RE: RECEPCION DE UN BYTE
Publicado por: maunix en 02 de Marzo de 2006, 12:12:00
Escrito originalmente por nacha4
tengo otro inconveniente cuando modifico un poco el programa ya no anda te podes fijar que hice mal




1) No se que es lo que hace mal porque no se que es lo que quieres hacer con tu "nuevo" software. Puedo poner buena voluntad, pero tampoco soy adivino.

2) Usa el programa que si andaba y ve agregando cosas poco a poco a ver si te sigue funcionando.

Escrito originalmente por nacha4

y con respecto al bits de configuracion los puse todos desabilitados eso puede ser un error?


Dificil saber si no indicas con mas precisión tu problema , y cuales son los bits que configuraste y como los configuraste...

Título: RE: RECEPCION DE UN BYTE
Publicado por: nacha4 en 03 de Marzo de 2006, 18:12:00
Hola te paso a contar que quiero que haga el PIC lo le envio un Byte que comprueve los 4 bits mas significativos si son igules a los bits que yo pongo (ej 1001) que pase a controlar los 4 menos significativos, segun a cual son iguales que haga determinadas cosas (ej 0001 que encienda un led en RA0, 0010 encienda led en RA1) espero que entiendas lo que quiero hacer pero con mi programa no lo hace
espero tu ayuda desde ya muchas gracias
Título: RE: RECEPCION DE UN BYTE
Publicado por: maunix en 03 de Marzo de 2006, 21:35:00
Yo te podría resolver el problema y el programa pero si lo hago no aprenderás nada.

Creo que debieras poner algo más de esfuerzo en  entender porqué no funciona tu software!

Fijate esto que has puesto:

Codigo:

movf RCREG,w ;mueve entrada a W
movwf DATORX ;Mueve la entrada a DATORX
btfsc FLAG_AUX,1
GOTO enced
GOTO apag




Aqui haces lo siguiente
1) lees el dato del RCREG
2) lo guardas en DATORX
3) Verificas el estado del FLAG Auxiliar y en función de eso apagas o enciendes el LED yendo a las rutinas encend y apag. Las cuales a su vez tienen luego un RETFIE que hacen retornar de la subrutina

Es decir que NUNCA pasaran por la rutina de chequeo de si el nibble superior y/o in ferior son iguales a lo que tu comparas.

Debes primero, no haber insertado esas lineas en donde las insertaste,  debes dejar que se complete toda la rutina de encendido y / o apagado del led, esas rutinas no deben tener un RETFIE sino que deben ir a la rutina que compara si el nibble inferior o superior son iguales a lo comparado.  Recien ahí haces el RETFIE

No te hago yo el código porque quiero que pongas un poco de atención y dedicación en lo que haces y no te vendría mal "simular" el proceso

Postea tu resultados y veré de seguir ayudandote.

Saludos
Título: RE: RECEPCION DE UN BYTE
Publicado por: Chaly29 en 04 de Marzo de 2006, 06:37:00
Hola nacha4, acá que dejo el firmware completo, debería funcionar bien:

Codigo:
;---------------Encabezado--------------------------------------------------------------------------

   LIST      P = 16F628A
   INCLUDE      <P16F628A.INC>

;------------Configuración de bits------------------------------------------------------------------
   __CONFIG   _BODEN_OFF&_BOREN_OFF&_CP_OFF&_DATA_CP_OFF&_PWRTE_OFF&_WDT_OFF&_LVP_OFF&_MCLRE_OFF&_XT_OSC

;   Frecuencia del cuarzo (oscilador del PIC) de 4 Mhz
;   Transmición a 9600 Baud asíncrono (9600,8 ,N, 1) 8 bits datos, sin paridad y 1 bit de stop

;------------Definicion de la RAM-------------------------------------------------------------------

WWW      EQU   .32
ESTADO      EQU   .33
DATORX      EQU   .34

;---------------------------------------------------------------------------------------------------
   ORG   .0      ; vector de RESET
   goto   INICIO      ;
   ORG   .4      ; vector de INTERRUPCION
   goto   RSI      ;

;---------------------------------------------------------------------------------------------------
RSI
   movwf   WWW       ;
   swapf   STATUS,W      ; esto es necesario para no perder datos
   movwf   ESTADO      ; cuando se produce la interrupccion    

   movf   RCREG,w      ; mueve entrada a W
   movwf   DATORX      ; mueve la entrada a DATORX
   andlw   B"11110000"
   sublw   B"10010000"   ; comprueba los mas significativos
   btfss   STATUS,Z
   goto   SALIR      ; si los mas significativos no correspondes sale de la interrupcion

   movf   DATORX,W
   andlw   B"00001111"
   movwf   DATORX
   incf   DATORX,W
   addwf   PCL,F
   nop
   goto   RUT_0
   goto   RUT_1
   goto   RUT_2
   goto   RUT_3
   goto   RUT_4
   goto   RUT_5
   goto   RUT_6
   goto   RUT_7
   goto   RUT_8
   goto   RUT_9
   goto   RUT_10
   goto   RUT_11
   goto   RUT_12
   goto   RUT_13
   goto   RUT_14
   goto   RUT_15
RUT_0
   bsf   PORTA,1      ;FUNCION A REALIZAR EN EL CASO DE RECIBIR "XXXX0000"
   goto   SALIR
RUT_1
            ;FUNCION A REALIZAR EN EL CASO DE RECIBIR "XXXX0001"
   goto   SALIR
RUT_2
            ;FUNCION A REALIZAR EN EL CASO DE RECIBIR "XXXX0010"
   goto   SALIR
RUT_3
            ;FUNCION A REALIZAR EN EL CASO DE RECIBIR "XXXX0011"
   goto   SALIR
RUT_4
            ;FUNCION A REALIZAR EN EL CASO DE RECIBIR "XXXX0100"
   goto   SALIR
RUT_5
            ;FUNCION A REALIZAR EN EL CASO DE RECIBIR "XXXX0101"
   goto   SALIR
RUT_6
            ;FUNCION A REALIZAR EN EL CASO DE RECIBIR "XXXX0110"
   goto   SALIR
RUT_7
            ;FUNCION A REALIZAR EN EL CASO DE RECIBIR "XXXX0111"
   goto   SALIR
RUT_8
            ;FUNCION A REALIZAR EN EL CASO DE RECIBIR "XXXX1000"
   goto   SALIR
RUT_9
            ;FUNCION A REALIZAR EN EL CASO DE RECIBIR "XXXX1001"
   goto   SALIR
RUT_10
            ;FUNCION A REALIZAR EN EL CASO DE RECIBIR "XXXX1010"
   goto   SALIR
RUT_11
            ;FUNCION A REALIZAR EN EL CASO DE RECIBIR "XXXX1011"
   goto   SALIR
RUT_12
            ;FUNCION A REALIZAR EN EL CASO DE RECIBIR "XXXX1100"
   goto   SALIR
RUT_13
            ;FUNCION A REALIZAR EN EL CASO DE RECIBIR "XXXX1101"
   goto   SALIR
RUT_14
            ;FUNCION A REALIZAR EN EL CASO DE RECIBIR "XXXX1110"
   goto   SALIR
RUT_15
            ;FUNCION A REALIZAR EN EL CASO DE RECIBIR "XXXX1111"
SALIR
   swapf   ESTADO,W   ;
   movwf   STATUS      ; esto es necesario para no perder datos
   swapf   WWW,F      ; cuando se produce la interrupccion
   swapf   WWW,W      ;
   retfie

;---------------------------------------------------------------------------------------------------
INICIO
   bcf   STATUS,RP0   ; banco 0
   bcf   STATUS,RP1

   clrf   PORTA      ; limpio el puerto A
   clrf   PORTB      ; limpio el puerto B

   movlw   .7
   movwf   CMCON
   bsf   STATUS,RP0   ; banco 1
   movlw   B"11110000"   ; EEEESSSS
   movwf   TRISA
   movlw   B"11100010"   ; RB1 enntrada resto salida modificar las entradas y salida menos rb1,rb2
   movwf   TRISB      ; EEESSSES
   movlw   B"00100000"
   movwf   PIE1
   movlw   B"00100100"
   movwf   TXSTA
   movlw   .25
   movwf   SPBRG
   bcf   STATUS,RP0

   movlw   B"11000000"
   movwf   INTCON
   movlw   B"10010000"
   movwf   RCSTA

   goto   $      ; bucle infinito

;---------------------------------------------------------------------------------------------------
   END


Donde dice FUNCION A REALIZAR... le colocas la rutina que deseas para cada valor de los 4 bits menos significativos.

Para reconocer una transmisión valida e usado B"1001" para los 4 bits mas significativos.

Espero te sea de utilidad.

Una saludo y suerte.

Atte. CARLOS

Título: RE: RECEPCION DE UN BYTE
Publicado por: Chaly29 en 04 de Marzo de 2006, 07:38:00
Hola nacha4, el firmware que e posteado solo debes compilarlo con el MPLAB abrir el .hex con el programa quemador sin setear nada en este y programar el PIC, como puedes ver la configuración de los osciladores y demás ya esta incluida en el .asm

Este firmware es para un cuarzo de 4 MHz, para que funcione de manera correcta con uno de 20 MHz debes cambiar lo siguiente:

Codigo:
   __CONFIG   _BODEN_OFF&_BOREN_OFF&_CP_OFF&_DATA_CP_OFF&_PWRTE_OFF&_WDT_OFF&_LVP_OFF&_MCLRE_OFF&_HS_OSC


   movlw   .129
   movwf   SPBRG


Si tú PIC es un 16F628 en ves del 16F628A para el cual esta echo este programa solo debes cambiar esto:

Codigo:
   LIST      P = 16F628
   INCLUDE      <P16F628.INC>


Por la configuración del USART esa es la que actualmente tengo en uso en un proyecto y anda bien, y la interrupción simulándola en el MPLAB anda de manera correcta.

Cualquier duda solo pregunta.

Espero te sea de ayuda.

Un saludo

Atte. CARLOS

Título: RE: RECEPCION DE UN BYTE
Publicado por: maunix en 04 de Marzo de 2006, 07:48:00
Carlos, si bien tus intenciones son buenas, como sé que lo son, yo no le quise postear el código corregido del anterior porque al primer código que yo hice le agregó lineas que no hacian lo que se pretendia.

Entonces me di cuenta que postearle el código no le estaba ayudando, ya que no prestaba atención al código en sí ni a lo que estaba haciendo.

Tu código si bien funciona bien es "otro" código y creo que tal vez caiga en el mismo problema que el mío en que lo quiera modificar y no ande nada, simplemente porque no lo entiende.

Es por eso que le extraje una pequeña porción de su código para que pueda hilar donde está el error y "darse cuenta".

Al menos mi idea de un foro no es solamente postear códigos sino enseñar y mostrar el error para que no se vuelva a repetir.  


Saludos Carlos y nacha4 a hacer los deberes!!
Título: RE: RECEPCION DE UN BYTE
Publicado por: Chaly29 en 04 de Marzo de 2006, 08:05:00
Hola maunix, tendre en cuenta tu comentario.

Un saludo.