Witam.
Bawię się uC Atmega8 oraz czterocyfrowym wyświetlaczem LED ze wspólną anodą, cyfry siedmiosegmentowe + kropka, 12 wyprowadzeń.
Napisałem prosty program na multipleksację wyświetlacza:
Wyświetla on "29.05". Działa dobrze.
Jednak jeśli chcę dodać w pętli while coś z użyciem funkcji _delay_ms(), to się kopie. Domyślam się, że przerwanie się za bardzo wtrąca do _delay_ms() i wydłuża czas oczekiwania.
Jak temu zaradzić? Chciałbym zrobić zegarek, tak więc czas tu gra kluczową rolę
Proszę o pomoc,
Dawid.
Bawię się uC Atmega8 oraz czterocyfrowym wyświetlaczem LED ze wspólną anodą, cyfry siedmiosegmentowe + kropka, 12 wyprowadzeń.
Napisałem prosty program na multipleksację wyświetlacza:
#define F_CPU 8000000L
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
int i,j;
int size[]={6,2,5,5,4,5,6,3,7,6};
volatile int nr;
int t[][8]=
{
{0,1,2,4,5,6},
{2,6},
{4,1,3,6,0},
{4,6,3,2,1},
{5,3,6,2},
{4,3,1,5,2},
{5,4,3,2,0,1},
{4,6,2},
{0,1,2,3,4,5,6},
{4,5,3,6,2,1},
};
void show_digit(int d,int dt) {
PORTB=(1<<8)-1;
for(j=0; j<size[d]; ++j) PORTB^=_BV(t[d][j]);
if(dt) PORTB^=_BV(7);
}
// PORTD - nr wyswietlacza
// PORTB - segmenty
int dig[4]={5,0,9,2};
int dot[4]={0,0,1,0};
int main(void) {
DDRD=(1<<8)-1;
//PORTD=(1<<8)-1;
DDRB=(1<<8)-1;
PORTB|=(1<<8)-1;
TCCR1B|=(1<<WGM12)|(1<<CS10);
OCR1A=40000;
TIMSK|=(1<<OCIE1A);
sei();
while(1) {
}
}
ISR(TIMER1_COMPA_vect) {
nr=(nr+1)%4;
PORTD=(1<<nr);
show_digit(dig[nr],dot[nr]);
}
Wyświetla on "29.05". Działa dobrze.
Jednak jeśli chcę dodać w pętli while coś z użyciem funkcji _delay_ms(), to się kopie. Domyślam się, że przerwanie się za bardzo wtrąca do _delay_ms() i wydłuża czas oczekiwania.
Jak temu zaradzić? Chciałbym zrobić zegarek, tak więc czas tu gra kluczową rolę
Proszę o pomoc,
Dawid.