Guten Abend!
Ich bräuchte bitte wieder mal Eure Hilfe. Ich habe das Problem, dass der
curser nach jedem Wort in die neue Zeile springt. Er sollte jedoch erst
nach 2 Worten in einer Zeile in die nächste springen.
hier das Programm:
Main:
lcall Eingabe ;Aufruf der jeweiligen Unterprogramme
lcall Vergleich
; ........
; ........
ljmp Main
;-----------------------------------------------------------------------
--
; ---------------------------------------------------------
; - Unterprogramme -
; ---------------------------------------------------------
first:
mov R2,#02h
Eingabe:
lcall SP_InWait ;endlos auf Eingabe warten
Vergleich:
cjne A,vorname,VergleichNN
mov DPTR,#TXT_Ausgabe_Vorname
lcall SP_OutString
TXT_Ausgabe_Vorname:
DB 0dh, 0ah, 'Han','s', 0ah,0dh+80
jmp dekrementieren
VergleichNN:
cjne A,nachname,Eingabe
mov DPTR,#TXT_Ausgabe_Nachname
lcall SP_OutString
TXT_Ausgabe_Nachname:
DB 0dh, 0ah, 'Wimme','r', 0ah,0dh+80
jmp dekrementieren
dekrementieren:
djnz R2,Eingabe
lcall SP_OutNewLine
jmp first
Für Tipps wäre ich dankbar!
Gruß
tom
DB 0dh, 0ah, 'Han','s', 0ah,0dh+80 DB 0dh, 0ah, 'Wimme','r', 0ah,0dh+80 Ich würde behaupten, das hängt bei dir mit den cr plus lf in den Strings zusammen. ;)
Hallo, was weiß man den über die Ausgabefunktion ? Ich habe beinahe den Verdacht das die Funktion SP_OutString solange Characters printed bis des höchste Bit gesetzt ist - oder ? Demnach wird also ausgegeben cr,lf,Hans,lf,cr cr,lf,Wimmer,lf,cr (und dann gibts noch ne SP_OutNewline) also.... cr,lf müsste dann da nicht stehen: DB 0dh, 0ah, 'Han','s', 0ah,0dh+80 ; Irgendein Zeichen DB 0dh, 0ah, 'Han','s', 0ah,0dh+80h ; höchstes Bit gesetzt + 0dh Gruß, THaala
Ich hab vorhin leider aus zeitgründen nicht mehr kommentieren können. SP_OutString ;Sendet die Bytes einer Tabelle, deren Anfang im dptr steht (an die serielle Schnittstelle), nacheinander bis das oberste Bit gesetzt ist. Das oberste Bit wird dabei gelöscht und das Zeichen noch ausgegeben SP_OutNewLine ;Setzt den curser an den Anfang der nächsten Zeile Das funktioniert auch alles mit den Subroutinen, jedoch macht das programm nach jedem Wort eine neue Zeile und nicht nach jedem zweiten. Die ausgabe der Wörter passt schon so. Gruß tom
Der Nachname funktioniert nun schon mal:) Das Problem ist, dass ich mich mit dem cr lf und so überhaupt nicht auskenne. Bei Vorname habe ich jetzt: DB 'Han','s', 0ah und bei Nachname: DB 'Wimme','r', 0bh Beim Nachname funktioniert es, dass er nach zwei wörter dann eine neue Zeile macht. Beim Vorname macht er nach jedem Wort eine neue Zeile und schreibt das nächste Wort bündig mit der vorigen Wort. Es wäre toll, wenn mir das jemand erklären könnte. Gruß Tom
Wenn du mal das ganze Assembler-File posten würdest (gut kommentiert), könnte man dir sicher eher helfen. Oder ist der Rest geheim?
nein, natürlich nicht ...
das Programm läuft eigentlich schon. ich habe nur noch das Problem mit
den cr lf und das zeugs. das habe ich noch nicht richtig geschnallt.
Start:
mov sp,#Stack-1 ;Initialize Stackpointer
anl pca0md,#10111111b ;Disable Watchdog
lcall InitPort ;Initialisierung Ports, Crossbar
lcall InitOsz ;Initialisierung interner Oszillator
lcall InitSerialPort ;Initialisierung Serial Port
mov vorname,#'v'
mov nachname,#'n'
;mov dptr,#StartMessage
ljmp Main
; ---------------------------------------------------------
; - Hauptprogramm -
; ---------------------------------------------------------
Main:
lcall ini
lcall Eingabe ;Aufruf der jeweiligen Unterprogramme
;lcall Vergleich
; ........
; ........
ljmp Main
;-----------------------------------------------------------------------
-----
; ---------------------------------------------------------
; - Unterprogramme -
; ---------------------------------------------------------
ini:
mov R2,#02h
Eingabe:
lcall SP_InWait ;endlos auf Eingabe warten und in A
laden
Vergleich:
cjne A,vorname,VergleichNN
mov DPTR,#TXT_Ausgabe_Vorname
lcall SP_OutString
TXT_Ausgabe_Vorname:
DB 'Han','s', 0ah
jmp dekrementieren
VergleichNN:
cjne A,nachname,Eingabe
mov DPTR,#TXT_Ausgabe_Nachname
lcall SP_OutString
TXT_Ausgabe_Nachname:
DB 'Wimme','r', 0bh
jmp dekrementieren
dekrementieren:
djnz R2,Eingabe
lcall SP_OutNewLine
ljmp ini
Der Rest der asm datei ist nur noch zur Initialisierung der seriellen
Schnittstelle usw. Also nicht wirklich relevant. Das 'v' und 'n' habe
ich bereits in der def - datei definiert.
Gruß
tom
Ok, die richtige Ausgabe wäre dann wohl: DB 'Hans', 0ah,0dh+80h DB 'Wimmer', 0ah,0dh+80h 0ah = 10 = Linefeed -> Im Sinne des Wortes: X - Pos bleibt gleich aber es gibt einen Zeilenvorschub. (Y = Y + 1) 0dh = 13 = CarrageReturn -> Wagenrücklauf - wie bei der Schreibaschine. Der Druck startet vorne in der Zeile -> also X - Pos = 0; Also: Wei bedeutet das ? a) Neue Zeile (0ah) und b) X-Pos = 0 (0dh) alles klar ? (denk dran 80 ist nicht 80h ) Gruß, THaala
Das hat mir nun schon weiter geholfen. Danke für deine hilfe! Jedoch soll das Programm nicht nach jedem Wort eine neue Zeile machen, sondern nach jedem zweitem Wort. Und das klappt leider immer noch nicht richtig. Für die neue Zeile habe ich bereits eine Subroutine im programm. Wofür genau steht das +80h? mfg tom
Thomas B. schrieb: > Das hat mir nun schon weiter geholfen. Danke für deine hilfe! Jedoch > soll das Programm nicht nach jedem Wort eine neue Zeile machen, sondern > nach jedem zweitem Wort. Und das klappt leider immer noch nicht richtig. > Für die neue Zeile habe ich bereits eine Subroutine im programm. Wofür > genau steht das +80h? Poste mal bitte deinen gesamten Qeulltext (als Anhang). Man müsste sich mal anschauen, was die UART-Routinen machen, um dir effizent helfen zu können. Unsere Kristallkugeln sind leider im Eimer. :-) Gruß Das Skriptende Kind
Guten morgen,
-- Wofür genau steht das +80h?
Du hattest doch bestätigt, dass das Subroutine bei der Ausgabe solange
Zeichen druckt bis das höchste Bit gesetzt ist.
80h ist hexadzimal und addiert das höchste Bit zu 0dh dazu (kannst auch
gleich 8dh schreiben --- oder 128+13 = 141)
Binär: 00000001 Dezimal 1 Hexadezimal 1h
00000010 2 2h
00000100 4 4h
00001000 8 8h
00010000 16 10h
00100000 32 20h
01000000 64 40h
10000000 128 80h
Wenn du also nach jeder zweiten Zeile ein CR ausgeben willst musst du
das Management der Zeilenvorschübe selbst in die Hand nehmen:
Demnach die automatischen lf/cr - Kombinationen rausnehmen.
DB 'Han','s'+80h
DB 'Wimme','r'+80h
Jetzt das CR management über zusätzliche Aufrufe
lcall SP_OutNewLine
selbst steuern.
( Hast aber so keine Space zwischen Hans und Wimmer.)
Wenn da ein noch Space hingehört - aber nur wenn Hans schon ausgegeben
wurde ;)- Brauchts halt noch die dritte Ausgabe für einen Wort -
Trenner:
Spaceausgabe:
DB ' '+80h
viel Glück,
THaala
Danke THaala für deine Bemühungen. Leider hast du die Programmfunktion
noch nicht richtig verstanden. Sollte aber eigentlich aus dem
Flussdiagramm zu erkennen sein. Wenn ein 'v' gedrückt wird, soll "Hans"
ausgegeben werden. Wenn ein 'n' gedrückt wird, soll der "Wimmer"
ausgegeben werden. Nach 2 Wörter in einer Zeile soll der Curser an den
Anfang der nächsten Zeile gehen. Hier nochmal das Programm inkl. der
Subroutinen:
Start:
mov sp,#Stack-1 ;Initialize Stackpointer
anl pca0md,#10111111b ;Disable Watchdog
lcall InitPort ;Initialisierung Ports, Crossbar
lcall InitOsz ;Initialisierung interner Oszillator
lcall InitSerialPort ;Initialisierung Serial Port
mov vorname,#'v'
mov nachname,#'n'
;mov dptr,#StartMessage
ljmp Main
StartMessage:
;db 0dh,0ah,'Programm gestartet, geben Sie Text ein.',0dh,0ah+80h
; ---------------------------------------------------------
; - Hauptprogramm -
; ---------------------------------------------------------
Main:
lcall ini
lcall Eingabe ;Aufruf der jeweiligen Unterprogramme
lcall Vergleich
; ........
; ........
ljmp Main
;-----------------------------------------------------------------------
-----
; ---------------------------------------------------------
; - Unterprogramme -
; ---------------------------------------------------------
ini:
mov R2,#02h
Eingabe:
lcall SP_InWait ;endlos auf Eingabe warten und in A
laden
Vergleich:
cjne A,vorname,VergleichNN
mov DPTR,#TXT_Ausgabe_Vorname
lcall SP_OutString
TXT_Ausgabe_Vorname:
DB 'Han','s'+80h
jmp dekrementieren
VergleichNN:
cjne A,nachname,Eingabe
mov DPTR,#TXT_Ausgabe_Nachname
lcall SP_OutString
TXT_Ausgabe_Nachname:
DB 'Wimme','r'+80h
dekrementieren:
djnz R2,Eingabe
lcall SP_OutNewLine
ljmp main
Die Subroutinen wurden aus dem Unterprogramm auskommentiert, da ich
sonnst nicht assemblieren kann und die ganze asm datei wäre zu lange. Da
sind schon sehr viele Subroutinen drin.
;SP_OutNewLine:
;mov a,#00ah
;lcall SP_OutA
;SP_InWait:
;jnb ri,$
;mov a,sbuf
;clr ri
;ret
;SP_OutString:
;clr a
;movc a,@a+dptr
;jbc acc.7,EndSO
;lcall SP_OutA
;inc dptr
;sjmp SP_OutString
Das Programm funktioniert leider immer noch nicht so wie ich es will.
Beim Vornamen geht er nie in die neue Zeile(keine Ahnung warum). Die
Ausgabe sieht so aus:
HansHansHansHansHansHansHansHansHansHansHansHansHansHansHansHansHansHans
HansHansHansHansHansHansWimmerWimmer
WimmerWimmer
WimmerWimmer
WimmerWimmer
WimmerWimmer
WimmerWimmer
WimmerWimmer
WimmerWimmer
WimmerWimmer
Wimmer
Und so sollte es aussehen:
HansWimmer
WimmerHans
WimmerWimmer
HansHans
.......
Für guten Rat bin ich sehr dankbar!
Gruß
tom
Man kann 1. seinen Quellcode als Dateianhang hochladen und 2. gibts die
1 | .... |
Tags. Bitte in Zukunft daran denken. Wenn du den Code einfach so in einen Beitrag schreibst (vor allem bei langen Quelltexten), wird der Thread sehr unübersichtlich. Ein andere Sache. Ohne den kompletten Code kann ich dir nicht helfen. Noch was. Wenn du den Code so unkommentiert lässt, kann niemand etwas damit anfangen. Eine gute Kommentierung kommt auch dir zu Gute. Wenn du in einem halben Jahr auf den Code schaust, wirst du mit Sicherheit Probleme haben, zu erkennen, was du gemacht hast. Eine andere Sache. Da du mit THaalas Kommentaren nichts anfangen kannst und du wie es ausschaut, deinen Code selber nicht 100%-ig verstehst, würde ich dir Raten das ganze in C zu machen. Ist sehr viel übersichtlicher und einfacher. Oder ist Assembler unbedingt notwendig für dein Projekt? P.S. Um welches 8051-Derivat handelt es sich?
Ja einen Tipp hätt ich noch:
diese DB - Anweisungen liegen je nach linker statements (die ich hier
nicht sehe) einfach so mit im Programmspeicher herum.
Der Controller könnte demnach eigendeinen code ausführen den er nicht
soll.
Sammel' mal alle die Labels und Statements die mit DB beginnen und lege
sie mal vor dein ini: - Label....
TXT_Ausgabe_Nachname:
DB 'Wimme','r'+80h
TXT_Ausgabe_Vorname:
DB 'Han','s'+80h
ini:
..... blah blah
das könnte einiges bewirken.
Gruß,
THaala
Thilo Haala schrieb: > diese DB - Anweisungen liegen je nach linker statements (die ich hier > nicht sehe) einfach so mit im Programmspeicher herum. > Der Controller könnte demnach eigendeinen code ausführen den er nicht > soll. Ja, stimmt. Daten dürfen nicht ausgeführt werden !!! Es gibt dazu verschiedene Möglichkeiten: 1. alle Daten ans Ende hinter den Programmcode. 2. Daten im Code überspringen (Sprungbefehl) 3. Ausgabefunktion, die als Argument Daten hinter dem Aufruf erwartet und dann hinter die Daten zurückkehrt. Anfänger sollten nur 1. nehmen. Hier mal ein Beispiel für 3.
1 | main: acall morsestring |
2 | db 'Hello World ' |
3 | db 0 ;0 mark end of string |
4 | sjmp main |
5 | |
6 | morsestring: |
7 | pop dph ;get return address, |
8 | pop dpl ;point to string |
9 | sjmp _mst2 |
10 | _mst1: acall morsechar ;send byte |
11 | inc dptr ;point to next byte |
12 | _mst2: clr a |
13 | movc a, @a+dptr ;get byte |
14 | jnz _mst1 ;send if not 0 |
15 | jmp @a+dptr ;jump after string |
Peter
Es funktioniert nun endlich einigermaßen:) Danke, jetzt habe ich wieder etwas dazugelernt. Ich habe die TXT - Ausgabe ans Ende des Programmcode geschrieben und dabei werde ich wohl vorerst auch bleiben. Das ganze funktioniert nun ca. 10 Zeilen lang. Dann reagiert das Programm auf keine weitere Eingabe mehr. Ich vermute, dass ich nach irgendeiner Subroutine wieder zurück zum Hauptprogramm springen muss. Habe auch schon einiges überlegt und ausprobiert, jedoch ohne Erfolg. Die asm datei sieht nun folgendermaßen aus:
1 | $include (SilF32x.def) ; Include register definition file. |
2 | $INCLUDE (Work.def) |
3 | |
4 | |
5 | ; --------------------------------------------------------- |
6 | ; - NewF32x - |
7 | ; --------------------------------------------------------- |
8 | |
9 | ;NewF32x.01: Startprogramm mit serieller Schnittstelle |
10 | |
11 | ;---------------------------------------------------------------------------- |
12 | |
13 | ; --------------------------------------------------------- |
14 | ; - Reset - |
15 | ; --------------------------------------------------------- |
16 | |
17 | ORG 00000h ;Start bei 00000h |
18 | |
19 | _Reset: |
20 | ljmp Start ;Sprung über die Fixadressen der Interrupts |
21 | ;und die Interruptroutinen an den Beginn |
22 | ;des Hauptprogramms |
23 | |
24 | |
25 | ;---------------------------------------------------------------------------- |
26 | |
27 | ; --------------------------------------------------------- |
28 | ; - Interruptvektoren - |
29 | ; --------------------------------------------------------- |
30 | |
31 | $ INCLUDE (Work.int) ;Interruptvektoren ausgelagert |
32 | |
33 | ;---------------------------------------------------------------------------- |
34 | |
35 | ; --------------------------------------------------------- |
36 | ; - Initialisierung - |
37 | ; --------------------------------------------------------- |
38 | |
39 | |
40 | Start: |
41 | mov sp,#Stack-1 ;Initialize Stackpointer |
42 | anl pca0md,#10111111b ;Disable Watchdog |
43 | lcall InitPort ;Initialisierung Ports, Crossbar |
44 | lcall InitOsz ;Initialisierung interner Oszillator |
45 | lcall InitSerialPort ;Initialisierung Serial Port |
46 | mov vorname,#'v' |
47 | mov nachname,#'n' |
48 | |
49 | |
50 | ;mov dptr,#StartMessage |
51 | ljmp Main |
52 | |
53 | StartMessage: |
54 | ;db 0dh,0ah,'Programm gestartet, geben Sie Text ein.',0dh,0ah+80h |
55 | |
56 | ; --------------------------------------------------------- |
57 | ; - Hauptprogramm - |
58 | ; --------------------------------------------------------- |
59 | |
60 | |
61 | Main: |
62 | |
63 | |
64 | lcall ini |
65 | lcall Eingabe ;Aufruf der jeweiligen Unterprogramme |
66 | lcall Vergleich |
67 | lcall dekrementieren |
68 | ; ........ |
69 | ljmp Main |
70 | |
71 | |
72 | ;---------------------------------------------------------------------------- |
73 | |
74 | ; --------------------------------------------------------- |
75 | ; - Unterprogramme - |
76 | ; --------------------------------------------------------- |
77 | |
78 | |
79 | ini: |
80 | |
81 | clr c |
82 | mov R2,#02h |
83 | |
84 | |
85 | Eingabe: |
86 | |
87 | |
88 | |
89 | lcall SP_InWait ;endlos auf Eingabe warten und in A laden |
90 | |
91 | |
92 | Vergleich: |
93 | clr c |
94 | cjne A,vorname,VergleichNN |
95 | mov DPTR,#TXT_Ausgabe_Vorname |
96 | lcall SP_OutString |
97 | jmp dekrementieren |
98 | |
99 | |
100 | |
101 | |
102 | VergleichNN: |
103 | clr c |
104 | cjne A,nachname,Eingabe |
105 | mov DPTR,#TXT_Ausgabe_Nachname |
106 | lcall SP_OutString |
107 | |
108 | |
109 | dekrementieren: |
110 | |
111 | djnz R2,Eingabe |
112 | lcall SP_OutNewLine |
113 | ljmp main |
114 | |
115 | TXT_Ausgabe_Vorname: |
116 | |
117 | DB 'Han','s'+80h |
118 | |
119 | |
120 | |
121 | TXT_Ausgabe_Nachname: |
122 | |
123 | DB 'Wimme','r'+80h |
124 | |
125 | |
126 | |
127 | ; --------------------------------------------------------- |
128 | ; - Initialisiere Hardware - |
129 | ; --------------------------------------------------------- |
130 | |
131 | ;In: |
132 | ;Out: |
133 | ;Destr: |
134 | ;Cycl: |
135 | ;Stack: |
136 | ;Descr: |
137 | |
138 | InitPort: |
139 | mov p0mdin,#0ffh ;Alle Pins Digital In |
140 | mov p0mdout,#000h ;Alle Pins Open Drain |
141 | orl p0mdout,#00010000b ;Txd auf PushPull userdef |
142 | mov p0skip,#000h ;Kein Pin Skipped durch die Crossbar |
143 | mov p1mdin,#0ffh ;Alle Pins Digital In |
144 | mov p1mdout,#000h ;Alle Pins Open Drain |
145 | mov p1skip,#000h ;Kein Pin Skipped durch die Crossbar |
146 | mov p2mdin,#0ffh ;Alle Pins Digital In |
147 | mov p2mdout,#000h ;Alle Pins Open Drain |
148 | orl p2mdout,#00001100b ;Leds Kit auf PushPull userdef |
149 | mov p2skip,#000h ;Kein Pin Skipped durch die Crossbar |
150 | mov p3mdin,#0ffh ;Alle Pins Digital In |
151 | mov p3mdout,#000h ;Alle Pins Open Drain |
152 | |
153 | mov xbr0,#000h ;Crossbar0 nichts zugeordnet |
154 | orl xbr0,#00000001b ;Txd = P0.4, Rxd = P0.5 userdef |
155 | mov xbr1,#000h ;Crossbar1 nichts zugeordnet |
156 | orl xbr1,#01000000b ;Crossbar enabled |
157 | ret
|
158 | |
159 | ;---------------------------------------------------------------------------- |
160 | |
161 | ; --------------------------------------------------------- |
162 | ; - Initialisiere Oszillator - |
163 | ; --------------------------------------------------------- |
164 | |
165 | ;In: |
166 | ;Out: |
167 | ;Destr: |
168 | ;Cycl: |
169 | ;Stack: |
170 | ;Descr: |
171 | |
172 | InitOsz: |
173 | orl oscicn,#003h ;sysclk = intosz/1 |
174 | ; orl oscicn,#083h ;sysclk = intosz/1 und Start Oszillator |
175 | mov clkmul,#000h ;Initialyze UsbClock Multiplier |
176 | orl clkmul,#080h ;nach Manual |
177 | mov r2,#64h |
178 | DelIO: |
179 | nop ;Delay eventuell zu lang |
180 | nop
|
181 | djnz r2,DelIO |
182 | orl clkmul,#0c0h |
183 | mov r2,#64h |
184 | DelI1: |
185 | nop ;Delay eventuell zu lang |
186 | nop
|
187 | djnz r2,DelI1 |
188 | WaitMulRdy: |
189 | mov a,clkmul ;Warten auf Multiplier Ready |
190 | jnb acc.5,WaitMulRdy |
191 | mov clksel,#02h |
192 | |
193 | ret
|
194 | |
195 | ;---------------------------------------------------------------------------- |
196 | |
197 | ; --------------------------------------------------------- |
198 | ; - Programmsammlung für die serielle Schnittstelle - |
199 | ; - Serial Port = Uart0 = SP_xxx - |
200 | ; --------------------------------------------------------- |
201 | |
202 | ;SP_Init: Setzt den Timer1 passend für die Baudrate und startet den Timer |
203 | |
204 | ;SP_InWaitA: Wartet auf ein Zeichen (endlos), |
205 | ; übergibt es im Accu |
206 | ;SP_InAskA: Sieht nach, ob ein neues Zeichen eingetroffen ist, |
207 | ; übergibt es im Accu |
208 | |
209 | ;SP_OutA: Sendet das Byte im Accu (ergibt Char) |
210 | ;SP_OutByteR0: Sendet das Byte, auf das r0 zeigt (ergibt Char) |
211 | ;SP_OutHexA: Sendet das Byte im Accu als Hex-String (z.B. FF) |
212 | ;SP_OutByteHexR0: Sendet das Byte, auf das r0 zeigt, als Hex-String (z.B. FF) |
213 | ;SP_OutWordHexR0: Sendet das Byte, auf das r0 zeigt, und das nächste Byte als |
214 | ; Hex-String (z.B. FFFF) |
215 | ;SP_OutHexDptr: Sendet die beiden Bytes im dptr als Hex-String (z.B. FFFF) |
216 | ;SP_OutString: Sendet die Bytes einer Tabelle, deren Anfang im dptr steht, |
217 | ; nacheinander bis das oberste Bit gesetzt ist. |
218 | ; Das oberste Bit wird dabei gelöscht und das Zeichen noch ausgegeben |
219 | ;SP_OutReturn: Setzt den Cursor an den Anfang der Zeile |
220 | ;SP_OutNewLine: Setzt den Cursor an den Anfang der nächsten Zeile |
221 | |
222 | ; --------------------------------------------------------- |
223 | ; - Initialisiere Serial Port - |
224 | ; --------------------------------------------------------- |
225 | |
226 | ;In: --- |
227 | ;Out: --- |
228 | ;Destr: |
229 | ;Cycl: |
230 | ;Stack: |
231 | ;Descr: |
232 | |
233 | SP_Init: ;Set Baud Rate |
234 | InitSerialPort: |
235 | mov scon,#05ah |
236 | mov tmod,#00100001b ;Timer1 auf 8-bit-autoreload, Timer0 auf 16-bit |
237 | anl ckcon,#11110100b ;t1m = 0 (ckcon.3) 9600 Bd |
238 | orl ckcon,#00000000b ;sca = 00 (ckcon.1,ckcon.0) 9600 Bd |
239 | mov th1,#098h ;Baudrate 9600 |
240 | mov tl1,#00h |
241 | setb tr1 ;Start Timer1 |
242 | ret
|
243 | |
244 | ;---------------------------------------------------------------------------- |
245 | |
246 | ; --------------------------------------------------------- |
247 | ; - Serial Port Out Byte Hex R0 bzw. A - |
248 | ; --------------------------------------------------------- |
249 | |
250 | |
251 | ;In: --- |
252 | ;Out: --- |
253 | ;Destr: |
254 | ;Cycl: |
255 | ;Stack: |
256 | ;Descr: |
257 | |
258 | SP_OutByteHexR0: |
259 | mov a,@r0 |
260 | SP_OutHexA: |
261 | push acc |
262 | swap a ;H Nibble |
263 | anl a,#0fh ;nur Nibble |
264 | lcall HexNibToAscii |
265 | jnb ti,$ ;Warten auf fertig |
266 | clr ti |
267 | mov sbuf,a |
268 | pop acc |
269 | anl a,#0fh ;nur Nibble |
270 | lcall HexNibToAscii |
271 | jnb ti,$ ;Warten auf fertig |
272 | clr ti |
273 | mov sbuf,a |
274 | ret
|
275 | |
276 | HexNibToAscii: |
277 | add a,#30h ;Ascii erzeugen |
278 | cjne a,#3ah,HNAAskGr ;Ziffer oder Buchstabe |
279 | HNAAskGr: |
280 | jc NoAbisF |
281 | add a,#07h ;Ascii A-F |
282 | NoAbisF: |
283 | ret
|
284 | |
285 | ;---------------------------------------------------------------------------- |
286 | |
287 | ; --------------------------------------------------------- |
288 | ; - Serial Port Out Word Hex R0 - |
289 | ; --------------------------------------------------------- |
290 | |
291 | ;In: --- |
292 | ;Out: --- |
293 | ;Destr: |
294 | ;Cycl: |
295 | ;Stack: |
296 | ;Descr: |
297 | |
298 | SP_OutWordHexR0: |
299 | inc r0 ;Pointer auf H |
300 | lcall SP_OutByteHexR0 |
301 | dec r0 ;Pointer auf L |
302 | lcall SP_OutByteHexR0 |
303 | ret
|
304 | |
305 | ;---------------------------------------------------------------------------- |
306 | |
307 | ; --------------------------------------------------------- |
308 | ; - Serial Port Out Hex DPTR - |
309 | ; --------------------------------------------------------- |
310 | |
311 | ;In: dptr = zu sendendes Wort |
312 | ;Out: --- |
313 | ;Destr: |
314 | ;Cycl: |
315 | ;Stack: |
316 | ;Descr: Sendet das Wort im Dptr Hexadezimal an die serielle Schnittstelle |
317 | |
318 | SP_OutHexDptr: |
319 | mov a,dph |
320 | lcall SP_OutHexA |
321 | mov a,dpl |
322 | lcall SP_OutHexA |
323 | ret
|
324 | |
325 | ;---------------------------------------------------------------------------- |
326 | |
327 | ; --------------------------------------------------------- |
328 | ; - Seriel Port Out String - |
329 | ; --------------------------------------------------------- |
330 | |
331 | ;In: --- |
332 | ;Out: --- |
333 | ;Destr: |
334 | ;Cycl: |
335 | ;Stack: |
336 | ;Descr: |
337 | |
338 | SP_OutString: |
339 | clr a |
340 | movc a,@a+dptr |
341 | jbc acc.7,EndSO |
342 | lcall SP_OutA |
343 | inc dptr |
344 | sjmp SP_OutString |
345 | EndSO: |
346 | lcall SP_OutA |
347 | ret
|
348 | |
349 | ;---------------------------------------------------------------------------- |
350 | |
351 | ; --------------------------------------------------------- |
352 | ; - Serial Port Out R0 bzw. Accu - |
353 | ; --------------------------------------------------------- |
354 | |
355 | ;In: R0 = Pointer auf - bzw. a = zu sendendes Byte |
356 | ;Out: --- |
357 | ;Destr: |
358 | ;Cycl: |
359 | ;Stack: 0 |
360 | ;Descr: Sendet das über R0 referenzierte Byte bzw. |
361 | ; das Byte im Accu auf die serielle Schnittstelle |
362 | |
363 | SP_OutByteR0: |
364 | mov a,r0 |
365 | SP_OutA: |
366 | jnb ti,$ ;Warten auf fertig |
367 | clr ti |
368 | mov sbuf,a |
369 | ret
|
370 | |
371 | ;---------------------------------------------------------------------------- |
372 | |
373 | ; --------------------------------------------------------- |
374 | ; - Serial Port New Line bzw. Return - |
375 | ; --------------------------------------------------------- |
376 | |
377 | ;In: --- |
378 | ;Out: --- |
379 | ;Destr: |
380 | ;Cycl: |
381 | ;Stack: 0 |
382 | ;Descr: Sendet Return bzw. Return + NewLine an die serielle Schnittstelle |
383 | |
384 | SP_OutNewLine: |
385 | mov a,#00ah |
386 | lcall SP_OutA |
387 | SP_OutReturn: |
388 | mov a,#00dh |
389 | lcall SP_OutA |
390 | ret
|
391 | |
392 | ;---------------------------------------------------------------------------- |
393 | |
394 | ; ---------------------------------------------------------- |
395 | ; - Serial Port In Wait - |
396 | ; ---------------------------------------------------------- |
397 | |
398 | ;In: --- |
399 | ;Out: acc = empfangenes Zeichen |
400 | ;Destr: --- |
401 | ;Cycl: |
402 | ;Stack: 0 |
403 | ;Descr: Wartet auf ein Zeichen aus der seriellen Schnittstelle (endlos) |
404 | ; Zeichen wird im Accu übergeben |
405 | |
406 | SP_InWait: |
407 | jnb ri,$ |
408 | mov a,sbuf |
409 | clr ri |
410 | ret
|
411 | |
412 | ;---------------------------------------------------------------------------- |
413 | |
414 | ; ---------------------------------------------------------- |
415 | ; - Serial Port In Ask - |
416 | ; ---------------------------------------------------------- |
417 | |
418 | ;In: --- |
419 | ;Out: c=0: kein neues Zeichen, c=1: neues Zeichen |
420 | ; acc = empfangenes Zeichen wenn neu |
421 | ;Destr: --- |
422 | ;Cycl: |
423 | ;Stack: 0 |
424 | ;Descr: Fragt ab, ob ein neues Zeichen hereingekommen ist |
425 | ; Wenn ja wird C = 1 gesetzt und das Zeichen im Accu übergeben |
426 | ; ri wird gelöscht |
427 | |
428 | SP_InAsk: |
429 | clr c |
430 | jnb ri,VAEnd ;fragen ob neues Zeichen im Puffer |
431 | NewInVA: |
432 | setb c |
433 | mov a,sbuf ;neues Zeichen in den Accu |
434 | clr ri |
435 | VAEnd: |
436 | ret
|
437 | |
438 | ;---------------------------------------------------------------------------- |
439 | |
440 | end
|
Was könnte der Grund dafür sein, dass das Programm nur ca. 10 Zeilen lang funktioniert Gruß Tom PS: Es handelt sich um das F320 Kit von Silabs.
>Die asm datei sieht nun folgendermaßen aus: >..... >..... Wofür haben wir hier eigentlich die Möglichkeit Dateien anzuhängen?
Kannst du bitte noch folgende Dateien anhängen?
1 | |
2 | 'SilF32x.def' |
3 | 'Work.def' |
4 | 'Work.int' |
Kann ich dann gerne machen. Muss aber erst meinen Lehrer fragen. Der hat da nämlich lange dran gearbeitet. Könnte nämlich sein, dass ihm das nicht recht ist. In der work.def habe ich die HEX - Werte für den Vergleich gespeichert. Sonst denke ich sind vorerst keine Dateien notwendig. Ich bitte um Verständnis.
Ich habe den Fehler gefunden! Es lag an der Initialisierung von R2. Vielen Dank an euch! MfG Tom
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.