Forum: Mikrocontroller und Digitale Elektronik Problem mit Handler bei Atmega16 und Assembler


von Thomas S. (suschi77)


Lesenswert?

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

von Peter Hofbauer (Gast)


Lesenswert?

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

von Uwe (Gast)


Lesenswert?

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

von Thomas S. (suschi77)


Lesenswert?

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

von Thomas S. (suschi77)


Lesenswert?

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

von Peter Hofbauer (Gast)


Lesenswert?

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

von Thomas S. (suschi77)


Lesenswert?

Ahso, habs kapiert. Werde das noch ändern.

Danke Peter und schönen Abend noch.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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
von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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 ?

von gilb (Gast)


Lesenswert?

Marc V. schrieb:
>  Brauchst du nicht, der Compiler macht das für dich - du kriegst

LOL, welcher Compiler?

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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.

von Joachim B. (jar)


Lesenswert?

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

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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
von Joachim B. (jar)


Lesenswert?

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.

von Einer der es Ernst nimmt. (Gast)


Lesenswert?

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

von gilb (Gast)


Lesenswert?

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