Hallo liebe AVR Gemeinde, nach mehr als 5 Jahren Babypause hab ich meinen AVR Kram entstaubt um mir mal wieder bischen Beschäftigung zu verschaffen. Leider hänge ich seit ein paar Tagen, weswegen ich mich jetzt entschlossen habe bei euch um Hilfe zu bitten. Ich verwende den Atmega16 zusammen mit dem Pollin Board. Ein LCD ist an PortA angeschlossen. Eine kleine 4 Tasterplatine mit pullups an PD0-3. Zu meinem Problem: Ich versuche erstmals mich mit den handler zu beschäftigen. Beim assimilieren mit AVR Studio tritt der Error "syntax error, unexpected INTEGER" auf, der auf die Zeile $000 verweist. Wie so viele finde ich den Fehler nicht.Hab schon viel gelesen und rumprobiert, aber ich komm nicht dahinter. Hier das Prog: .include "m16def.inc" ; LS1 = PD1 ; LS2 = PD2 ; LS3 = PD3 text0: .db "Wagen ",0 text1: .db "TEST",0 .def temp = r16 .def temp1 = r17 .def temp2 = r18 .def temp3 = r19 .cseg ;.org 0x000 jmp reset ; Reset Handler ;.org 0x002 jmp EXT_INT0 ; IRQ0 Handler $000 jmp RESET ; Reset Handler $002 jmp EXT_INT0 ; IRQ0 Handler reti ;$004 jmp EXT_INT1 ; IRQ1 Handler reti ;$006 jmp TIM2_COMP ; Timer2 Compare Handler reti ;$008 jmp TIM2_OVF ; Timer2 Overflow Handler reti ;$00A jmp TIM1_CAPT ; Timer1 Capture Handler reti ;$00C jmp TIM1_COMPA ; Timer1 CompareA Handler reti ;$00E jmp TIM1_COMPB ; Timer1 CompareB Handler reti ;$010 jmp TIM1_OVF ; Timer1 Overflow Handler reti ;$012 jmp TIM0_OVF ; Timer0 Overflow Handler reti ;$014 jmp SPI_STC ; SPI Transfer Complete Handler reti ;$016 jmp USART_RXC ; USART RX Complete Handler reti ;$018 jmp USART_UDRE ; UDR Empty Handler reti ;$01A jmp USART_TXC ; USART TX Complete Handler reti ;$01C jmp ADC ; ADC Conversion Complete Handler reti ;$01E jmp EE_RDY ; EEPROM Ready Handler reti ;$020 jmp ANA_COMP ; Analog Comparator Handler reti ;$022 jmp TWSI ; Two-wire Serial Interface Handler reti ;$024 jmp EXT_INT2 ; IRQ2 Handler reti ;$026 jmp TIM0_COMP ; Timer0 Compare Handler reti ;$028 jmp SPM_RDY ; Store Program Memory Ready Handler RESET: ; hier beginnt das Hauptprogramm ldi r16,0b00000000 ;Port D: I/0... out ddrd,r16 ;...konfigurieren ldi r16,0b00000000 ;Port B: I/0... out ddrb,r16 ;...konfigurieren ldi r16,0b01110000 ;Port A: I/0... out ddra,r16 ;...konfigurieren ldi r16,0b00000000 ;Port C: I/0... out ddrc,r16 ;...konfigurieren ldi temp1, LOW(RAMEND) ; LOW-Byte der obersten RAM-Adresse out SPL, temp1 ldi temp1, HIGH(RAMEND) ; HIGH-Byte der obersten RAM-Adresse out SPH, temp1 cbi MCUCR, 0 sbi MCUCR, 1 sbi GICR, 6 ; ldi temp, (1<<ISC01) ; INT0 auf fallende Flanke konfigurieren ; out MCUCR, temp ; ldi temp, (1<<INT0) ; INT0 aktivieren ; out GICR, 6 sei ; Interrupts allgemein aktivieren main: rcall lcd_init ; Display initialisieren rcall lcd_clear ; Display löschen ldi ZL, LOW(text0*2) ; Adresse des Strings in den ldi ZH, HIGH(text0*2) ; Z-Pointer laden rcall lcd_home rcall lcd_flash_string ; Unterprogramm gibt String aus der rjmp loop EXT_INT0: push temp ; Das SREG in temp sichern. Vorher in temp, SREG ; muss natürlich temp gesichert werden rjmp test out SREG, temp ; Die Register SREG und temp wieder pop temp ; herstellen reti loop: rjmp loop ; eine leere Endlosschleife test: rcall lcd_clear ; Display löschen ldi ZL, LOW(text1*2) ; Adresse des Strings in den ldi ZH, HIGH(text1*2) ; Z-Pointer laden rcall lcd_home rcall lcd_flash_string ; Unterprogramm gibt String aus der rjmp loop .include "lcd-routines.asm" ; LCD Funktionen
Hallo text0: .db "Wagen ",0 text1: .db "TEST",0 Die beiden Zeilen sind an falscher Stelle, die müssen mitten in den Code. Und hinter .db sind immer nur gerade Anzahl von Byte zulässig, wegen der 16-Bit in CSEG. Setz noch ne zusätzlich 0 dahinter. Gruß Peter
Hi,
>$000 jmp RESET ; Reset Handler
Was macht das $000 da? Der Befehl lautet
jmp Reset ; und nichts anderes.
Man könnte denken du hast es aus einem *.lst abgeschrieben.
viel Erfolg, Uwe
Hi Peter, danke für deine schnelle Antwort. Habe die Texte jetzt ans Ende vor die .include "lcd-routines.asm" ; LCD Funktionen gesetzt. Das mit der 0 verstehe ich allerdings nicht ganz. Könntest du mir das bitte genauer erläutern? Gruß Thomas
Hallo Uwe, das wars. Danke dir. Jetzt muss ich schnell mal in den Keller das ausprobieren. Vielen Dank euch beiden und noch einen schönen Abend. Gruß Thomas
Hallo Thomas, mit der 0 (Null) meinte ich nur, das in den String ein Zeichen fehlt damit die Anzahl in 16 bit passt. zum Beispiel: .db "TEST",0,0 sind jetzt 6 byte oder ganz ohne,(nur "Test") also 4 byte. Gruß Peter
Ahso, habs kapiert. Werde das noch ändern. Danke Peter und schönen Abend noch.
Thomas S. schrieb: > Ahso, habs kapiert. Werde das noch ändern. Brauchst du nicht, der Compiler macht das für dich - du kriegst nur eine Warnung. Beim register MCUCR und GICR kann man bits mit cbi/sbi nicht setzen/zurücksetzen. Und nicht einfach Listings abschreiben - Compiler versteht nicht, was "$0000" heißen soll...
:
Bearbeitet durch User
Peter Hofbauer schrieb: > zum Beispiel: > .db "TEST",0,0 sind jetzt 6 byte > oder ganz ohne,(nur "Test") also 4 byte. LOL. Und der String endet danach wo genau ?
Marc V. schrieb: > Brauchst du nicht, der Compiler macht das für dich - du kriegst LOL, welcher Compiler?
gilb schrieb: > Marc V. schrieb: >> Brauchst du nicht, der Compiler macht das für dich - du kriegst > > LOL, welcher Compiler? LOL, ein Experte nach dem anderen... Natürlich der Compiler für COBOL, oder ? Korinthenkacker wie du können außer Thread zumüllen absolut nichts anderes. Assembler ist Computersprache und wird demzufolge übersetzt, bzw. compiliert.
Marc V. schrieb: > Korinthenkacker Marc V. schrieb: > Assembler ist Computersprache und wird demzufolge übersetzt, bzw. > compiliert. nennt man den Vorgang nicht assembliert statt > compiliert. SCNR
Joachim B. schrieb: > nennt man den Vorgang nicht assembliert statt > compiliert. Sicher, es wird auch pascaliert, coboliert... Assemblieren heisst zusamensetzen. Der einzige Unterschied zwischen Assembler und sogenannten Hochsprachen liegt im Preprocessor. Da die meisten Assembler sehr komplexe Macros schlucken können, ist der Unterschied praktisch nicht mehr da. Ein Macro mit Parametern der andere Macros aufruft, die wiederum abhängig vom vorher definiertem CLOCK, RAM etc. sind, muß compiliert werden. Wie kompliziert das Ganze wird, ist eine andere Sache. Fakt ist, daß Computer nur Binary verstehen - alles andere wird übersetzt.
:
Bearbeitet durch User
Marc V. schrieb: > Sicher, es wird auch pascaliert, coboliert... Das kenne ich bis jetzt nur compiliert wurde bevor es dem Assembler zugeführt wird. OK bei mir ist es lange her als ich lernte, bei Hochsprachen wird erst compiliert und dann dem Assembler zugeführt der das assembliert. Das viele IDE das zusammenführen in einem gcc z.B. ich glaube seit dem verschwimmen die Grenzen, jedenfalls kann ich ja heute auch in Hochsprachen ASM Statements einfügen.
>Der einzige Unterschied zwischen Assembler und sogenannten
Hochsprachen liegt im Preprocessor
Stimmt nicht ganz, denn in Hochsprachen gibt es u.a noch sowas wie
semantische Analyse.
Marc V. schrieb: > gilb schrieb: >> Marc V. schrieb: >>> Brauchst du nicht, der Compiler macht das für dich - du kriegst >> >> LOL, welcher Compiler? > > LOL, ein Experte nach dem anderen... > > Assembler ist Computersprache und wird demzufolge übersetzt, bzw. > compiliert. Versuche besser nicht deine Welt zu erklären.
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.