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é
> 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.
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.
@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).
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?
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é