Witam. Mam problem z przetwornikiem w Atmega8.Na wyświetlaczu chce wyświetlić zawartość rejestru ADC. Problem jest w liczeniu. Program liczy od 0 do 89 w porządku potem dzieje się coś dziwnego: ...88,89,80,90,91...99,90,91..99,00. Dodatkowo na 1 segmencie cały czas wyświetlana jest cyfra 8.
Nie mogę sobie poradzić z tym problemem.
Nie mogę sobie poradzić z tym problemem.
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
volatile int cyfra[10] = { 0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82,
0xf8, 0x80, 0x90 };
volatile int wysw;
volatile int setki;
volatile int dziesiatki;
volatile int jednosci;
volatile unsigned char mlodszapolowka ,starszapolowka , wynikadc;
int main(void)
{
DDRD=255;
PORTD=255;
DDRB=255;
ADMUX = (1<<ADLAR)|(1<<REFS0)|(1<<MUX2);
ADCSRA = (1<<ADEN)|(1<<ADIE)|(1<<ADFR)|(1<<ADSC)|(1<<ADPS0)|(1<<ADPS1);
TCCR1B |= (1 << WGM12); // tryb CTC
OCR1A = 30000;
TCCR1B |= (1 << CS10);
TIMSK |= (1 << OCIE1A);
sei();
for (;;)
{
wynikadc=~(starszapolowka);
jednosci = wynikadc % 10;
wynikadc = (wynikadc - jednosci) / 10;
dziesiatki = wynikadc % 10;
wynikadc = (wynikadc - dziesiatki) / 10;
setki= wynikadc % 10;
}
return 0;
}
ISR(ADC_vect)
{
mlodszapolowka = ADCL;
starszapolowka = ADCH;
}
ISR(TIMER1_COMPA_vect)
{
switch(wysw)
{
case 0:
PORTD = 0b1111110;
PORTB=cyfra[setki];
wysw++;
break;
case 1:
PORTD = 0b1111101;
PORTB = cyfra[dziesiatki];
wysw++;
break;
case 2:
PORTD = 0b1111011;
PORTB = cyfra[jednosci];
wysw=0;
break;
}
}