Forum: Mikrocontroller und Digitale Elektronik Assembler rcall LCDinit


von Jonas (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe ein Problem in Atmel Studio 6.2
Ich habe ein Display (Displaytech162c) in Assembler zu programmieren 
aber habe Probleme bei der Einbindung des Unterprogrammes.
Ich habe schon oft in Assembler Unterprogramme und enthaltene 
Sprungmarken aufgerufen
Dieses Programm wurde aus einem größeren Kontext kopiert, in dem alles 
funktioniert. Allerdings bekomme ich einen Fehler ausgegeben, dass das 
Objekt "rcall LCDinit" nicht definiert sei und ich finde diesen Fehler 
nicht. Vielleicht könnt ihr mir ja helfen :)
Beide ".asm" Dateien befinden sich im selben Ordner.

Mit freundlichen Grüßen


Jonas

von spess53 (Gast)


Lesenswert?

Hi

>Allerdings bekomme ich einen Fehler ausgegeben, dass das
>Objekt "rcall LCDinit" nicht definiert sei und ich finde diesen Fehler
>nicht.

Fehlende .include-Anweisungen?

MfG Spess

von Jonas (Gast)


Lesenswert?

Eine Zeile über der 1. Zeile auf dem Bild steht noch 
.include"M16def.inc", aber offensichtlich fehlt da keine 
".include-Anweisung".
Hier ist der gesamte Code der .asm-Datei:
1
/*
2
 * Testprogramm.asm
3
 *
4
 * 
5
 *   Author: Jonas
6
 */ 
7
Def:  .include "M16def.inc"
8
    .def  DDR=r16        ;Datenrichtungsregister
9
    .def  Stpo=r17      ;Stackpointer
10
    .def  Schalter=r18
11
    .def  Test=r19
12
    .def  Sensor=r20      ;Wert von TCS_out
13
    .def  LCD1=r21      ;Register 1 für LCD
14
    .def  LCD2=r22      ;Register 2 für LCD
15
    .def  Time1=r23      ;Register für Zeitschleifen      
16
    .def  Time2=r24      ;Register für Zeitschleifen
17
    .def  Time3=r25      ;Register für Zeitschleifen
18
    .equ PIN_E    = 7
19
    .equ PIN_RS   = 6
20
21
Beg:    ldi Stpo, HIGH(RAMEND)  ; Stackpointer intitialisieren
22
       out SPH, Stpo      ;
23
         ldi Stpo, LOW(RAMEND)  ;
24
      out SPL, Stpo      ;
25
                
26
      ldi DDR,0b11000000    ;Port A: Display PA07: E PA06: RS
27
      out DDRA,r16      ;
28
      ldi DDR,0b01111110    ;Port B: Farbsensoren Out !OE S3 S2 S1 S0 VCC X
29
      out DDRB,r16      ;  
30
      ldi DDR,0b11111111    ;Port C: LEDs/Displaydaten Ausgang
31
      out DDRC,r16      ;
32
                  ;Port D: Schalter Eingang
33
                  
34
;loop:  in r18, PIND      ;Schalter werden ausgelesen
35
;    out PORTB,r18
36
;    out PORTC,r18  
37
;end:      rjmp loop      
38
        
39
      rcall LCDinit
40
41
  .include "Display.asm"

von spess53 (Gast)


Lesenswert?

Hi

>Hier ist der gesamte Code der .asm-Datei:

Das ist nicht der gesamte Assemblercode. Und das was ich sehe wirkt 
schon recht abschreckend.

MfG Spess

von Jonas (Gast)


Lesenswert?

> Das ist nicht der gesamte Assemblercode. Und das was ich sehe wirkt
> schon recht abschreckend.
Es gibt natürlich nocheinmal die Datei "Display.asm":
Display:
1
    
2
    /*
3
4
       rcall lcd_enable             ; Enable-Routine aufrufen
5
           rcall delay50us              ; Delay-Routine aufrufen
6
           ret                          ; zurück zum Hauptprogramm
7
    */
8
LCDpoweron:  ldi Time3,3          ;Poweron-Schleife 15ms
9
      rcall wait5ms
10
      dec Time3
11
      brne LCDpoweron
12
LCDinit:  cbi PortA,PIN_RS      ;RS auf Instruktionen setzen
13
      ldi LCD1,0b00110000      ;8-Bit-Interface
14
      out PortC,LCD1        ;Initialisierungsprozess ...
15
      call wait5ms        ;Zeitschleife
16
      out PortC,LCD1        ;...
17
      call wait50us        ;Zeitschleife
18
      call wait50us        ;"
19
      out PortC,LCD1        ;...
20
      ldi LCD1,0b00111000      ;8Bit / 2 Zeilen / 5x8
21
      out PortC,LCD1        ;
22
      rcall LCDEnable        ;
23
      rcall wait5ms
24
      ldi LCD1,0b00001100      ;Display ein / Cursor aus / Cursor blinken aus
25
      out PortC,LCD1        ;
26
      rcall LCDEnable        ;
27
      rcall wait5ms
28
      ldi LCD1,0b00000110      ;Eingabemodus zeichen nach rechts
29
      out PortC,LCD1
30
      rcall LCDEnable        ;zu LCDEnable
31
      rcall wait5ms
32
      rcall LCDClear        ;zu LCDClear
33
      rcall wait5ms
34
      ret
35
LCDClear:  
36
      cbi PortA, PIN_RS      ;
37
      ldi LCD1, 0b00000011    ;LCDDisplay löschen und Cursor zum Anfang zurück
38
      out PortC, LCD1        ;
39
      rcall LCDEnable        ;zu LCDEnable
40
      ret              ;zurück
41
LCDData:  sbi PortA,PIN_RS
42
      out PortC,LCD2
43
      rcall LCDEnable
44
      rcall wait50us
45
LCDEnable:
46
      sbi PORTA, 0                 ; Enable high
47
      nop                          
48
      nop
49
      nop
50
      cbi PORTA, 0                 ; Enable wieder low
51
      ret                          ; zurück   
52
wait5ms:
53
      ldi  Time1, (XTAL*5/607)/1000
54
  WL5ms1:  ldi  Time2, 201
55
  WL5ms2:  dec  Time2
56
      brne wL5ms2
57
      dec  Time1
58
      brne WL5ms1
59
      ret     
60
wait50us:                              ; 50µs Pause (bei 4 MHz)
61
      ldi  Time1, (XTAL*50/3)/1000000
62
wait50us_:  dec  Time1
63
      brne wait50us_
64
      ret

Aber inwiefern wirkt dies denn abschreckend?
Und wo ist nun mein Fehler?

Mit freundlichen Grüßen


Jonas

von Pastor Braune (Gast)


Lesenswert?

Das include vor dem rcall aufrufen dann ist lcdinit auch bekannt wenn es 
aufgerufen wird.

von Thomas (kosmos)


Lesenswert?

Includiere am besten gleich alles zusammen am Anfang wie es mit der M16 
Inc Datei gemacht wird.

von spess53 (Gast)


Lesenswert?

Hi

>Includiere am besten gleich alles zusammen am Anfang wie es mit der M16
>Inc Datei gemacht wird.

An den Anfang dürfen nur Includes die keinen Code enthalten.

MfG Spess

von Jonas (Gast)


Lesenswert?

Danke, wenn es nur funktioniert wenn ich die .asm Datei nur vorher 
einbinde, frage ich mich warum es in meinen anderen Programmen 
funktioniert, wenn die .asm-Dateien am Ende stehen, wie ich es auch in 
meinem Elektrotechnik-Unterricht gelernt habe?


Mit freundlichen Grüßen


Jonas Nelson

von chris (Gast)


Lesenswert?

schreibe es mal wie folgt

.include "Display.asm" und danach ein paar Leerzeichen oder nen 
Tabulator

Hab das mal nach längeren recherchieren hier im Forum rausgelesen und 
begreife nicht warum das im 6.2er Studio so absolut dämlich gemacht 
worden ist, es sei denn in neueren Updates wurde es schon geändert

von spess53 (Gast)


Lesenswert?

Hi

>schreibe es mal wie folgt

<.include "Display.asm" und danach ein paar Leerzeichen oder nen
>Tabulator

>Hab das mal nach längeren recherchieren hier im Forum rausgelesen und
>begreife nicht warum das im 6.2er Studio so absolut dämlich gemacht
>worden ist, es sei denn in neueren Updates wurde es schon geändert

Weder Leerzeichen noch Tabulatoren. Die letzte Zeile muss einfach mit 
einem ENTER abgeschlossen sein. Wenn dieses fehlt ist kein Zeilenende 
vorhanden und der Assembler verschluckt sich. Ist aber dem Type vor 
dem Bildschirm anzukreiden.

von Peter D. (peda)


Lesenswert?

Jonas schrieb:
> frage ich mich warum es in meinen anderen Programmen
> funktioniert, wenn die .asm-Dateien am Ende stehen

Es ist auch egal.
Der Assembler macht 2 Durchläufe, sonst könnte man ja nicht nach vorne 
springen.
.include fügt nur die Dateien zu einer großen zusammen, sonst nichts.

Es liegt an was anderem.

von Thomas (kosmos)


Lesenswert?

Habe es selber noch nicht gemacht den Code über mehrere Dateien zu 
verteilten. Spätestens im .cseg sollte man es doch einbinden können.

von spess53 (Gast)


Lesenswert?

Hi

>Spätestens im .cseg sollte man es doch einbinden können.

Nicht umsonst heißt das cseg, wie Codesegment.

MfG Spess

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.