Forum: Mikrocontroller und Digitale Elektronik Verständnisfrage zum ATMEGA328P Datenblatt Speicherverwaltung Interruptvektortabelle


von Michael S. (misax)


Lesenswert?

hallo;
im Datenblatt des ATMEGA328P steht:
Address Labels Code Comments
0x0000 jmp RESET ; Reset
0x0002 jmp INT0 ; IRQ0
0x0004 jmp INT1 ; IRQ1
0x0006 jmp PCINT0 ; PCINT0
usw.
Die Adresse zählt hier von Befehl zu Befehl nur 2 Byte weiter.
Im Simulatorprogramm des AVR Studio 5 sehe ich aber im Speicher:
prog 0x0000  0c 94 1c 00 0c 94 2b 00  .”...”+.
prog 0x0008  18 95 18 95 18 95 18 95  ........
prog 0x0010  18 95 18 95 18 95 18 95
Hier zählt die Adresse von Befehl zu Befehl 4 Byte weiter.
(Mein Programm beginnt so:
jmp  start    ; 1     Reset
jmp  inter0    ; 2   External Interrupt Request 0   INT0_vect
reti      ; 3   External Interrupt Request 1   INT1_vect
reti      ; 4   Pin Change Interrupt Request 0   PCINT0_vect
reti      ; 5   Pin Change Interrupt Request 1   PCINT1_vect
reti      ; 6   Pin Change Interrupt Request 2   PCINT2_vect
usw.)
Wo ist mein Denkfehler ?

von Falk B. (falk)


Lesenswert?

Michael S. schrieb:
> Wo ist mein Denkfehler ?

Die Adressen im AVR Assembler adressieren 16 Bit Worte, die 
HEX-Darstellung aber 8 Bit Worte.

von Mora L. (moralance)


Lesenswert?

Falk B. schrieb:
> Michael S. schrieb:
>> Wo ist mein Denkfehler ?
>> https://pngtoico.io
> Die Adressen im AVR Assembler adressieren 16 Bit Worte, die
> HEX-Darstellung aber 8 Bit Worte.

Besten Dank!

: Bearbeitet durch User
von Sascha W. (sascha-w)


Lesenswert?

und noch ein Tipp:
Es empfiehlt sich die einzelnen Vectoren per .ORG auf die Adresse aus 
dem Datenblatt zu setzen, bei größeren AVR sind die Einträge 4 Byte groß 
um auch direkte Sprünge unterzubringen. Ein nacktes RETI würde bei 
einfachem hintereinander schreiben zu einem Versatz führen.
Ist hier nicht nötig, aber manchmal portiert man ja was auf ein größeres 
Model und wundert sich dann.

Sascha

von Falk B. (falk)


Lesenswert?

Sascha W. schrieb:
> bei
> einfachem hintereinander schreiben zu einem Versatz führen.
> Ist hier nicht nötig, aber manchmal portiert man ja was auf ein größeres
> Model und wundert sich dann.

Schon passiert ;-)

Beitrag "Verständnisfrage zum ATMEGA328P Datenblatt Speicherverwaltung Interruptvektortabelle"
1
jmp  inter0    ; 2   External Interrupt Request 0   INT0_vect
2
reti      ; 3   External Interrupt Request 1   INT1_vect

von Thomas F. (igel)


Lesenswert?

Sascha W. schrieb:
> per .ORG auf die Adresse aus dem Datenblatt zu setzen

Besser noch die Namen der Vektoren aus dem Include-File.
Dann ist man noch flexibler und übersichtlicher.
1
.org $0000
2
jmp RESET ; Reset Handler
3
4
.org TCC0_OVF_vect
5
jmp TCC0_OVF_irq
6
7
.org TCC0_CCA_vect
8
jmp TCC0_CCA_irq
9
10
.org PORTD_INT0_vect
11
jmp PORTD_INT0_ISR
12
13
.org TCF0_OVF_vect
14
jmp TCF0_OVF_irq

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.