Comunicacion serial + TMR PICBASIC
Publicado por Alan (1 intervención) el 25/06/2017 05:21:07
Hola, ando con un problemilla que no logro corregir, estoy trabajando con la interrupcion por TMR0 asi como con comunicacion serial con un modulo Bluetooth para un pic 18F4550, todo andaba bien con mi comunicacion serial pero al momento de agregarle la interrupcion por TMR, no anda como deberia, ya que mi intencion es que la comunicacion serial funcione al recibir caracteres y cada uno efectua diferentes tareas mientras tanto el timer debe ejecutarse cada 100mS aproximandamente para mandar un texto por serial, con mi codigo actual la comunicacion se realiza pero la interrupcion no ocurre hasta que no se recibe algun valor por HSERIN,
en resumen....el pic espera valores con HSERIN mientras deberia interrumpirse cada cierto tiempo y mandar texto por serial.....que ocurre realmente?.....el pic espera un valor y al recibirlo ejecuta las tareas y luego ejecuta la interrupcion, parece mas una interrpcion por cambio de estado que por timer
realmente en tiempo de interrupcion no me preocupa ya que con las formulas se puede modificar, al momento solo quisiera que se ejecutra la interrupcion correctamente, anexo codigo, gracias por su tiempo
_______________________________________________________________________________________
'----------------------FUSIBLES------------------------------
DEFINE OSC 48 'FRECUENCIA PARA LOS CALCULOS DE RETARDO
DEFINE HSER_RCSTA 90h
DEFINE HSER_TXSTA 20h 'ASINCRONO, PARA OSC 4 ES HIGH SPEED 24H, PARA OSC 48 ES LOW SPEED 20H
DEFINE HSER_BAUD 9600
'----------------------REGISTROS----------------------------------
ADCON1 = %00001111 'TODOS LOS PINES DIGITALES
BAUDCON.3 = 0 '8 BITS BAUD RATE GENERATOR
RCON.7 = 1 'SISTEMA DE PRIORIDAD EN LAS INTERRUPCIONES 1 ACTIVADO 0 DESACTIVADO
CMCON = 7
INTCON = %10100000 'CONFIGURANDO LA INTERRUPCION TMR0, BIT 2 FLAG TMR0
INTCON2.7 = 1 'DESACTIVAR LAS RESISTENCIAS EN PULL-UP DEL PUERTO B
INTCON2.1 = 1 'PRIORIDAD DE LA INTERRUPCION POR TMR0
T0CON = %10000111 'TIMER ACTIVO 16 BITS TEMPORIZADOR PRESCALER DE 1:256
TMR0H = $ED '%11101101 'VALORES DE INICIO DE CONTEO TIMER 16BITS
TMR0L = $A9 '%10101001
TRISC = %10000000 'PIN7 RECEPCION PIN 6 TRANSMISION
TRISD = 0 'PUERTO D PARA LOS MOTORES
'----------------------VARIABLES----------------------------------------
CR CON 13 'VALOR ASCII DEL 13 DECIMAL ES CR "RETORNO DE CARRO"
TIEMPO VAR BYTE
DISTANCIA VAR BYTE
CHAR VAR BYTE
'-----------------------ALIAS--------------------------------------------
CLEAR 'BORRA TODAS LAS VARIABLES
PORTC = 0
PORTD = 0
ON INTERRUPT GOTO SENSOR 'LECTURA CADA 100mS
HSEROUT [" INICIE",CR]
INICIO:
HSERIN [Char] 'ESPERA DE UN VALOR
SELECT CASE CHAR
CASE "A"
PORTD = %10011001
CASE "B"
PORTD = %01100110
CASE "C"
PORTD = %10010110
CASE "D"
PORTD = %01101001
CASE "E"
PORTD = 0
END SELECT
GOTO INICIO
DISABLE
SENSOR:
HSEROUT [" ME INTERRUMPI", CR]
TMR0H = $ED '%11101101
TMR0L = $A9 '%10101001
INTCON = %10100000 'BORRANDO BANDERA DE INTERRUPCION
RESUME
ENABLE
END
en resumen....el pic espera valores con HSERIN mientras deberia interrumpirse cada cierto tiempo y mandar texto por serial.....que ocurre realmente?.....el pic espera un valor y al recibirlo ejecuta las tareas y luego ejecuta la interrupcion, parece mas una interrpcion por cambio de estado que por timer
realmente en tiempo de interrupcion no me preocupa ya que con las formulas se puede modificar, al momento solo quisiera que se ejecutra la interrupcion correctamente, anexo codigo, gracias por su tiempo
_______________________________________________________________________________________
'----------------------FUSIBLES------------------------------
DEFINE OSC 48 'FRECUENCIA PARA LOS CALCULOS DE RETARDO
DEFINE HSER_RCSTA 90h
DEFINE HSER_TXSTA 20h 'ASINCRONO, PARA OSC 4 ES HIGH SPEED 24H, PARA OSC 48 ES LOW SPEED 20H
DEFINE HSER_BAUD 9600
'----------------------REGISTROS----------------------------------
ADCON1 = %00001111 'TODOS LOS PINES DIGITALES
BAUDCON.3 = 0 '8 BITS BAUD RATE GENERATOR
RCON.7 = 1 'SISTEMA DE PRIORIDAD EN LAS INTERRUPCIONES 1 ACTIVADO 0 DESACTIVADO
CMCON = 7
INTCON = %10100000 'CONFIGURANDO LA INTERRUPCION TMR0, BIT 2 FLAG TMR0
INTCON2.7 = 1 'DESACTIVAR LAS RESISTENCIAS EN PULL-UP DEL PUERTO B
INTCON2.1 = 1 'PRIORIDAD DE LA INTERRUPCION POR TMR0
T0CON = %10000111 'TIMER ACTIVO 16 BITS TEMPORIZADOR PRESCALER DE 1:256
TMR0H = $ED '%11101101 'VALORES DE INICIO DE CONTEO TIMER 16BITS
TMR0L = $A9 '%10101001
TRISC = %10000000 'PIN7 RECEPCION PIN 6 TRANSMISION
TRISD = 0 'PUERTO D PARA LOS MOTORES
'----------------------VARIABLES----------------------------------------
CR CON 13 'VALOR ASCII DEL 13 DECIMAL ES CR "RETORNO DE CARRO"
TIEMPO VAR BYTE
DISTANCIA VAR BYTE
CHAR VAR BYTE
'-----------------------ALIAS--------------------------------------------
CLEAR 'BORRA TODAS LAS VARIABLES
PORTC = 0
PORTD = 0
ON INTERRUPT GOTO SENSOR 'LECTURA CADA 100mS
HSEROUT [" INICIE",CR]
INICIO:
HSERIN [Char] 'ESPERA DE UN VALOR
SELECT CASE CHAR
CASE "A"
PORTD = %10011001
CASE "B"
PORTD = %01100110
CASE "C"
PORTD = %10010110
CASE "D"
PORTD = %01101001
CASE "E"
PORTD = 0
END SELECT
GOTO INICIO
DISABLE
SENSOR:
HSEROUT [" ME INTERRUMPI", CR]
TMR0H = $ED '%11101101
TMR0L = $A9 '%10101001
INTCON = %10100000 'BORRANDO BANDERA DE INTERRUPCION
RESUME
ENABLE
END
Valora esta pregunta
0