Assembler rcall LCDinit

Gast #3981653
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
Angehängte Dateien:
Gast #3981691
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"
Gast #3981710
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
Gast #3982503
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren