SUART geht/geht nicht

Gast #76455
Hallo Leute!

Ich habe ein Prob mit der SUART-Lib von den AVR-Freaks (Project 59).
Auf meinem Mega32 sind ca. 50% Flash belgt. Wenn ich nun ein Zeichen
Empfange, dann landet es nicht im Empfangs-Puffer-Array. Aber die
Zähler-Variable meint, dass er was empfangen hat.
Wenn ich ein paar Files weg lasse (also die Code-Größe reduziere) dann
klappt's.
Kann es sein, dass ASM-Sprünge (oder so) nicht mehr funzen, wenn das
SUART-Modul hinter einer best. Position im Flash liegt ?
Kann ich beim linken angeben, dass er das SUART-Modul weiter vorn im
Flash platzieren soll?

Sonst nocht irgentwelche ideen?


Ich habe leider keine Ahnung von Asm, sons würde ich selbst mal drin
rum wühlen g

MfG
Sascha
Gast #76456
Ich habe mal noch eine wenig im ASM-Code gesucht, und ich glaube dass
dieser schnipsel nicht so recht funktioniert:

suart_wr_buf_0:  sts     rx_c, r24
                 lds     s_index, suart_rx_count

                 lds     s_temp1, suart_receive_string
                 cpi     s_temp1, 1
                 brne    suart_wr_buf_1


                 cpi     s_Rxbyte, RX_TERMINATION_CHAR
                 breq    suart_term_recv0

suart_wr_buf_1:  cpi     s_index, SUART_BUF_SIZE
                 breq    suart_buf_reset

suart_wr_buf_2:  ldi     z_low, lo8(suart_rx_buffer)
                 ldi     s_temp1, hi8(suart_rx_buffer)
                 add     z_low, s_index
                 adc     z_high,s_temp1
suart_wr_buf_3:  st      Z+, s_Rxbyte
                 inc     s_index
                 clr     s_temp1
                 st      Z, s_temp1

Wenn ich das richtig, sehe dann kopiert die 1. Zeile das Empfangene
Zeichen aus dem Register in der Variable rx_c. Das Funktioniert auch,
soll heissen: Wenn ich im C-Prog die variable rx_c ausgebe, dann
erhalte ich das empfangene Zeichen.

Nur das Char-Array "suart_rx_buffer" bleibt leer. Die Variable
suart_rx_count wir auch korrekt incrementiert.

suart_receive_string ist 0....

So, liebe ASM-Freude, währe schönt, wenn ihr etwas erkennen würdet.

MfG
Sascha
Gast #76457
So.. ich habe eine super-exterm-schnell-asm-crashkurs gemacht.

Nachdem ich dann endlich verstanden habe, was der Code macht, ist mir
folgendes aufgefallen:

suart_wr_buf_2:  ldi     z_low, lo8(suart_rx_buffer)
                 ldi     s_temp1, hi8(suart_rx_buffer)
                 add     z_low, s_index
                 adc     z_high,s_temp1

In der letzten Zeile wird zu z_high s_temp1 addiert, aber es ist ja
noch garnicht sicher was in z_high drin steht. Die Simulation zeigt,
das dort 2A drin steht, also wird mein Zeichen irgentwo ins Nirvana
geschrieben.

Habe also noch ein:
ldi     z_high, hi8(0x0000)
davor gebastelt, jetzt geht's.

freu

MfG
Sascha

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.