Forum: Mikrocontroller und Digitale Elektronik problem mit 8051er


von Tom B. (tom51)


Angehängte Dateien:

Lesenswert?

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

von Schreibtisch (Gast)


Lesenswert?

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. ;)

von Wilhelm F. (Gast)


Lesenswert?

Hast du beim ersten Wort schon einen Zeilenvorschub drin?

von THaala (Gast)


Lesenswert?

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

von Tom B. (tom51)


Lesenswert?

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

von Tom B. (tom51)


Lesenswert?

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

von Oliver J. (skriptkiddy)


Lesenswert?

Wenn du mal das ganze Assembler-File posten würdest (gut kommentiert), 
könnte man dir sicher eher helfen.

Oder ist der Rest geheim?

von Tom B. (tom51)


Lesenswert?

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

von THaala (Gast)


Lesenswert?

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

von Tom B. (tom51)


Lesenswert?

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

von Oliver J. (skriptkiddy)


Lesenswert?

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

von THaala (Gast)


Lesenswert?

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

von Tom B. (tom51)


Lesenswert?

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

von Oliver J. (skriptkiddy)


Lesenswert?

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?

von Thilo H. (thaala)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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

von Tom B. (tom51)


Lesenswert?

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.

von Oliver J. (skriptkiddy)


Lesenswert?

>Die asm datei sieht nun folgendermaßen aus:
>.....
>.....


Wofür haben wir hier eigentlich die Möglichkeit Dateien anzuhängen?

von Tom B. (tom51)


Angehängte Dateien:

Lesenswert?

ok, werde das nun in Zukunft so machen!

Gruß

Tom

von Oliver J. (skriptkiddy)


Lesenswert?

Kannst du bitte noch folgende Dateien anhängen?
1
 
2
'SilF32x.def'
3
'Work.def'
4
'Work.int'

von Tom B. (tom51)


Lesenswert?

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.

von Tom B. (tom51)


Lesenswert?

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
Noch kein Account? Hier anmelden.