Programm sendet Mist an UART

Gast #95061
Hallo,

Ich hab da ein kleines Programm geschrieben, dass Daten vom UART
einliest, ins SRAM schreibt und dann, sobald 0x13 (Enter) gesendet
wurde, wieder raussendet. Allerdings sendet es nur Dreck -
hauptsaechlich Beistriche. Interessanterweise funktioniert es aber im
Simulator (AVR Studio 4) ganz richtig, soweit ich das beurteilen kann.

Vielleicht koennt Ihr mir den entscheidenden Hinweis geben...?

Danke schon fuer Eure Muehe!
Gruesse,
johannes
Angehängte Dateien:
Gast
Hallo Johannes!

Ich bin ja nun absolut kein avr-Programmierer, aber mir fällt auf, daß
hier:

STARTSENDBUFFER:
  ldi XL, bufferstart

nur der low-byte-Teil von X gesetzt wird, später aber:

RECEIVE:
  in temp, UDR      ; read byte from UART
  out PORTB, temp      ; and write it to PORTB (LEDs)
  st X+, temp        ; store byte in SRAM

und:

SENDBUFFER:          ; send SRAM buffer back to uart
  ld temp, X+        ; read byte from SRAM and increment SRAM pointer
  rcall TRANSMIT

das ganze X-Register verwendet wird?! Bist Du sicher, daß das so
richtig ist?

Gruß
Uwe
Gast
Hallo Uwe,

Danke fuer Deine Antwort!
Nein, sicher, dass es richtig ist, bin ich keinesfalls ;-)
Das mit dem X-Register. Nun, ich dachte mir, ich ignorier das high byte
davon, lass es immer auf 0x00, dafuer kann ich eben einen maximal 255
Zeichen langen Buffer im SRAM haben. Das wuerde mir fuer's erste
reichen - so dachte ich zumindest.

Jetzt hab ich es aber ausprobiert, auch das high byte von X explizit
immer auf 0x00 zu setzen und siehe da - es geht. :) Scheint also doch
daran gelegen zu haben. Das muss ich mir wohl noch einmal durchdenken.

Dank Dir fuer Deinen hilfreichen Hinweis!

Gruesse,
johannes
Gast
Ein SRAM besteht aus vielen FlipFlops. Die müssen beim Reset nicht
zwingend auf einem definierten Pegel liegen. Du musst also jede
Speicherstelle erst einmal beschrieben haben, bevor du sie ausliest,
sonst kommt es eben zu unvorhersehbaren Effekten wie diesen hier.
Gast
Johannes, schön, daß es jetzt funktioniert. Vielleicht wende ich mich
doch noch dem AVR zu. ;-)

Zum Verstehen: Du solltest Deine Schaltung nochmals anschauen.
Vermutlich wird das obere Byte ebenfalls für die Adreßdekodierung
verwendet.

@Christof
Die SRAM-Plätze werden auf jeden Fall vorher beschrieben. (nämlich mit
den empfangenen Daten)
Gast
Hallo Christof,

Ja, da lag wohl mein Fehler. Ich dachte, dass im SRAM an sich alles
einmal auf 0x00 steht. (wie bei den ports?) (eigentlich bloed von mir,
immerhin steht im Simulator alles auf 0xFF, IIRC).

Habe jetzt ein ldi ZH, 0x00 in den RESET-Block dazugeschrieben, jetzt
geht's planmaessig.

Gruesse & Dank!
johannes
Gast
@Uwe: Hab nen kleinen Denkfehler gemacht. In diesem Fall war ja das
Register X nicht initialisiert worden. Da dies aber auch aus FlipFlops
besteht, ändert sich der Kern der Aussage nicht g
Gast
Oh, da habe ich Deinen Denkfehler mitgemacht, Christof. :)

Man sollte sich also auch keinesfalls darauf verlassen, dass die
Register am Anfang alle auf 0 stehen? Komisch, bilde mir ein, das wo
gelesen zu haben. Scheint aber wohl nur eine Einbildung zu sein...

Gruesse!
johannes
Gast
Kann natürlich sein, dass das bestimmte Controller machen, aber so lange
ich die Stelle im Datenblatt nicht kenne, setze ich das lieber vorher
manuell.

PS: Wenn UWE nicht wäre, wäre der Denkfehler niemanden aufgefallen.
Pfui Uwe!
Gast
> Man sollte sich also auch keinesfalls darauf verlassen, dass die
Register am Anfang alle auf 0 stehen?

Johannes, dazu kenne ich den/die AVR nicht gut genug. Ich habe
allerdings mal in grauer Vorzeit gelernt, daß man seine
Programm-Variablen grundsätzlich vollständig initialisieren sollte.
:-)

@Christof Ausrede akzeptiert. ;-)
Gast
Schade eigentlich, das man sich andererseits auch nicht darauf verlassen
kann, das die Register am Start keinen definierten Wert (also einen
zufälligen) haben, sonst könnte man das ja prima als Startwert für
einen Zufallszahlengenerator nehmen :-)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 22 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.