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


von blutengel (Gast)


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

von spess53 (Gast)


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

von blutengel (Gast)


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

von spess53 (Gast)


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

von spess53 (Gast)


Lesenswert?

Hi

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

MfG Spess

von blutengel (Gast)


Lesenswert?

Danke läuft. Noch ne andere Frage. Gibt es sowas wie switch case.


MFG


blutengel

von Läubi .. (laeubi) Benutzerseite


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-Tutorial:_Mehrfachverzweigung

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.