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
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
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" |
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
> 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
Das include vor dem rcall aufrufen dann ist lcdinit auch bekannt wenn es aufgerufen wird.
Includiere am besten gleich alles zusammen am Anfang wie es mit der M16 Inc Datei gemacht wird.
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
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
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
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.
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.
Habe es selber noch nicht gemacht den Code über mehrere Dateien zu verteilten. Spätestens im .cseg sollte man es doch einbinden können.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.