Mehrere Siebensegmentanzeigen (Multiplexing)
In der vorherigen Anleitung haben wir ja schon gelernt wie man eine Siebensegmentanzeige ansteuert. Natürlich ist eine ziemlich wenig. Für eine richtige Anzeige braucht man schon ein paar mehr Anzeigen.
Da gibt es nur ein kleines Problem: Bis jetzt haben wir den “Dateneingang” der Anzeige auf einen Port des Prozessors gelegt. Ein ATMega16 hat aber mal gerade 4 Ports. Ein ATMega8 hat mal gerade einen vollständigen Port. Einen riesigen Prozessor nur für ein paar kleine Anzeigen? Nicht mit uns.
Die Antwort heisst Multiplexing: Wir legen alle Dateneingänge aller Siebensegmentanzeigen auf einen Port und alle gemeinsamen Anschlüsse der Anzeigen auf einen anderen Port: Und dann funktioniert das so:
Schritt 1:
Siegensegmentanzeige_1 einschalten
Daten auf Siebensegmentanzeige_1 legen
Schritt 2:
Siegensegmentanzeige_2 einschalten
Daten auf Siebensegmentanzeige_2 legen
.
.
.
Schritt n:
Siegensegmentanzeige_n einschalten
Daten auf Siebensegmentanzeige_n legen
zurück zu “Schritt 1”
Und das ganze machen wir so schnell, dass das menschliche Auge gar nicht merkt, dass wir immer hin- und herschalten.
Und so sieht der (erweiterte) Code aus:
#include <avr/io.h>
#include <avr/delay.h>
int main ( void ) {
//Port C auf Ausgang schalten (Auswahl)
DDRC = 0xFF;
//Port A auf Ausgang schalten (Daten)
DDRA = 0xFF;
while ( 1 ) {
//Ein “P” auf die erste Anzeige
PORTC = 0b00001000;
PORTA = 0b00001100;
_delay_ms(1);
//Ein “H” auf die zweite Anzeige
PORTC = 0b00000100;
PORTA = 0b10001001;
_delay_ms(1);
//Ein “I” auf die zweite Anzeige
PORTC = 0b00000010;
PORTA = 0b11111001;
_delay_ms(1);
//Ein “L” auf die zweite Anzeige
PORTC = 0b00000001;
PORTA = 0b11000111;
_delay_ms(1);
}
}
Und nun die Erklärung:
– In den ersten Zeilen werden mal wieder die Header eingebunden. Tja, muss wohl sein ^^
– Mit dem DDR-Register schalten wir wieder Port C und Port A auf Ausgang. Ihr errinert euch? Port C wählt uns die passende Anzeige aus, Port A schiebt die Daten auf die Anzeige
– In der Endlosschleife schalten wir nun nacheinander die Anzeigen durch: Zuerst die erste Anzeige: Port C legt den “High” Pegel nur an Pin 4 an. Nur die vierte Anzeige ist also bereit um etwas anzuzeigen.Port A schiebt nun ein “P” auf die Anzeige. Das Programm wartet eine Millisekunde.
Damit verhindern wir dass, die neue Anzeige noch die Daten der alten Anzeige “übernimmt”. Das Resultat wäre ein ziemlich verschmommenes Bild.
Weiter geht es dann mit der Anzeige Nummer drei: Port C legt nur einen “High” Pegel auf die dritte Anzeige, nun kommen die Daten über Port A auf die Anzeige.
…
Und so geht das immer weiter =) Bis dann wieder Anzeige eins an der Reihe ist.
Viel Spaß beim Nachmachen!