Witam. Zwracam się z prośbą o przeanalizowanie fragmentu tego kodu. Nie mogę sobie poradzić z 4 bitem port B. Zmieniam jego wartość w przerwaniu na przeciwną, w pętli for nie zmieniam już jego wartości przy operacjach ustawiania i zerowania bitów - ruszam tylko bity 0-3 - pomimo to nie zawiera on wartości takiej jakiej bym się spodziewał (powinien co 1 sek. zmienić stan na przeciwny a zachowuje się całkiem przypadkowo - przynajmniej tak mi się wydaje).
Obsługa przerwania działa prawidłowo - jeżeli ustawię port A jako wyjście i w obsłudze przerwania dodam Wszystko działa prawidłowo.
#include <avr/io.h>
#include <avr/interrupt.h>
volatile unsigned int sec_l=0x00;
int digit[10] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};
int i;
ISR (SIG_OVERFLOW1)
{
PORTB ^=_BV(4);
sec_l++;
TCNT1 = 0x85EE;
}
int main(void)
{
DDRB = 0xFF;
PORTB = 0xFE;
DDRC = 0x00;
PORTC = 0x03;
DDRD = 0xFF;
TIMSK = _BV(TOIE1);
TCNT1 = 0x85EE;
TCCR1A = 0x00;
TCCR1B = _BV(CS12);
sei();
while(1){
for(i=0; i<4; i++){
PORTB |= 0x0F;
PORTD = digit[sec_l];
PORTB &= ~_BV(i);
}
};
}
Obsługa przerwania działa prawidłowo - jeżeli ustawię port A jako wyjście i w obsłudze przerwania dodam
PORTA ^=_BV(4);