Forum: Mikrocontroller und Digitale Elektronik Byte shiften und seriell Ausgeben mit AVR ?


von Thomas Schmidt (Gast)


Lesenswert?

Hallo ihr,

ich habe ein Problem mit meinem Assembler Programm.
Die Funktion die ich brauche ist folgende :

Im SRAM in der Speicherstelle Adresse (0x100 im SRAM) steht eine
Adresse für einen Slave (Wert 1-127 in dez.) der angesprochen werden
soll. (hierfür aber uninteressant)

Dazu möchte ich den im Byte vom SRAM enthaltene Adresse bitweise
an einen Ausgang senden. Mein Assemblercode funktioniert aber leider
nicht richtig. Zur Kontrolle habe ich an den Ausgang eine LED
gehängt die ja unregelmässig blinken müsste wenn die einzelnen
Bits gesendet werden. Aber entweder blinkt sie gar nicht oder
total regelmässig. Ich habe genügend Pausenzeiten zur Kontrolle
eingebaut damit ich es wirklich sehe wenn sie blinkt.
Der benutzte Ausgang für die LED ist PortD , Bit2

Hier ist mein Code :

Shift_out:
           lds   r20,ADRESSE      ;Register das geShiftet werden soll
           ldi   r21,8            ;Schleifenzähler für 8 Bit.
PBin1:
     lsr   r20              ;Oberes Bit ins Carry-Bit schieben.
           brcc shift_            ;Wenn Carry log 0 springe weiter

     cbi PORTD,2            ;Invertiert löscht Bit 2 auf PortD
     rcall delay50us        ;Verzögerungszeit
           rjmp shift_weiter1

shift_:
           sbi PORTD,2      ;Invertiert setzt Bit 2 auf PortD
     rcall delay50ms        ;Verzögerungszeit

shift_weiter1:
     rcall delay50ms        ;Verzögerungszeit
           dec   r21              ;Schleifenzähler verringern.

     brne  PBin1            ;Solange wiederholen bis alle 8
                                   Bit angezeigt sind
           ret


Das dabei das Register R20 mit Nullen aufgfüllt wird ist egal
da der Wert ja im SRAM steht.
Was ist denn nur falsch an dem Programm ?

Bin für jede Hilfe dankbar!

Liebe Grüße
Thomas

von dave (Gast)


Lesenswert?

Hmm... probiers mal mit ROR (Rotate Right through CARRY) statt LSR
(Logical Shift Right).

Außerdem ist die Ausgabe verkehrt herum, glaub ich.

dave

von Thomas Schmidt (Gast)


Lesenswert?

Hallo Dave,

leider brachte Dein Vorschlag keine Lösung. Die LED blinkt
in regelmässigen Abständen ganz gleichmässig, egal welchen Wert
ich in "Adresse" reinschreibe.
Die Ausgabe müsste stimmen da ich die LED ja auf GND ziehe mit
dem PIN, sie also bei nicht gesetztem Ausgang leuchtet und umgekehrt.

Liebe Grüße
Thomas

von dave (Gast)


Lesenswert?

Ich habs grad im Simulator getestet... funktioniert bei mir...

Vielleicht liegts ja am Aufruf? zu oft? Schleife zu kurz?

dave

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.