TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: escalera en 30 de Julio de 2012, 12:18:55
-
Hola, no se si alguien pueda ayudarme tengo un problema, quiero comunicar 2 PIC, uno de ellos que es un 16F1827 maneja un contador de pulsaciones y el display, ademas de tener multiplexados 4 botones a la pata MCLR controlados con un 74LS145, los botones hice una rutina que funciona bien hasta ahora, siempre y cuando no oprima 2 botones a la vez porque sino el PIC se reseta, el otro PIC es un 12F1822, esta conectado a un DS1302, el cual ya programe para la lectura del reloj en modo BURST, para el que quiera ese algoritmo ahorita lo pongo aqui, ambos micros estan conectados por 2 patas, una es el MCLR del PIC 2 a PORTB,2; esa la quiero usar como si fuese de control para envio y recepcion por la otra pata que quiero usar; la otra pata esta conectada de RA1(12F1822) a RB1(16F1827), ambas patas son RC, a que quiero llegar?, quiero saber si podrian orientarme porque quiero hacer una rutina de envio de datos y que UART leea esa informacion y la guarde en el registro RCREG; hice unas rutinas y ambos se supone estaran a 9600 baudios de recepcion y la rutina "maneja"(segun) 9600 baudios, pero al simular en proteus, RCREG se llena con "FF" por lo que los datos del DS1302 no se envian, alguien puede orientarme?
PD. Ambos PIC estan a velocidad de 4Mhz y es con FOSC interno; y no puedo mandar la señal por las patas TX, tiene que ser por la misma pata la recepcion y transmision y controlar cuando seran entradas o salidas mediante una interrupcion de MCLR del PIC12F1822
Rutina DS1302 (la adjunto porque veo que muchos la buscan y yo la busque en internet y no vi informacion asi que diseñe esta rutina y funciona en proteus, aun no lo veo fisico ya que no puedo hacer la conexion de los PIC)
LEERCLOCK
BCF INTCON,GIE
MOVLW 0x22
MOVWF FSR0
BSF PORTA,5 ;CE
MOVLW 0xBF
MOVWF OUTCLOCK
CALL ENVIRELOJ
CALL RECIRELOJ
INCF FSR0,F
CALL RECIRELOJ
INCF FSR0,F
CALL RECIRELOJ
INCF FSR0,F
CALL RECIRELOJ
INCF FSR0,F
CALL RECIRELOJ
INCF FSR0,F
CALL RECIRELOJ
INCF FSR0,F
CALL RECIRELOJ
BCF PORTA,5 ;CE
BCF PORTA,2
BSF INTCON,GIE
RETURN
ENVIRELOJ
MOVLB 0x01
BCF PORTA,4 ;I/O
CLRF BSR
MOVLW 0x08
MOVWF COUNTBIT
ENVIANREL
BCF PORTA,2
BCF STATUS,C
RRF OUTCLOCK,F
BCF PORTA,4
BTFSC STATUS,C
BSF PORTA,4 ;I/O
BSF PORTA,2 ;SCLK
DECFSZ COUNTBIT,F
GOTO ENVIANREL
RETURN
RECIRELOJ
MOVLB 0x01
BSF PORTA,4
CLRF BSR
MOVLW 0x08
MOVWF COUNTBIT
RECIBIREL
BCF PORTA,2
BCF STATUS,C
BTFSC PORTA,4
BSF STATUS,C
BSF PORTA,2 ;SCLK
RRF INDF0,F
DECFSZ COUNTBIT,F
GOTO RECIBIREL
RETURN
-
Ya no, ya esta solucionado igual gracias, a los que busquen la forma de adaptarlo, usen proteus y su osciloscopio virtual para adaptar el envio del voltaje al ritmo del clock del pic, aqui les dejo el mio
;################################
DEBIT
MOVLW 0x50 ; PARA 9600 BAUDIOS / XTAL DE 4 MEGAZ HZ.
MOVWF CONTBAU
NOP
NOP
X02
NOP
NOP
DECFSZ CONTBAU,1
GOTO X02
RETLW 0x00
;***************************************************
TXRUTINA
BCF INTCON,GIE
NOP
NOP
BCF PORTA,1 ; START BITS
CALL DEBIT
MOVLW 08H ; SIETE BITS
MOVWF COUNTBIT
NOP
S7
RRF TXENV,1
BTFSS STATUS,C ; 0
GOTO S4 ; FUE CERO 1
BSF PORTA,1 ; FUE UNO 1
GOTO S5 ; 2
S4
BCF PORTA,1 ; 2
S5
CALL DEBIT ; DELAY ENTRE BITS 3
DECFSZ COUNTBIT,1
GOTO S7
BSF PORTA,1 ; STOP BITS
CALL DEBIT
NOENV
CLRF BSR
BSF INTCON,GIE
RETLW 0x00
;#########################################
-
NECESITO AYUDA!!! ALGUIEN PODRIA DECIRME PORQUE EN PROTEUS FUNCIONA Y EN FISICO NO FUNCIONA?, EL PROGRAMA NO INICIA, ES COMO SI NO UBIERA COMUNICACION :/
-
Adivinos no somos, así que sería bueno que muestres la configuración de fuses, el esquema, etc ;-)
Y respecta las normas del foro, no escribas en mayúscula.
Saludos!
-
Bueno una disculpa por lo de las mayusculas :D, bueno los fuses los tengo de la siguiente manera
__config _CONFIG1, _FCMEN_OFF & _CLKOUTEN_OFF & _IESO_OFF & _BOREN_ON & _CPD_ON & _CP_ON & _MCLRE_OFF & _PWRTE_ON & _WDTE_OFF & _FOSC_INTOSC;XT
__config _CONFIG2, _LVP_OFF & _WRT_OFF
en la configuracion la puse de la siguiente manera
BSF BSR,0 ; !!Bank Register-Bank(0/1)-Select
MOVLW 0x68 ; b'01100110' d'102' "f"
MOVWF OSCCON ; !!Bank!! TMR1H - OSCCON - EEADRH - Unimplemented
CLRF BSR
CLRF FSR0
CLRF PORTA ; !!Bank!! PORTA - TRISA - WDTCON - SRCON
MOVLW 0x06
MOVWF PORTB ; !!Bank!! PORTB - TRISB - PORTB - TRISB
BSF BSR,0 ; !!Bank Register-Bank(0/1)-Select
MOVLW 0x06 ; b'00000110' d'006'
MOVWF ADCON1 ; !!Bank!! ADCON0 - ADCON1 - RAM - RAM
MOVLB 0x02;CLRF OSCCON ; !!Bank Register-Bank(0/1)-Select
BANKSEL ANSELA ; !!Bank Register-Bank(0/1)-Select
CLRF ANSELA ; !!Bank!! Unimplemented - Unimplemented - CM2CON0 - ANSEL
CLRF ANSELB ; !!Bank!! PORTE - TRISE - CM2CON1 - ANSELH
BANKSEL WPUA
CLRF WPUA
CLRF WPUB
MOVLB 0x01 ; !!Bank Register-Bank(0/1)-Select
MOVLW 0x01 ; b'00000001' d'001'
MOVWF PORTB ; !!Bank!! PORTB - TRISB - PORTB - TRISB
MOVLW 0x20 ; b'01100000' d'096' "`"
MOVWF PORTA ; !!Bank!! PORTA - TRISA - WDTCON - SRCON
CLRF BSR
BSF PORTB,1
BSF PORTB,2
MOVLB 0x01
MOVLW 0x20
MOVWF PIE1
MOVLW 0x02 ; b'10000010' d'130'
MOVWF OPTION_REG ; !!Bank!! TMR0 - OPTION_REG - TMR0 - OPTION_REG
BANKSEL SPBRGL
MOVLW 0x19 ; b'00011001' d'025'
MOVWF SPBRGL ; !!Bank!! TXREG - SPBRG - RAM - RAM
BCF TXSTA,4 ; !!Bank!! RCSTA - TXSTA - RAM - RAM
CLRF BSR ; !!Bank Register-Bank(0/1)-Select
MOVLW 0x1B ; b'00011011' d'027'
MOVWF PR2 ; !!Bank!! T2CON - PR2 - RAM - RAM
MOVLW 0xF0
MOVWF INTCON
CLRF BSR
MOVLW 0x20
MOVWF FSR0
BCF INTCON,GIE
ERASEREG
CLRF INDF0
INCF FSR0,F
BTFSS FSR0,7
GOTO ERASEREG
CLRF TMR0
BCF INTCON,TMR0IF
BSF INTCON,GIE
MOVLW 0x06 ; b'01000000' d'064' "@"
MOVWF PORTB ; !!Bank!! PORTB - TRISB - PORTB - TRISB
BANKSEL RCSTA
BSF RCSTA,7 ; !!Bank!! RCSTA - TXSTA - RAM - RAM
BCF TXSTA,5
BSF RCSTA,4
BAUDER
BSF BAUDCON,4
BTFSS BAUDCON,4
GOTO BAUDER
CLRF BSR
y la rutina de envio es esta (la de recepcion es mediante UART)
;################################
ORG 0x0F00
;################################
DEBIT
MOVLW 0x50;12 ; PARA 9600 BAUDIOS / XTAL DE 4 MEGA HZ. (si pongo 0x50 en vez de 0x12, si funciona en proteus, pero en caso contrario recibe "00" ó "EF" ó "FE"
MOVWF CONTBAU
X02
CLRWDT
NOP
DECFSZ CONTBAU,1
GOTO X02
NOP
NOP
RETLW 00H
;***************************************************
TXRUTINA
BCF INTCON,GIE
BCF PORTB,1 ; START BITS
CALL DEBIT
MOVLW 08H ; SIETE BITS
MOVWF COUNTBIT
NOP
S7
RRF TXENV,1
BTFSS STATUS,C ; 0
GOTO S4 ; FUE CERO 1
BSF PORTB,1 ; FUE UNO 1
GOTO S5 ; 2
S4
BCF PORTB,1 ; 2
S5
CALL DEBIT ; DELAY ENTRE BITS 3
DECFSZ COUNTBIT,1
GOTO S7
BSF PORTB,1 ; STOP BITS
CALL DEBIT
CALL DEBIT
BANKSEL TXREG
MOVF RCREG,W
CLRF BSR
CLRF PCLATH
BSF INTCON,GIE
RETLW 0x00
;#########################################
estas rutinas ambos PIC las tienen; esta rutina solo es para el 12f1822
;#############################################
IOCAE
BANKSEL IOCAP
MOVLW 0xFF
XORWF IOCAF,W
ANDWF IOCAF,F
BTFSC IOCAN,3
GOTO DESHAP1A
CLRF IOCAP
BSF IOCAN,3
CLRF BSR
BSF PORTA,1
BANKSEL TRISA
BCF TRISA,1
CLRF BSR
GOTO ENDINTERR0
DESHAP1A
CLRF IOCAN
BSF IOCAP,3
BANKSEL TRISA
BSF TRISA,1
CLRF BSR
GOTO ENDINTERR0
ENDINTERR0
MOVLW 0x01
XORWF INTCON,W
ANDWF INTCON,F
GOTO ENDINTERR
;###################################
y la uso para la interrupcion por cambio y el inicio es igual salvo unas cosillas para la interrupcion por cambio
;3####################################
CLRF BSR
CLRF FSR0
CLRF PORTA ; !!Bank!! PORTA - TRISA - WDTCON - SRCON
BSF BSR,0 ; !!Bank Register-Bank(0/1)-Select
MOVLW 0x06 ; b'00000110' d'006'
MOVWF ADCON1 ; !!Bank!! ADCON0 - ADCON1 - RAM - RAM
MOVLB 0x02;CLRF OSCCON ; !!Bank Register-Bank(0/1)-Select
BANKSEL ANSELA ; !!Bank Register-Bank(0/1)-Select
CLRF ANSELA ; !!Bank!! Unimplemented - Unimplemented - CM2CON0 - ANSEL
BANKSEL WPUA
CLRF WPUA
MOVLB 0x01 ; !!Bank Register-Bank(0/1)-Select
MOVLW 0x0A ; b'01100000' d'096' "`"
MOVWF PORTA ; !!Bank!! PORTA - TRISA - WDTCON - SRCON
MOVLW 0x20
MOVWF PIE1
MOVLW 0x02 ; b'10000010' d'130'
MOVWF OPTION_REG ; !!Bank!! TMR0 - OPTION_REG - TMR0 - OPTION_REG
BANKSEL SPBRGL
MOVLW 0x19 ; b'00011001' d'025'
MOVWF SPBRGL ; !!Bank!! TXREG - SPBRG - RAM - RAM
BCF TXSTA,4 ; !!Bank!! RCSTA - TXSTA - RAM - RAM
BANKSEL IOCAN
MOVLW 0x08
MOVWF IOCAN
CLRF BSR ; !!Bank Register-Bank(0/1)-Select
MOVLW 0x1B ; b'00011011' d'027'
MOVWF PR2 ; !!Bank!! T2CON - PR2 - RAM - RAM
MOVLW 0xD8
MOVWF INTCON
CLRF BSR
MOVLW 0x20
MOVWF FSR0
ERASEREG
CLRF INDF0
INCF FSR0,F
BTFSS FSR0,7
GOTO ERASEREG
CLRF TMR0
BANKSEL RCSTA
BSF RCSTA,7 ; !!Bank!! RCSTA - TXSTA - RAM - RAM
BCF TXSTA,5
BSF RCSTA,4
BAUDER
BSF BAUDCON,4
BTFSS BAUDCON,4
GOTO BAUDER
CLRF BSR
;##################################
y pues si ocupas que te pase las rutinas para el envio avisame para postearlas, bueno mejor de una vez adjunto la del 16f1827
BCF PORTB,2
MOVLW 0x0F
MOVWF TXENV
MOVLP 0x0F
CALL TXRUTINA
BSF BSR,0
BSF PORTB,1
CLRF BSR
BSF PORTB,2
BSF CONTROLRECI,0
ESPERARES
CLRF BOTONES
BTFSC CONTROLRECI,0
GOTO ESPERARES
BSF PORTB,1
BSF BSR,0
BCF PORTB,1
CLRF BSR
BCF PORTB,2
RETURN
esa es la que normalmente uso para envio de datos y luego espera mediante una interrupcion la recepcion de un grupo de datos, que levanten una bandera y dejen seguir con el programa.
si ocupas algo mas dime, de verdad quisiera saber que hago mal :/y pues el porque funciona en proteus y en fisico no; con el esquema te refieres a las conexiones?
PD: Hice una modificacion, cheque los registros y vi que tenia BRGH = 0 y SPBRG = 25, cheque en las tablas y estaba enviando a una velocidad de 2500 baudios si mal no recuerdo, al ponerle BRGH = 1, y la rutina de envio como la saque de aqui, en proteus funciona, fisico no :/, aun no veo el error, creo que la tablilla ha de tener un problema que no veo; la tablilla no es mia, me la dio mi maestro y me dijo que hiciera un programa para prueba, es como un proyecto.
La pata RA3 del 12f1822 esta conectada a el RB2 del 16f1827 y estas a su vez van a una resistencia de 10Kohms conectada a corriente
-
Encontre un error mio, me faltaba poner BRGH = 1, poniendolo asi en proteus funciona la velocidad de 9600 baudios, osea a la rutina darle el 12 para el retardo
-
Bueno, quiero cerrar el hilo, al final fue error completamente mio, porque al micro 12F1822 le habia configurado la interrupcion INT/IOC del pin RA2 y RA2 estaba con el DS1302 por lo que estaba en un ciclado infinito y no permitia que el programa continuara, al final ya logre comunicarlo, modifique las rutinas para utilizar la comunicacion a 19230 Baudios y ya puedo leer y escribir el reloj en Modo Burst, asi como deshabilitar el CH(clock halt) del reloj; no se si quieran que suba algun algoritmo para lectura del clock o la rutina de comunicacion a 19230 Baudios