No se puede establecer Interrupción de cambio de pin en ATmega328p

0

por lo que estoy trabajando en aprender algo de programación AVR con el ATmega328p. Estoy intentando configurar una interrupción de cambio de pin y este es el código que estoy ejecutando. Sin embargo, la interrupción nunca parece activarse. ¿Hay algo que estoy haciendo mal?

¿Hay alguna forma de probar esto fuera del uso de una pizarra, como en la simulación? Estoy usando Atmel Studio.

¡Gracias!

#include <avr/io.h>

#define F_CPU 16000000UL
#include <util/delay.h>
#include <avr/interrupt.h>

#define ON_B0 PORTB |= (1 << PORTB0)
#define OFF_B0 PORTB &= ~(1 << PORTB0)
#define TOGGLE_B0 PINB |= (1 << PINB0)

ISR(PCINT1_vect)
{
    // Check if pin B1 is low)
    if ( !( PINB & (1 << PINB1) ) )
    {
        ON_B0;
    }
    else
    {
        OFF_B0;
    }   
}

int main(void)
{
    DDRB |= ( 1 << DDB0 );
    DDRB &= ~( 1 << DDB1 );

    PCMSK0 |= ( 1 << PCINT1);
    PCICR |= ( 1 << PCIE0);

    sei();


    while (1) 
    {
        PORTB |= ( 1 << PORTB1);
    }
}
    
pregunta Punchki

2 respuestas

3

El problema es que tienes un ISR en el vector PCINT1 , pero el vector para los cambios de pin PORTB es PCINT0 . Los vectores no inicializados saltan a la dirección 0, por lo que la MCU se restablece cuando se produce una interrupción de cambio de pin en PORTB.

Este es un error fácil de cometer porque PCINT1 es la designación de pin PB1 para el cambio de pin, y también el nombre del vector para interrupciones de cambio de pin en PORTC (gracias Atmel!).

Debes cambiar ISR(PCINT1_vect) a ISR(PCINT0_vect) .

  

¿Hay alguna manera de probar esto fuera del uso de una pizarra, como en   simulación?

Sí (así es como encontré el error en su código). En el simulador AVR, puede simular un cambio de pin haciendo clic en el pin para alternarlo, y luego siga la ejecución del código resultante con 'entrar en' (F11). Vea el desensamblador para recorrer el código de la máquina, una instrucción a la vez.

    
respondido por el Bruce Abbott
0
  

la interrupción nunca parece activarse.

Probablemente quieras asegurarte de que el ist no está disparando. De lo contrario, estás resolviendo un problema inexistente.

En segundo lugar, lea la hoja de datos para ver cómo borra el indicador de puntos.

Tener un código más simple también ayuda.

    
respondido por el dannyf

Lea otras preguntas en las etiquetas