Axel L. schrieb:
> Wenn ich die Taste an PD7 nach der letzten Ziffer "000" drücke, bekomme
> ich eine "0" in der mittleren Anzeige. Wie lässt sich dies vermeiden?
Indem du deinem Hauptprogramm die übliche Hauptschleife verpasst, aus
der das Programm nie herauskommt.
Dein Programm hat keine Hauptschleife sondern erreicht in diesem Fall
dann den return in main(). D.h. dir wird die Kontrolle entzogen, der gcc
Standardcode übernimmt und schaltet alle Interrupts ab. Und damit steht
dann dein Multiplexing
> Auch sind ganz ganz leichte Schatteneffekte innerhalb der Segmentanzeige
> zu sehen. Wird die Anzeige zu schnell angesteuert bzw. kommen meine
> Transistoren (BC548C) oder Segmente (Kingbright SC39-11PBWA) nicht mit?
Höchst wahrscheinlich.
Du könntest zb das Weiterschalten vom muxflag komplett zwischen
Abschalten der alten Belegung (und zwar komplett! auch den PORTA!) und
Einschalten der neuen Belegung legen. Dann verbrauchst du dort ein
bischen Zeit und das könnte dann schon reichen, dass dir die winzigen
Kapazitäten nicht mehr in die Quere kommen.
Dass h z e immer um 1 größer sein sollen, alls die Zahl die sie anzeigen
müssen, ist mehr als unschön.
Auch nimmt man beim Multiplexen gerne die eigentlichen Ziffern aus der
Multiplexroutine raus. Die Multplexroutine zeigt einfach 3 Bytes an. Was
diese darstellen interessiert sie nicht. Dann kann man zb auch ein '-'
als Vorzeichen anzeigen, oder irgendwelche coole Einschaltanimationen,
etc.
Dafür schreibt man sich eine Funktion, die eine Zahl übernimmt und diese
3 Bytes bestimmt, die die Multiplexroutine anzeigen soll:
zb
1 | void ito7Seg( int number )
|
2 | {
|
3 | e = num[number % 10];
|
4 | number = number / 10;
|
5 |
|
6 | z = num[number % 10];
|
7 | number = number / 10;
|
8 |
|
9 | h = num[number % 10];
|
10 | }
|
In der ISR dann
1 | ...
|
2 |
|
3 | if(muxflag==0)
|
4 | {
|
5 | PORTA = e;
|
6 | PORTC |= (1<<PC5);
|
7 | PORTC &= ~(1<<PC6);
|
8 | PORTC &= ~(1<<PC7);
|
9 | }
|
(und natürlich sinngemäss auch für die anderen anzuzeigenden Bytes
und dann kann man den Zähler so schreiben und ist das Denken in
Hundertern, Zehnern und Einern los
1 | ....
|
2 | while( 1 ) {
|
3 |
|
4 | for( counter = 0; counter < 300; ++counter ) {
|
5 | ito7Seg( counter );
|
6 | _delay_ms( 150 );
|
7 | }
|
8 | }
|
9 | }
|
NB: Nimm den cli und sei aus der ISR raus! Interrupts sind wärend einer
ISR sowieso ausgeschaltet. Der sei am Ende der ISR kann dir aber
Probleme machen, weil die Interrupts dann ein klein wenig zu früh
aktiviert werden.