Порты Atmega16 не работают

Я пытался связать семисегментный дисплей с чипом Atmega16 с его декодером (74ls47) и увеличить значение, отображаемое с помощью ISR. ISR должен включать и выключать светодиод, а затем увеличивать значение SSD, но он только мигает и ничего не происходит с SSD.

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


unsigned int counter=0;


int main(void)
{
    SREG |= (1<<7); //The Holy Gate
    GICR |= (1<<7); //Enableing INT1
    MCUCR |=(1<<2);     //for INT1
    MCUCR |=(1<<3);     //for INT1  
    DDRC =0xFF;
    PORTC =0;
    DDRB |=(1<<0);
    while (1) 
    {   

    }
}

ISR (INT1_vect)
{

    digitalWrite('B', 0, 1);
    _delay_ms(500);
    digitalWrite('B', 0, 0);
    if (counter <= 9) {
        PORTC=counter;
        counter++;
    } else {
        counter=0;
    }
}

Примечание: digitalWrite - это функция для включения и выключения светодиода, которая предварительно определена в файле "DIO.h".

Заранее спасибо.

1 ответ

Решение

Хорошо, на самом деле я решил это и понятия не имею, как это работает. Я определил "счетчик" изменчивых.

Виноват:

volatile unsigned char counter = 0;
....
ISR (INT0_vect)
{
      if (counter <= 9) {
        PORTC=counter;
        counter++;}
        else {
        counter=0;}
}
int main (void)
{
    ....
    while(1)
    {

    }
}

Исправленный код:

volatile unsigned char counter ;
....
ISR (INT0_vect)
{
      if (counter <= 9) {
        PORTC=counter;
        counter++;}
        else {
        counter=0;}
}
int main (void)
{
    ....
    counter=0;
    while(1)
    {

    }
}
Другие вопросы по тегам