Forum: Mikrocontroller und Digitale Elektronik Interupts auf mega16-Simulation


von Flip B. (frickelfreak)


Angehängte Dateien:

Lesenswert?

Hallo,
ich versuche gerade ein Programm zur auswertung van Drehencodern (asm, 
AVR Studio) und ansteuerung eines displays zu schreiben. Dafür werden 2 
Interrupts benutzt (e_int0+e_int1). Am anfang stehen die 
interruptvektoren und dann eine interruptrutine. Bei der simulation 
springt e_int1 immer in die interruprutine mitten rein (0x004) wenn ich 
die .org direktive nehme und 0x004 vor e_int1 schreibe, springt er 
dahin. Ist das nurmal und macht der echte AtMega das auch so? bug? 
Normal sollte der doch nach 0x002 springen, ich habe jetzt schon 2 
stunden etliche Fehler entfernt, auf dem controller läuft das programm 
trotzdem noch nicht. Bin langsam am Verzweifeln.

von Karl H. (kbuchegg)


Lesenswert?

Ich hab jetzt nicht durch das Programm geschaut.
Wenn du schon jeden Interrupt Vektor mit .org auf seine Position nageln 
willst, dann mach das nicht mit Zahlenwerten! Denn das bringt keine 
Sicherheit.
Hier ist zb der entsprechende Abschnitt aus dem Tut für einen Mega8
1
.include "m8def.inc"
2
 
3
.org 0x000
4
       rjmp RESET
5
.org INT0addr                 ; External Interrupt0 Vector Address
6
       reti                   
7
.org INT1addr                 ; External Interrupt1 Vector Address
8
       reti                   
9
.org OC2addr                  ; Output Compare2 Interrupt Vector Address
10
       reti                   
11
.org OVF2addr                 ; Overflow2 Interrupt Vector Address
12
       reti                   
13
.org ICP1addr                 ; Input Capture1 Interrupt Vector Address
14
       reti                   
15
.org OC1Aaddr                 ; Output Compare1A Interrupt Vector Address
16
       reti                   
17
.org OC1Baddr                 ; Output Compare1B Interrupt Vector Address
18
       reti                   
19
.org OVF1addr                 ; Overflow1 Interrupt Vector Address
20
       reti                   
21
.org OVF0addr                 ; Overflow0 Interrupt Vector Address
22
       reti                   
23
.org SPIaddr                  ; SPI Interrupt Vector Address
24
       reti                   
25
.org URXCaddr                 ; USART Receive Complete Interrupt Vector Address
26
       reti                   
27
.org UDREaddr                 ; USART Data Register Empty Interrupt Vector Address
28
       reti                   
29
.org UTXCaddr                 ; USART Transmit Complete Interrupt Vector Address
30
       reti                   
31
.org ADCCaddr                 ; ADC Interrupt Vector Address
32
       reti                   
33
.org ERDYaddr                 ; EEPROM Interrupt Vector Address
34
       reti                   
35
.org ACIaddr                  ; Analog Comparator Interrupt Vector Address
36
       reti                   
37
.org TWIaddr                  ; Irq. vector address for Two-Wire Interface
38
       reti                   
39
.org SPMaddr                  ; SPM complete Interrupt Vector Address
40
       reti                   
41
.org SPMRaddr                 ; SPM complete Interrupt Vector Address
42
       reti                   
43
 
44
.org INT_VECTORS_SIZE
45
RESET:                        ; hier beginnt das Hauptprogramm

Für die Lage des Vektoren gibt es Konstanten! Benutze sie.


Den Rest hab ich (noch) nicht durchgesehen.

von spess53 (Gast)


Lesenswert?

Hi

Der Atmega hat 2 Word pro Eintrag in der Sprungtabelle (passend für
'jmp Label'). Die Adressen stehen im Datenblatt. Noch leichter ist es, 
wenn du '.org INT0addr' bzw '.org INT1addr' schreibst. Dann setzt der 
Assembler die richtigen Werte aus der m16def.inc ein.

Übrigens ist Drehencoder+Interrupt eine dumme Idee.

MfG Spess

von Karl H. (kbuchegg)


Lesenswert?

Philipp Bigott schrieb:

> interruptvektoren und dann eine interruptrutine. Bei der simulation
> springt e_int1 immer in die interruprutine mitten rein (0x004) wenn ich
> die .org direktive nehme und 0x004 vor e_int1 schreibe, springt er
> dahin. Ist das nurmal

Ja das ist normal.
Bei solchen Fällen ist das Datenblatt dein bester Ratgeber.
Da gibt es eine wunderbare Tabelle mit den Einsprungadresse aller 
Vektoren.

Aber wie gesagt: wenn du die Konstanten in Textform benutzt, musst du 
die Adressen zahlenmässig ja gar nicht wissen und kannst daher da gar 
keinen Fehler machen.


> und macht der echte AtMega das auch so?

Ja

> bug?

Ja, bug bei dir. Du hast nicht ins Datenblatt gesehen, sondern etwas 
angenommen.

> Normal sollte der doch nach 0x002 springen,

nein, sollte er nicht.

interrupt 0      $002
interrupt 1      $004

die 4 stimmen, aber deine 1 für int 0 stimmen nicht :-)

von Flip B. (frickelfreak)


Lesenswert?

Danke so Klappt es jetzt auch auf dem Controller. (war noch ein kleiner 
fehler bei int0) Und der Code ist ohne die Zahlenwerte echt "clean". Ich 
habe im Tut jedoch gerade bemerkt, dass die dortige Liste keinen vermerk 
ala gilt nur für mega8 o.ä. hat. Der Blick ins datenblatt hätte mich 
auch sicher schlauer machen können.

Philipp

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.