Evo kao sto sam obecao, napisacu program kako bi ovo trebalo da radi. Program mogu da pisem u C-u ili ASM-u. Basic, ne znam.
1- elektricna sema - zasto ne radi simulacija kada se pravilno postave NPN ili PNP tranzistori, ne znam. Ocigledno je nesto do simulacije. Najjednostavniji primer je da se postavi tranzistor na proto plocicu i da se proba logika sa LE-diodom.2
2 - Prilikom pisanja programa za mux LED displeja mora se izuztno voditi racuna o samoj semi pogona zajednicke katode (u ovom slucaju. Prica se samo inveruje za zajednicku anodu). Sa seme se moze videti da su select linije displeja rasporedjene na sledeci nacin:
Cifra 1 - PORTB.0
Cifra 2 - PORTB.1
Cifra 3 - PORTB.2
Ovakav redosled nam govori da se u mux rezimu rada samo vrsi prebacivanje sa jedne da drugu, po klasicnom kruznom fazonu. Znaci, prvo PB0, pa PB1, pa PB2 i tako u krug. Posto je takva sema veze, onda nam ne trebaju ti silni IF-ovi koji ce da produzavaju vreme izvrsavanja programa.
3- Pri radu sa 7-seg sisplejima je neophodno napraviti look-up tabelu, gde su definisani svi kodovi cifara koji mogu da se prikazu na displeju (Miki je to vec rekao, samo ponavljam). U visim programskim jezicima je to obican niz. Program i interaptu tajmera bi trebao ovako da izgleda (ovo je program koji je pokazni, nije kompajliran i treba ga prilagoditi konkretnim potrebama i MCU-u):
Ovde nisam pisao nikakve inicijalizacije TMR-ova i interapra, vec samo logiku, kako optimalno napisati program koji ce da prikazuje u MUX rezimu cifre na displeju.
1- elektricna sema - zasto ne radi simulacija kada se pravilno postave NPN ili PNP tranzistori, ne znam. Ocigledno je nesto do simulacije. Najjednostavniji primer je da se postavi tranzistor na proto plocicu i da se proba logika sa LE-diodom.2
2 - Prilikom pisanja programa za mux LED displeja mora se izuztno voditi racuna o samoj semi pogona zajednicke katode (u ovom slucaju. Prica se samo inveruje za zajednicku anodu). Sa seme se moze videti da su select linije displeja rasporedjene na sledeci nacin:
Cifra 1 - PORTB.0
Cifra 2 - PORTB.1
Cifra 3 - PORTB.2
Ovakav redosled nam govori da se u mux rezimu rada samo vrsi prebacivanje sa jedne da drugu, po klasicnom kruznom fazonu. Znaci, prvo PB0, pa PB1, pa PB2 i tako u krug. Posto je takva sema veze, onda nam ne trebaju ti silni IF-ovi koji ce da produzavaju vreme izvrsavanja programa.
3- Pri radu sa 7-seg sisplejima je neophodno napraviti look-up tabelu, gde su definisani svi kodovi cifara koji mogu da se prikazu na displeju (Miki je to vec rekao, samo ponavljam). U visim programskim jezicima je to obican niz. Program i interaptu tajmera bi trebao ovako da izgleda (ovo je program koji je pokazni, nije kompajliran i treba ga prilagoditi konkretnim potrebama i MCU-u):
Code:
unsigned char Cifra = 1; // Promenljiva koja govori koja se trenutno cifra prikazuje. Vrednost 1 kaze da se trenutno prikazuje prva cifra
unsigned char Digits[4];
#define Digit1 Digits[0];
#define Digit2 Digits[1];
#define Digit3 Digits[3];
unsigned Tabela7segCifara[10] = ... // Ovde treba ubaciti za svaku prikazanu cifru kod koji se salje displeju
void TMR_ISR(void)
{
// Prvo treba uraditi reload TMR-a, ako nije auto-reload
PORTD = 0x00;
PORTB &= 0b11111000; // Isklkjuci selekcije sve tri cifre
PORTB |= Cifra; // Slekcija zeljene cifre
PORTD = Digits[Cifra]; // Prikaz cifre na dipleju
if((Cifra <<= 0x01) > 0x04) // Predji na sledecu cifru
{Cifra = 0x01;}
}
// U main-u bi bilo sledece:
void main(void)
{
// inicijalizacija svega se podrazumeva
while(1)
{
Broj = 0;
Digit1 = ((Broj % 1000) / 100);
Digit2 = ((Broj % 100) / 10);
Digit3 = (Broj % 10);
Pauza(1s); // Pauza od 1s za prikaz inkrementa prikazanog broja
Broj++;
}
}
Ovde nisam pisao nikakve inicijalizacije TMR-ova i interapra, vec samo logiku, kako optimalno napisati program koji ce da prikazuje u MUX rezimu cifre na displeju.