Fehler bei Rückkehr aus einem Unterprogramm

Gast #2060920
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



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

21
;____________________________________________________________________________________________________________________
22
ldi temp, HIGH(RAMEND)           ;HIGH-Byte der obersten RAM-Adresse
23
out SPH, temp
24
ldi temp, LOW(RAMEND)            ;LOW-Byte der obersten RAM-Adresse
25
out SPL, temp
26

27
ldi temp,0xff            ;Laden des Wertes 255 in Register R16  
28
out ddrd,r16
29
ldi temp,0b1111110            ;um das Daten Richtungsregister auf Ausgang zu stellen
30
out ddre,temp
31
ldi temp,0xff
32
sts ddrf,temp
33
;||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
34
;Hauptprogramm
35
haupt:
36
rcall empfang          ;Auf Steuerkommandos vom PC warten
37

38

39
cpi received_byte,0x63
40
breq senden
41
;nop
42
;rcall senden
43

44

45

46

47
selbst:
48
rjmp selbst
49
;||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
50
schreiben:
51
cbi oe_latch
52

53
sbi we_memory
54
sbi ce_memory
55
sbi oe_memory
56

57

58
ldi data,0x00;
59

60
ldi zl,0b00000000
61
ldi zh,0b00000000
62
rcall senden
63

64
weiter:
65
rcall empfang
66
;;weiter:
67
out portd,zl
68
sbi le_latch
69
cbi le_latch
70

71
out portd,zh
72

73
cbi we_memory
74

75

76
sts portf,temp;;data
77

78
cbi ce_memory
79
nop
80
nop
81
nop
82

83
sbi ce_memory
84

85

86
sbi we_memory
87

88
adiw    ZH:ZL, 1
89

90
;;inc data
91

92

93

94

95
rjmp weiter
96

97
ret
98

99

100
;Hauptprogramm ende
101
;|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
102
;_______________________________________________________________________________________
103
  senden:
104
  ; Baudrate einstellen
105
  ldi temp, LOW(UBRRVAL)
106
  out UBRR0L, temp
107
  ldi temp, HIGH(UBRRVAL)
108
  sts UBRR0H, temp
109
  ; Frame-Format: 8 Bit
110
  ldi temp, (0<<USBS0)|(3<<UCSZ00)
111
  sts UCSR0C, temp
112
  sbi UCSR0B,TXEN0 ; TX aktivieren
113
  loop: ldi temp, 'T'
114
  rcall serout ; Unterprogramm aufrufen
115
  ldi temp, 'e'
116
  rcall serout ; Unterprogramm aufrufen
117
  ldi temp, 's'
118
  rcall serout ; ...
119
  ldi temp, 't'
120
  rcall serout
121
  ldi temp, ' '
122
  rcall serout
123
  ldi temp, 'O'
124
  rcall serout
125
  ldi temp, 'K'
126
  rcall serout
127
  ldi temp, 10
128
  rcall serout
129
  ldi temp, 13
130
  rcall serout
131
  ldi temp, 10
132
  rcall serout
133
  ldi temp, 13
134
  rcall serout
135
  ret
136
  serout:
137
  sbis UCSR0A,UDRE0 ; Warten bis UDR für das nächste
138
  ; Byte bereit ist
139
  rjmp serout
140
  out UDR0, temp
141
  ret ; zurück zum Hauptprogramm
142

143
  empfang:
144
  ; Baudrate einstellen
145
    ldi temp, LOW(UBRRVAL)
146
  out UBRR0L, temp
147
  ldi temp, HIGH(UBRRVAL)
148
  sts UBRR0H, temp
149
  ; Frame-Format: 8 Bit
150
  ldi temp, (0<<USBS0)|(3<<UCSZ00)
151
  sts UCSR0C, temp
152
  sbi UCSR0B, RXEN0 ; RX (Empfang) aktivieren
153
  receive_loop:
154
  sbis UCSR0A, RXC0 ; warten bis ein Byte angekommen ist
155
  rjmp receive_loop
156
  in received_byte, UDR0 ; empfangenes Byte nach temp kopieren
157

158
ret
Gast #2060935
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
Gast #2060944
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.
1
   cpi received_byte,0x63
2
   brne haupt
3
   rcall senden

MfG Spess

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren