Forum: Mikrocontroller und Digitale Elektronik Fehler bei Interrupt-directives


von hoerns (Gast)


Lesenswert?

Hallo Community,
ich habe unteres Programm entwickelt/zusammenkopiert für einen AtMega8. 
Beim assemblieren kommt aber folgender Fehler:

Error: Overlapping Code-segments :
  Start = 0x000E, End = 0x000E, Length = 0x0001
  Start = 0x0000, End = 0x001C, Length = 0x001D
Please check your .ORG directives !

Das Problem liegt eindeutig in Zeile 7. (".org 0x000E") Ich habe auch 
schon 0x000E durch 0x00E, 0x00e, 0x000e oder durch ADCCaddr ersetzt. 
Ergebnislos - immer dieselbe Fehlermeldung.

Kann mir jemand helfen? Das Interrupt-Kapitel im AVR-Tut habe ich mir 
schon durchgelesen.





.include "m8def.inc"

.def zero  = r18
.def count = r16
.def temp1 = r17

.org 0x000E
     rjmp increment
.org 0x0000
           rjmp    main                ; Reset Handler
;
main:
        ldi     temp1, HIGH(RAMEND)
        out     SPH, temp1

        ldi     temp1, LOW(RAMEND)
        out     SPL, temp1

        ldi     temp1, $FF
        out     DDRD, temp1

  ldi     temp1, 0




loop:
  add     ZL, temp1         ; und ausgehend vom Tabellenanfang
        adc     ZH, r18          ; die Adresse des Code Bytes berechnen

        lpm                       ; dieses Code Byte in das Register r0 
laden

        out     PORTD, r0         ; und an die Anzeige ausgeben
  rjmp loop

increment:
  inc temp1

;
Codes:                               ; Die Codetabelle für die Ziffern 0 
bis 9
                                     ; sie regelt, welche Segmente für 
eine bestimmte
                                     ; Ziffer eingeschaltet werden 
müssen
                                     ;
           .db     0b00000000        ; 0: a, b, c, d, e, f
           .db     0b10000000        ; 1: b, c
           .db     0b11000000        ; 2: a, b, d, e, g
           .db     0b11100000        ; 3: a, b, c, d, g
           .db     0b11110000        ; 4: b, c, f, g
           .db     0b11111000        ; 5: a, c, d, f, g
           .db     0b11111100        ; 6: a, c, d, e, f, g
           .db     0b11111110        ; 7: a, b, c
           .db     0b01111110        ; 8: a, b, c, d, e, f, g
           .db     0b00111110        ; 9: a, b, c, d, f, g
     .db     0b00011110
     .db     0b00001110
     .db     0b00000110
     .db      0b00000010
     .db     0b00000001

von Michael A. (Gast)


Lesenswert?

Überleg mal, auf welchem Adressbereich dein main und der folgende Code 
liegt und wie das mit dem .org 0x000E zusammenpassen soll. Das haut da 
mitten rein.

von hoerns (Gast)


Lesenswert?

@Michael A.
Hm, ich verstehe nicht ganz, was du meinst. Worauf der Interrupt 
verweist, ist doch zunächst egal, oder nicht?

von Peter II (Gast)


Lesenswert?

hoerns schrieb:
> Hm, ich verstehe nicht ganz, was du meinst. Worauf der Interrupt
> verweist, ist doch zunächst egal, oder nicht?


.org 0x0000
           rjmp    main                ; Reset Handler
;
main:


damit schreibst das mein gleich hinter den reset handler. Du musst platz 
für die anderen ISR Adresse lassen.

von hoerns (Gast)


Lesenswert?

@peter
Wenn ich .org 0x000 weglasse, dann verschwindet der Fehler und da ich 
den Reset nicht zwingend benötige, ist das Problem somit gelöst. Es 
würde mich trotzdem interessieren, wo jetzt genau der Fehler lag. Kannst 
du mir das genauer erklären? Muss ich alle Interrupt-Adressen 
hinterlegen, auch wenn ich sie nicht brauche?

von Peter II (Gast)


Lesenswert?

hoerns schrieb:
> @peter
> Wenn ich .org 0x000 weglasse, dann verschwindet der Fehler
klar, aber dann wird das Pogramm nicht sauber laufen

> würde mich trotzdem interessieren, wo jetzt genau der Fehler lag.
> Kannst du mir das genauer erklären?
keine ahung wie ich es noch anders erklären soll

> Muss ich alle Interrupt-Adressen
> hinterlegen, auch wenn ich sie nicht brauche?
nein du musst nur dafür sorgen das das eigentliche Progamm hintern den 
Vektoren losgeht.

also ein

 .org 0x??

vor das main schreiben, und dort die Adresse eintragen die nach den 
Vektoren kommt.

von hoerns (Gast)


Lesenswert?

Ok, hab es verstanden erst 0x000 dann 0x00E. Vielen Dank.

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.