www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Fehler bei Rückkehr aus einem Unterprogramm


Autor: blutengel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

Ich habe ein Problem mit meinem Code. Ich empfange über die serielle 
Schnittstelle ein Zeichen und vergleiche diese mit einer Kostanten. Sind 
beide gleich springt er auch in das Unterprogramm, das Problem ist das 
er nicht an die richtige stelle zurückspring sonder an de Anfang des 
Programms. Wo liegt da der Fehler.

MFG

blutengel



;******************************************************************
;Programm: uni_prommer.asm
;Funktion: 
;Bemerkung: 
;Autor(en): Sebastian Happe
;******************************************************************           
.include"m64def.inc"
;______________________________________________________________________________________________________________
.def temp      =   r16
.def data      =  r19
.def received_byte  =  r20
.equ CLOCK = 12000000
.equ BAUD = 9600
.equ UBRRVAL = CLOCK/(BAUD*16)-1
#define le_latch     PORTe,2
#define oe_latch      PORTe,3
#define ce_memory      PORTe,4
#define we_memory      PORTe,5
#define oe_memory      PORTe,6

;____________________________________________________________________________________________________________________
ldi temp, HIGH(RAMEND)           ;HIGH-Byte der obersten RAM-Adresse
out SPH, temp
ldi temp, LOW(RAMEND)            ;LOW-Byte der obersten RAM-Adresse
out SPL, temp

ldi temp,0xff            ;Laden des Wertes 255 in Register R16  
out ddrd,r16
ldi temp,0b1111110            ;um das Daten Richtungsregister auf Ausgang zu stellen
out ddre,temp
ldi temp,0xff
sts ddrf,temp
;||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
;Hauptprogramm
haupt:
rcall empfang          ;Auf Steuerkommandos vom PC warten


cpi received_byte,0x63
breq senden
;nop
;rcall senden




selbst:
rjmp selbst
;||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
schreiben:
cbi oe_latch

sbi we_memory
sbi ce_memory
sbi oe_memory


ldi data,0x00;

ldi zl,0b00000000
ldi zh,0b00000000
rcall senden

weiter:
rcall empfang
;;weiter:
out portd,zl
sbi le_latch
cbi le_latch

out portd,zh

cbi we_memory


sts portf,temp;;data

cbi ce_memory
nop
nop
nop

sbi ce_memory


sbi we_memory

adiw    ZH:ZL, 1

;;inc data




rjmp weiter

ret


;Hauptprogramm ende
;|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
;_______________________________________________________________________________________
  senden:
  ; Baudrate einstellen
  ldi temp, LOW(UBRRVAL)
  out UBRR0L, temp
  ldi temp, HIGH(UBRRVAL)
  sts UBRR0H, temp
  ; Frame-Format: 8 Bit
  ldi temp, (0<<USBS0)|(3<<UCSZ00)
  sts UCSR0C, temp
  sbi UCSR0B,TXEN0 ; TX aktivieren
  loop: ldi temp, 'T'
  rcall serout ; Unterprogramm aufrufen
  ldi temp, 'e'
  rcall serout ; Unterprogramm aufrufen
  ldi temp, 's'
  rcall serout ; ...
  ldi temp, 't'
  rcall serout
  ldi temp, ' '
  rcall serout
  ldi temp, 'O'
  rcall serout
  ldi temp, 'K'
  rcall serout
  ldi temp, 10
  rcall serout
  ldi temp, 13
  rcall serout
  ldi temp, 10
  rcall serout
  ldi temp, 13
  rcall serout
  ret
  serout:
  sbis UCSR0A,UDRE0 ; Warten bis UDR für das nächste
  ; Byte bereit ist
  rjmp serout
  out UDR0, temp
  ret ; zurück zum Hauptprogramm

  empfang:
  ; Baudrate einstellen
    ldi temp, LOW(UBRRVAL)
  out UBRR0L, temp
  ldi temp, HIGH(UBRRVAL)
  sts UBRR0H, temp
  ; Frame-Format: 8 Bit
  ldi temp, (0<<USBS0)|(3<<UCSZ00)
  sts UCSR0C, temp
  sbi UCSR0B, RXEN0 ; RX (Empfang) aktivieren
  receive_loop:
  sbis UCSR0A, RXC0 ; warten bis ein Byte angekommen ist
  rjmp receive_loop
  in received_byte, UDR0 ; empfangenes Byte nach temp kopieren

ret

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>cpi received_byte,0x63
>breq senden
>;nop
>;rcall senden

Ein Unterprogramm wird mit rcall/call aufgerufen. Du hast die richtige 
Variante auskommentiert.

MfG Spess

Autor: blutengel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann habe ich das mt dem Vergleichen wohl noch nicht richtig verstanden. 
Er soll ja das rcall senden nur ausführen wenn received_byte und die 
Konstante 0x63 gleich sind. Wie würde das dann richtig gemacht werden?


MFG


blutengel

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Dann habe ich das mt dem Vergleichen wohl noch nicht richtig verstanden.
>Er soll ja das rcall senden nur ausführen wenn received_byte und die
>Konstante 0x63 gleich sind. Wie würde das dann richtig gemacht werden?

Nur die Auswertung des Vergleichs ist falsch.
   cpi received_byte,0x63
   brne haupt
   rcall senden

MfG Spess

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Noch etwas: Warum Initialisiert du die UART jedes mal neu? Einmal am 
Programmanfang reicht.

MfG Spess

Autor: blutengel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke läuft. Noch ne andere Frage. Gibt es sowas wie switch case.


MFG


blutengel

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
blutengel schrieb:
> Noch ne andere Frage. Gibt es sowas wie switch case.
Noch ne andere Frage: Kommt selber lesen eigentlich auch in Betracht?
http://www.mikrocontroller.net/articles/AVR-Tutori...

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.