TODOPIC

Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: manex_1987 en 30 de Junio de 2004, 06:34:00

Título: Ayuda con las interrupciones por hardware...
Publicado por: manex_1987 en 30 de Junio de 2004, 06:34:00
Hola

Estoy practicando con la manipulacion del registro INTCON en un 16F84A, por ser un dispositivo simple, para luego poder usar esos procedimientos en el 18F458 que uso actualmente. He hecho el siguiente programa en picbasic plus:

DEVICE=16F84A
XTAL=4
PORTB_PULLUPS = TRUE
INTCON=%10010000
TRISB=%00000000

ON_INTERRUPT INTHANDLER
GOTO FLASHER

INTHANDLER:
IF PORTB.7=0 THEN PORTB.7=1 ELSE PORTB.7=0
INTCON.1=0
CONTEXT RESTORE

FLASHER:
HIGH PORTB.6
DELAYMS 500
LOW PORTB.6
DELAYMS 500
GOTO FLASHER

- - - -
El programa consta de un LED en PORTB.7 que parpadea cada 500ms, ese es el bucle principal. He activado las interrupciones por RB0/INT, como se puede ver en el registro INTCON. Cualquier cambio de estado en PORTB.0 activaría la interrupción, y encendería o apagaría el LED en PORTB.6 .
Con Portb_pullups activado, el pulsador a tierra.

El problema radica en que cuando enciendo el montaje, RB7 parpadea, y RB6 empieza encendido desde el principio, y no se inmuta con cualquier cambio de estado de RB0/INT.

A qué se debe esto?

saludos

PD:150 mensajes! gracias a todos!
Título: RE: Ayuda con las interrupciones por hardware...
Publicado por: Abago en 30 de Junio de 2004, 09:41:00
Codigo:


DEVICE=16F84A
XTAL=4
PORTB_PULLUPS = TRUE
INTCON=%10010000
TRISB=%00000000

ON_INTERRUPT INTHANDLER
GOTO FLASHER

disable
INTHANDLER:
toggle portb.7
return
enable

FLASHER:
toggle PORTB.6
PAUSE 500
GOTO FLASHER

- - - -



a simple vista, primer error, es que no has definido por trisb bien...
si quieres que cuando pulses rb0 salte a la interrupción...
no crees que tendrás que declarar el pin como entrada???
rb6 y rb7 son leds, por lo que son salidas...

SObre el tema de la interrupción, la verdad, es que el cambio de estado de rb7, al pulsar rb0, va a ser tan rápido, que apenas te va a dar tiempo a ver que el led enciende y apaga...
Título: RE: Ayuda con las interrupciones por hardware...
Publicado por: khasistos en 30 de Junio de 2004, 10:45:00
Hola :
aqui te mando un ejemplo de manejo de interrupciones ,nada que ver con lo tuyo pero si para que veas si tienes dudas como las manejan espero sean de utilidad
Saludos
khasistos

 Program PLAY_NOTE.BAS
" Produce a tone from PORTB.0 using a TMR1 interrupt
Device = 18F452                     " Use a PIC18F452 device
XTAL = 20                           " With a 20MHz crystal/resonator
                             
Dim NOTE_COUNTER as Word SYSTEM     " Determines when the pin is toggled                  
Dim NOTE as Word SYSTEM             " Determines the pitch of the note                    
Dim TIMER1 as TMR1L.Word            " Combine TMR1L/TMR1H as a 16-bit word
Symbol GIE = INTCON.7               " Global Interrupt Enable/Disable
       
ON_INTERRUPT Goto NOTE_INT          " Point interrupts to our interrupt handler
Delayms 400                         " Wait for PICmicro to stabilise
ALL_DIGITAL = True                  " Set PORTA and PORTE to digital

Goto OVER_INTERRUPT                 " Jump over the interrupt handler

"----[INTERRUPT HANDLER]------------------------------------------------
NOTE_INT:
TIMER1 = 65490                      " Load TMR1 with a preset value
Inc NOTE_COUNTER                    " Increment the note counter        
If NOTE_COUNTER >= NOTE Then        " Is it time to toggle the pin ?
PORTB = PORTB ^ 1                   " Toggle pin PORTB.0
Clear NOTE_COUNTER                  " Clear the note counter
Endif
Clear PIR1.0                        " Clear TMR1 interrupt flag
Retfie FAST                         " Exit the interrupt





       
"----[MAIN PROGRAM CODE]--------------------------------------------------      
OVER_INTERRUPT:        
Output PORTB.0                " Make PORTB.0 and output
Clear NOTE_COUNTER            " Reset the note counter
T1CON = %00000001             " Turn on TIMER1, with a 1:1 prescaler
Clear PIR1.0                  " Clear TMR1 interrupt flag
Set PIE1.0                    " Enable TMR1 as peripheral interrupt source  
INTCON =  %11000000           " Enable global interrupts, peripheral interrupts


NOTE = 0                      " Reset the note to play
Repeat                        " Create a loop
Inc NOTE                      " Lower the pitch of the note
Delayms 50                    " Wait 50ms between notes          
Until NOTE = 1000             " Stop when we reach a count of 1000
Clear GIE                     " Disable interrupts to stop the note
Título: RE: Ayuda con las interrupciones por hardware...
Publicado por: manex_1987 en 30 de Junio de 2004, 13:28:00
Hola

Me temo que ese era el problema...

Muchas gracias por la ayuda, cuando pueda probaré el programa que adjuntas.
Título: RE: Ayuda con las interrupciones por hardware...
Publicado por: Abago en 30 de Junio de 2004, 13:32:00
La declaración del trisb???
porque ya me has dejado con la duda...
Título: RE: Ayuda con las interrupciones por hardware...
Publicado por: manex_1987 en 30 de Junio de 2004, 13:38:00
Ante una orden High o Low , un pin cambia automaticamente a salida, pero... puede un pin cambiar a entrada simplemente le hemos aplicado 5V o lo hemos echado a masa? Supongo que no... asi que, TRISB=%00000001 y punto

saludos!

PD: cabe destacar que cada vez me atrae más el assembler, si no fuera porque he empezado a trabajar con el 18F458, empezaria desde ya a currarmelo.