TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: 25javier en 18 de Enero de 2005, 10:07:00
-
Hola listeros,estoy tratando de comunicar dos 16f628 como master/slave con address deteccion,la idea es despues poner mas 16f628 como esclavos y el master elija con cual se quiere comunicar...pero no logro ni detectar el envio de los 9 bits...hasta cargue el ejemplo de leager(gracias viejo!!)y no hay caso,me queda la duda de que en los esclavos leager no seteo la velocidad porque se supone que la fija el master pero en la hoja de datos dice que hay que setearla a BHRG-(page 80 ds,setting upn 9 bit mode with address detect)
ahi va el codigo
MASTER
CONFIG BODEN_OFF,CP_OFF,PWRTE_OFF,WDT_OFF,LVP_On,MCLRE_OFF,INTRC_OSC_NOCLKOUT
DEVICE = 16F628A "master
CMCON=7
trisb.2=0
trisb.1=1
trisb.0=1 "boton para envio de dato
trisb.3=0
trisb.5=0
SPBRG = 103
TXSTA= %11110001 "asincrono mode master,9 bit transmision,trasnmit enabled,seteo TX9D(txsta.0)=1=9 no bit!!!
RCSTA=%10000000
Symbol LED = PORTB.3
dim B1 as byte
LED=0
LAZO: IF PORTB.0=0 THEN
led=1
delayms 1000
led=0
delayms 1000
B1="@"
GOSUB PutChar
ELSE
GOTO LAZO
ENDIF
GOTO LAZO
GetChar: B1 = 0 " Preset to no character received
If PIR1.5 = 1 Then B1 = RCREG " If receive flag then get character
Return " Go back to caller
" Send a character to the USART transmitter
PutChar: If PIR1.4 = 0 Then PutChar " Wait for transmit register empty
TXREG = B1 " Send character to transmit register
Return
END
*****************************************************************
ESCLAVO
CONFIG BODEN_OFF,CP_OFF,PWRTE_OFF,WDT_OFF,LVP_On,MCLRE_OFF,INTRC_OSC_NOCLKOUT
DEVICE = 16F628A "slave
CMCON=7
trisb.2=0
trisb.1=1
trisb.0=1
trisb.3=0
trisb.5=0
RCSTA = %11111000 "9 BITS ENABLED,ENABLE ADDRESS DETECTION,
TXSTA = %00110000
Symbol LED = PORTB.3
dim B1 as byte
dim i as byte
LED=0
delayms 1000
led=1
delayms 1000
led=0
delayms 1000
LAZO: if rcsta.0=1 then "VEO SI RECIBI EL 9NO BIT!!!
led=1
delayms 100
led=0
delayms 100
rcsta.0=0
else
goto lazo
"*****************************************************************
-
Que onda javier25,
Bueno el ejemplo que postee utiliza una recepcion sincronizada SIN deteccion de direccion(sin habilitar el 9° bit{RX9}), no la que tu requieres( con el 9° bit),por tanto el ejemplo que di "no requiere" que se determine la velocidad de recepcion esclavo.
En tu caso,el modo con deteccion de direccion(a 9 bits) asincrono,requiere lo siguiente:
1)Inisializar el registro SPBRGH al a velocidad apropiada, si es una alta velocidad usar el modo BRGH seteado a 1(BRGH=1) y dependiendo del cristal y del porcentaje de error.(En modelos 16f628A, pag.75 para ver este modo,sus velocidades y % de error correspondientes.)
2)Habilitar la comunicacion asincrona o sincrona seteando o limpiando el registro TXSTA.4 y habilitando el puerto con RCSTA.7=1.
3)Si las interrupciones se usan, habilitar el PIE1.5 .
4)Setear la recepcion del noveno bit RCSTA.6 y habilitar la deteccion de direccion RCSTA.3=1 .
5)Habilitar la recepcion habilitando el RCSTA.5(recepcion sencilla) o RCSTA.4(recepcion continua)
6)Cuando la recepcion se haya completado elregisto que no los informara es el el de interrupcion(PIR1.5=1, solo si se habilito la interrupcion.....)
7) se leen los 8 bits con el registro RCREG para determinar si el registro sera direccionado.en caso de algun error, se limpia el RCSTA.4. Si a sido direccionado. se limpia el registro RCSTA.3 y el PIR1.5(bandera de interrupcion) para permitir leer los bytes de datos y bytes de direcciones dentro del buffer recivido e interrumpir el MCU.
Por lo que veo en tu codigo no haces el CHEKEO correcto del flag de interrupcion:
LAZO: if rcsta.0=1 then "VEO SI RECIBI EL 9NO BIT!!! <--- aui no se que estas revizando, si este registro SOLO guarda el 9° bit RECIVIDO.
Acuerdate cual es el proceso a seguir , el transmisor(maestro) tiene que transmitir una cantidad de informacion a VARIOs esclavos, por tanto este primero tiene que enviar un byte de direccion(direccionamiento a esclavo, ..) este es identificado poniendo el 9° bit de esta informacion a 1 logico(por tanto cuando sucede la interrupcion,si es que la habilitaste, el primer byte+1 bit es recivido y y revizado para ver si es la direccion{esta a 1} o a cero si es DATA, en tal caso es ignorado) ,Solo si tienes habilitado de forma correcta el esclavo el bit 3 y el 6 del registro RCSTA(deteccion de direccion y habilitacion del 9° bit),por tanto ignorara todos los bytes de data. Pero en caso de que no sea data(bit cero de rcsta) y sea direccion(RCSTA.0=1) SURGIRA la interrupcion en el esclavo indicando que se a recivido un byte de direccion y el contenido sera transferido al buffer del modulo,.El esclavo direccionado limpiara el bit 3 del registro RCSTA y se preparara para recivir los bytes de data del Maestro!.
Todo esto viene prefectamente explicado en el DS
Esto es basicamente el formato, si aun sigues con problemas, no dudes en postearlo y con gusto te ayudamos .
Salu2 pana
Lager
-
anda todo 10 puntos!

un abrazo lager!!
Javier
-
No hay nada que agradecer pana
resolviste tu problema eso es lo unico que cuenta 
Un abrazo pana