Forum: Mikrocontroller und Digitale Elektronik 7-Segment Tutorial (Multiplex) / Frage?


von René (Gast)


Lesenswert?

Hallo Zusammen,

als erstes ein herzliches Danke schön für die tolle Seite.

Bitte entschuldigt wenn ich diese Frage ins falsche Forum gestellt habe, 
war mir nicht so sicher wo das hin gehört.

Meine Frage bezieht sich auf das oben genannte Tutorial, beim 
Multiplexen werden die Segmente über PNP Transistoren an PORTC 
gesteuert. Im Programm werden die einzelne Segmente mit einem Linksshift 
geschaltet, das heisst das Digit wird mit High angesteuert und mit Low 
ausgeschaltet. Sollte das nicht umgekehrt sein?

Also z.B. alle Digits auschalten:

           ldi     temp1, 0xff            ; Die 7 Segment ausschalten
           out     PORTC, temp1

statt wie im Programm:

           ldi     temp1, 0x              ; Die 7 Segment ausschalten
           out     PORTC, temp1


Verstehe ich da etwas falsch?

Grüsse,
René

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> Bitte entschuldigt wenn ich diese Frage ins falsche Forum gestellt habe,

Hast Du geschafft. Punktlandung.

> war mir nicht so sicher wo das hin gehört.

Hierhin, wo es jetzt ist.


>           ldi     temp1, 0x              ; Die 7 Segment ausschalten

Das ist mit Sicherheit ein Schreibfehler. 0x ist keine hexadezimale 
Konstante.

von René (Gast)


Lesenswert?

Ups, ja sorry, tippfehler, meinte natürlich:

>           ldi     temp1, 0              ; Die 7 Segment ausschalten

PS: danke fürs verschieben ;-))

von Stefan B. (stefan) Benutzerseite


Lesenswert?

René ich denke du hast Recht!

Im Programm
http://www.mikrocontroller.net/articles/AVR-Tutorial:_7-Segment-Anzeige#Programm_2

steht in der Routine multiplex:

           ldi     temp1, 0            ; Die 7 Segment ausschalten
           out     PORTC, temp1

In der Schaltung sind am Common Anode Anschluss der Displays PNP 
Transistoren verbaut

http://www.mikrocontroller.net/articles/AVR-Tutorial:_7-Segment-Anzeige#Schaltung_2

PNP-Transistoren sperren, wenn seitens des µC an der Basis Vcc zugeführt 
wird (wenn Emitter aus Vcc sieht)

http://www.mikrocontroller.net/articles/Transistor#PNP.2FNPN_als_Schalter.2C_wohin_mit_der_Last.3F

Damit müsste in dem Programm der Sourcecode wie folgt geändert werden:

           ldi     temp1, 0xFF            ; Die 7 Segment ausschalten
           out     PORTC, temp1

von Karl H. (kbuchegg)


Lesenswert?

Stefan B. wrote:

> Damit müsste in dem Programm der Sourcecode wie folgt geändert werden:
>
>            ldi     temp1, 0xFF            ; Die 7 Segment ausschalten
>            out     PORTC, temp1

Das wird noch nicht reichen.
Die ganze Steuerung rund um NextDigit muss geändert werden.

Seltsam: Ich hab damals das Original geschrieben und ich bin mir 
eigentlich ziemlich sicher, das ich das am Steckbrett aufgebaut hatte.

Aber ich muss zugeben: Die Argumentation mit den PNP ist nicht von der 
Hand zu weisen.

von René (Gast)


Lesenswert?

@Stefan

danke für Deine Antwort.

Hmm, ok, dann müsste in der Multiplex Routine aus

>           lsl     temp1               ; beim nächsten Interrupt kommt reihum die
>           cpi     temp1, $10          ; nächste Stelle dran.
>           brne    multi1
>           ldi     temp, 0
>           ldi     temp1, $01

folgendes werden:

           sec                         ; beim nächsten Interrupt kommt 
reihum die
           rol     temp1       ; nächste Stelle dran.
           cpi     temp1, 0b11101111   ; dazu wird das carry bit gesetzt 
welches eine 1
           brne    multi1              ; mit rol einschiebt
           ldi     temp, 0
           ldi     temp1, 0b11111110

werden.

Ebenfalls im Main muss NextDigit richtig initialisiert werden (auf 
0b11111110).

von Karl H. (kbuchegg)


Lesenswert?

René wrote:

>            sec                         ; beim nächsten Interrupt kommt
> reihum die
>            rol     temp1       ; nächste Stelle dran.
>            cpi     temp1, 0b11101111   ; dazu wird das carry bit gesetzt
> welches eine 1
>            brne    multi1              ; mit rol einschiebt
>            ldi     temp, 0
>            ldi     temp1, 0b11111110
>
> werden.
>
> Ebenfalls im Main muss NextDigit richtig initialisiert werden (auf
> 0b11111110).

Yep. Das müsste es sein.
Kannst du das an der tatsächlichen Hardware testen und das Tutorial 
richtig stellen?

von René (Gast)


Lesenswert?

Hallo Karl,

klar, mach ich. Hatte etwas Skrupel das einfach so zu ändern ohne zu 
fragen (als Neuling im Forum).

Ich werde das ASAP tun. Bis jetzt läuft es trotzdem noch nicht wie ich 
es denke, ich kann aber noch nicht sagen ob es an meiner Hardware liegt 
oder am Program (ich benutze ein intern gemultiplexted Display von 
Kingsbright / CA56). Die Timer Routine schaltet mit 64us weiter, was 
meinem Display zu schnell ist.

Sobals es Einwandfrei läuft, mache ich das. OK?


Grüsse,
René

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.