TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: kiroov en 11 de Julio de 2005, 13:51:00
-
Muy buenas, estoy realizando un proyecto con un pic 16f876 y tengo un pequeño problema con el puerto serie.
Estoy detectando una interrupcion en la RB0/INT0 que salta con la señal de un encoder que he colocado en el eje de un movil, cuando salta la interrupcion tomo un muestra analogica por el pin RA0 y la guardo en NumH y NumL, despues envio las dos muestras por el puerto rs232. Mi problema es q no recibo dos muestras por el puerto serie si no tres, bueno varía, algunas veces son dos y otras tres. El aparatito no funciona xq algunas veces me envia la misma muestra para valores de tension diferentes.
La velocidad con la q tengo q hacer el proceso debe ser lo maximo posible por q en principio quiero colocar un modulo de radio en el movil y tomar muestras en tiempo real (lo mas deprisa posible).
Muchas gracias por todo 
ahi va el codigo
; ************************************
; * INCLUDES, BANCOS, ERRORES *
; ************************************
list p=16f876 ; list directive to define processor
#include <p16f876.inc> ; INCLUIMOS LAS DEFINICIONES DEL PIC UTILIZADO
#define BANCO_1 bsf STATUS,RP0 ;DEFINICION DE BANCO 1
#define BANCO_0 bcf STATUS,RP0 ;DEFINICION DE BANCO 0
ERRORLEVEL -306, -302 ;QUITAMOS LOS ERRORES DE BANCO EN MPLAB
RADIX HEX ; sistema de numeracion hexadecimal
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_OFF & _XT_OSC & _WRT_ENABLE_OFF & _LVP_ON& _DEBUG_OFF & _CPD_OFF
; frecuencia clock
XTAL_FREQ EQU 4000000 ; OSC freq in Hz
; ***********************************
; * DEFINICION DE ETIQUETAS *
; ***********************************
cont equ 0x20
NumH equ 0x25
NumL equ 0x26
PDel0 equ 0x27
PDel1 equ 0x28
PDel2 equ 0x29
; ****************
; * START *
; ****************
org 0
goto inicio
; ******************************************
; * RUTINA de INTERRUPCIÓN GENERAL *
; ******************************************
org 4
call adsetnow
call Xready
call bith
call allsend
nop
nop
call Xready
call bitl
call allsend
nop
nop
bcf INTCON,INTF
retfie
; **************************************************
; * RUTINA DE INICIO, AUQI CONFIGURAMOS EL PIC *
; **************************************************
inicio
bcf STATUS, RP0
bcf STATUS, RP1
clrf PORTB
clrf PORTC
BANCO_1
movlw b"11111111"
movwf TRISB
movlw b"10000000"
movwf TRISC
BANCO_0
bsf RCSTA, 7 ; activamos el USART MODO ASINCRONO
BANCO_1
movlw b"00100100" ; SYNC=0 (asincrono) y BRGH = 1 (alta velocidad)
movwf TXSTA
movwf .25 <<<<<------------- AQUI ESTA EL ERRORR
movwf SPBRG
BANCO_0
bcf STATUS, 5
clrf PORTC
BANCO_1
movlw b"11000000"
movwf OPTION_REG
BANCO_0
movlw b"10010000"
movwf INTCON
; **********************************
; * PROGRAMA PRINCIPAL *
; **********************************
bucle
goto bucle
; ********************************************
; * SUBRUTINAS PARA LAS INTERRUPCIONES *
; ********************************************
adsetnow
call Init_ADC
call Read_ADC
return
bith
movf NumH,0
movwf TXREG
BANCO_1
return
bitl
movf NumL,0
movwf TXREG
BANCO_1
return
Init_ADC
; Set ADCON0
movlw b"10000001"
movwf ADCON0
; Set ADCON1
BANCO_1
movlw b"10001110"
movwf ADCON1
BANCO_0
return
Read_ADC
bsf ADCON0, GO_DONE ;inicializa la conversion
btfsc ADCON0, GO_DONE
goto $-1 ;espera a terminar la conversion
andlw b"00000011"
movf ADRESH,W
nop
movwf NumH
BANCO_1
movf ADRESL,W
andlw b"11111111"
BANCO_0
movwf NumL ;el resultado es retornado en NumH (bit 0 y bit1) y NumL (8bits)
return
Xready
BANCO_1
bsf TXSTA, TXEN
BANCO_0
return
allsend
btfss TXSTA,TRMT ; byte transmitido ?????
goto allsend ; No pues espera
BANCO_0
return
end

-
Hola kiroov. Estuve viendo tu codigo, no lo revise a fondo pero logre darme cuenta de algunas cosas.
Primero, si quieres lograr una velocidad de transmision mas alta, puedes cambiar de cristal usando uno de 10MHz, 16MHz o 20MHz, con ello puedes trabajar a una velocidad mas alta de transmision serial.
Segundo, me aprece que los errores que obtienes es porque no has configurado bien tus interrupciones. Cuando estes dentro de la misma interrupcion no olvides desabilitarlas, pues mientras se ejecuta esa interrupcion, puede llegar otra generando asi incoherencia en sus respuestas. Ademas, debiste haber guardado el registro STATUS, W y PCLATH apenas entras a la interrupcion, restituyendolas antes de salir de la misma.
Corrigue esos errores y me cuentas como te fue...
Un saludo desde Peru
-
Hola Artifox, gracias por contestarme el post.
A ver cuando entro en la interrupcion el bit GIE de INTCON se pone a 0 verdad??? con lo q toy deshabilitando las interrupciones, y cuando retfie estoy poniendo a 1 el gie de intcon. Lo q he hecho ahora es cargar 0x00 en intecon cuando entro en la interrupcion y volver a cargar 0x90 antes de salir.
Tmb guardo W y STATUS cuando entro a la interrupcion y de igual forma los recargo cuando voy a salir.
Tengo una respuesta muy parecida a la tenia antes 
Podrias ser un poco mas conciso cuando dices q ves errores cuando configuro las interrupciones??? xq no consigo ver el error.
Muchas gracias!!!! 
KirooV , FRANJA REVOLUTIONS !!!
-
Muy Buenas a Todos, por fin he encontrado el error (oeoeoeoeoeoe, jejeje), como decia en el mensage anterior cuando entramos en la interrupcion se desactivan las interrrupciones globalmente y se guarda el contenido del PCL en la pila (no problemo pa volver). 
El problema estaba cuando cargaba el SPBRG (generador de baudios)
movlw .25 <<<----- ESTA ES LA INSTRUCION CORRECTA
movwf SPBRG
Ahora funciona de vicio!!!! 


A seguir programando q tengo ganas de verlo corre!! jejeje
Enga, espero q alguno le ayude!
_____________________________________________________________
kiroov from la franja