ATTINY85 interrumpir la confusión

0

Estoy tratando de hacer que ATTINY85 se dispare SOLO en ALTA interrupción, pero no importa qué combinación de bits establezca para GIMSK y MCUCR, no puedo hacer que funcione;

Aquí está mi código:

#define F_CPU 1000000UL

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

int main(void)
{
    DDRB  = 0b00011000; 

    setup();

    PORTB = 0b00010000;

    while(1) {}

    return 0;
}

void setup()
{
    GIMSK = 0b01100000;  
    PCMSK = 0b00000010;   
    MCUCR = 0b00000011;   
    sei();            
}

ISR(PCINT0_vect)
{
    PORTB = 0b00011000;
    delayms( 100 );
    PORTB = 0b00010000;
}

Según la hoja de datos, si configuro los bits en MCUCR de la siguiente manera, debería poder lograr mi resultado con la última opción:

ISC01 ISC00

0     0         The low level of INT0 generates an interrupt request.
0     1         Any logical change on INT0 generates an interrupt request.
1     0         The falling edge of INT0 generates an interrupt request.
1     1         The rising edge of INT0 generates an interrupt request

Probé todas las combinaciones, pero absolutamente nada cambió. Luego cambié:

GIMSK = 0b01100000;

A

GIMSK = 0b00100000;

Eso hizo que la interrupción se disparara en ALTO, pero ahí es donde se detuvo, si conecto de nuevo el pin a alto, la interrupción no se dispara, lo mismo si lo conecto a BAJO. Solo la primera vez que el controlador está encendido y el pin está conectado a ALTO.

¿Cómo puedo hacer que la interrupción se dispare solo cuando el pin está ALTO, no ambos? ALTO y BAJO. Quiero cada vez que presiono un botón, interrumpir para disparar, pero NO cuando suelto el botón. ¿Alguna sugerencia? Gracias!

    
pregunta 0x29a

1 respuesta

3

Hay varias cosas a considerar:

  1. El único pin que se puede configurar para un cambio de borde específico es el pin 7, que es PB2. Por lo tanto, su pulsador debe estar conectado a ese pin.
  2. Sería una buena práctica tirar este pin a tierra con una resistencia de 10k, para asegurarse de que no esté flotando (es decir, no puede hacer un alto por sí solo).
  3. Establezca el bit 6 del registro GIMSK en 1 para habilitar INT0.
  4. Establezca los bits [1: 0] del regulador MCUCR en 11 para generar la interrupción solo en el flanco ascendente.
  5. Establezca el bit 0 del registro DDRB en 1 para que salga. Es decir, el pin PB0 sería la salida.
  6. Cambie la ISR de interrupción (PCINT0_vect) a ISR (INT0_vect). Hay una diferencia entre PCINT0 e INT0.
  7. Puede cambiar el pin PB0 en su ISR de la siguiente manera: PORTB = PORTB ^ 0x01
  8. No es una buena práctica tener un retraso en el ISR
  9. Sería bueno implementar un de-bounce subrountine para asegurarse de que cuando presiona el botón, el INT0 se dispara solo una vez.
respondido por el Nazar

Lea otras preguntas en las etiquetas