Otóż mam taki kod programu który ma za zadanie liczyć do 999:
Problem jest taki ze dziesiątki i jedności działają poprawnie a na setkach są "przebicia" z tych dwóch poprzednich. moje pytanie brzmi jak to wyeliminować?? Gdy działają tylko 2 wyświetlacze wszystko jest OK. Kombinowałem już przestawianiem, opóźnieniem i nic. Proszę o pomoc.
#define FCPU 1000000
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#define dziesiatkiON PORTB |=_BV(1);
#define dziesiatkiOFF PORTB &= ~_BV(1);
#define jednosciON PORTB |=_BV(2);
#define jednosciOFF PORTB &=~_BV(2);
#define setkiON PORTB |=_BV(0);
#define setkiOFF PORTB &=~_BV(0);
char x [10] = {0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9};
volatile i;
volatile wyswietlacz;
volatile jednosci;
volatile dziesiatki;
volatile setki;
volatile liczba;
int wysw_dziesiatki;
int wysw_jednosci;
int main()
{
DDRB = 0xFF; // Ustawienie bitu LED jako wyjścia
TCCR1B |= (1 << WGM12); // Ustawia timer w tryb CTC
OCR1A = 3333; // Ustawia wartość pożądaną na 1Hz dla preskalera 64
TCCR1B |= (1 << CS10); // Ustawia timer z preskalerem Fcpu/256
TIMSK |= (1 << OCIE1A); // Zezwolenie na przerwania dla CTC
sei(); // Zezwolenie globalne na przerwania
DDRC = 0xFF;
PORTC = 0x00;
PORTB = 0x00;
wyswietlacz=0;
while(1)
{
dziesiatki = (liczba/10)%10;
jednosci = liczba%10;
setki = liczba/100;
PORTB |=_BV(0);
if (liczba == 999)
{
liczba = 0;
}
else
{
_delay_ms(100);
liczba++;
}
}
}
ISR(TIMER1_COMPA_vect)
{
switch (i)
{
case 2:
dziesiatkiOFF;
jednosciOFF;
setkiON;
PORTC = x[setki];
i=0;
break;
case 1:
jednosciOFF;
setkiOFF;
dziesiatkiON;
PORTC = x[dziesiatki];
i++;
break;
case 0:
dziesiatkiOFF;
setkiOFF;
jednosciON;
PORTC = x[jednosci];
i++;
setkiOFF;
break;
}
}
Problem jest taki ze dziesiątki i jedności działają poprawnie a na setkach są "przebicia" z tych dwóch poprzednich. moje pytanie brzmi jak to wyeliminować?? Gdy działają tylko 2 wyświetlacze wszystko jest OK. Kombinowałem już przestawianiem, opóźnieniem i nic. Proszę o pomoc.