Autor Tema: Ayuda con las interrupciones por hardware...  (Leído 2625 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado manex_1987

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1127
Ayuda con las interrupciones por hardware...
« 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!

Desconectado Abago

  • PIC24F
  • *****
  • Mensajes: 792
RE: Ayuda con las interrupciones por hardware...
« Respuesta #1 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...

Desconectado khasistos

  • PIC18
  • ****
  • Mensajes: 493
RE: Ayuda con las interrupciones por hardware...
« Respuesta #2 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

Desconectado manex_1987

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1127
RE: Ayuda con las interrupciones por hardware...
« Respuesta #3 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.

Desconectado Abago

  • PIC24F
  • *****
  • Mensajes: 792
RE: Ayuda con las interrupciones por hardware...
« Respuesta #4 en: 30 de Junio de 2004, 13:32:00 »
La declaración del trisb???
porque ya me has dejado con la duda...

Desconectado manex_1987

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1127
RE: Ayuda con las interrupciones por hardware...
« Respuesta #5 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.


 

anything