mikrocontroller.net

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


Autor: Thomas Schmidt (Gast)
Datum:

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

Autor: dave (Gast)
Datum:

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

Autor: Thomas Schmidt (Gast)
Datum:

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

Autor: dave (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habs grad im Simulator getestet... funktioniert bei mir...

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

dave

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.