mikrocontroller.net

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


Autor: René (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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é

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: René (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ups, ja sorry, tippfehler, meinte natürlich:

>           ldi     temp1, 0              ; Die 7 Segment ausschalten

PS: danke fürs verschieben ;-))

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
René ich denke du hast Recht!

Im Programm
http://www.mikrocontroller.net/articles/AVR-Tutori...

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-Tutori...

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...

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

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: René (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: René (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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é

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.