von
blutengel (Gast)
13.02.2011 13:53
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)
13.02.2011 14:01
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)
13.02.2011 14:06
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)
13.02.2011 14:12
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)
13.02.2011 14:21
Hi
Noch etwas: Warum Initialisiert du die UART jedes mal neu? Einmal am
Programmanfang reicht.
MfG Spess
von
blutengel (Gast)
13.02.2011 17:37
Danke läuft. Noch ne andere Frage. Gibt es sowas wie switch case.
MFG
blutengel
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.