Forum: Mikrocontroller und Digitale Elektronik AVR Studio 4.17 - IRQ Vektoren - Bug ?


von Werner (Gast)


Angehängte Dateien:

Lesenswert?

Moin, Moin,

ich bin ein rechter Assembler dummy. Aber ich mühe mich ....
Nun wollte ich mir ein paar TWI Slaves basteln, die haben wenig aber
"schnell" zu tun.
Die Hardware ist noch nicht fertig, so habe ich mich AVR Studio an die
Firmware gemacht und simuliert.
Ich verstehe es nicht, ich möchte den TWI Interrupt benutzen,
der Simulator geht auch mit PC 0x0018 an die richtige Stelle nur die 
Tabelle ist "krum".
Ohne das .org $18 ist da schon Programcode und es macht Quatsch.

Sollte nicht jeder Vektor 2 Byte belegen ?

Grüße Werner

von spess53 (Gast)


Lesenswert?

Hi

Um welchen Controller handelt es sich?

MfG Spess

von Werner (Gast)


Lesenswert?

Hi,
das war schnell. Frohes Neues ...

Es soll ein DDS mit ATmega48 werden,
Nicht perfekt, TwoWire im extended IO, sie liegen aber rum :0)

mfg Werner

von spess53 (Gast)


Lesenswert?

Hi

>Es soll ein DDS mit ATmega48 werden,

Das ist aber nicht die Interruptvektortabelle vom ATMega48.

MfG Spess

von Karl H. (kbuchegg)


Lesenswert?

Der Memory Dump stimmt doch mit dem überein was du programmiert hast.
Genau auf hex 18 ist der Jump zu deinem Handler eingetragen.

Ob das jetzt zum Mega48 passt weiß ich nicht. In solchen Fällen ziehe 
ich die symbolischen Namen direkten Zahlenangaben vor. Denn die stimmen, 
wenn das jeweilige inc File korrekt erzeugt wurde (wovon ich bei einem 
Atmel Produkt erst mal ausgehe)

von spess53 (Gast)


Lesenswert?

Hi

>Ob das jetzt zum Mega48 passt weiß ich nicht.

Nein, passt nicht. Seine stammt vom ATMega8.

MfG Spess

von Werner (Gast)


Lesenswert?

Mhmm.

Ich habe mich an den ATmega8 gehalten.
Das Datenblatt von AVR für den 48er schweigt sich aus,
oder ich finde das Richtige nicht
Es beschreibt eigentlich nur Unterschiede.

Der Simulator erwartet den Vektor auf jeden Fall an der Adresse des 8er.
Wie tickt denn dann der reale 48er?

mfg Werner

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Werner schrieb:
> Es beschreibt eigentlich nur Unterschiede.

Dann hast du wohl nicht das Datenblatt, sondern eine migration appnote
oder sowas.

von Karl H. (kbuchegg)


Lesenswert?

Werner schrieb:
> Mhmm.
>
> Ich habe mich an den ATmega8 gehalten.
> Das Datenblatt von AVR für den 48er schweigt sich aus,

Wie bitte?

http://www.atmel.com/dyn/resources/prod_documents/doc2545.pdf

Seite 59

> Es beschreibt eigentlich nur Unterschiede.

Ähm. Du musst schon ins richtige Datenblatt schauen und nicht in 
irgendein Verkaufs-Summary-Datenblatt für BWL Leute

von Noname (Gast)


Lesenswert?

Seite 56
aber das mit den rjmps (Ein-Wort Einträge) stimmt.

von Werner (Gast)


Lesenswert?

Das geht schneller als ich tippe...

include "m48def.inc" habe ich da drin.
Das Enviorment sthet auf ATmega48.
Der Simulator will dann auf TWI bei $18 eingenordet werden.
Nur der Code erzeugt nicht alle RETIs ?

von Karl H. (kbuchegg)


Lesenswert?

Werner schrieb:
> Das geht schneller als ich tippe...
>
> include "m48def.inc" habe ich da drin.
> Das Enviorment sthet auf ATmega48.
> Der Simulator will dann auf TWI bei $18 eingenordet werden.
> Nur der Code erzeugt nicht alle RETIs ?

Weil dein  Code nicht alle Interrupt Vektoren mir rjmp belegt, die der 
Mega48 hat.
Zähl doch mal nach: Du hast vor dem .org $18 insgesamt 17 Handler 
eingetragen (16 Handler ud ein Sprung beim Reset). $18 ist aber HEX 18, 
also dezimal 24. Logisch, dass da eine Lücke ist, die du im Memory Dump 
siehst. Aber wenn du im Memory Dump wieder abzählst, wieviele 
Ret-Instruktionen da sind, dann sind es wieder 16.

von spess53 (Gast)


Lesenswert?

Hi

>Nur der Code erzeugt nicht alle RETIs ?

Weil der ATMega48 mehr Interrupts besitzt und der für TWI deshalb an 
einer anderen Stelle liegt.

Also Code anpassen.

MfG Spess

von Karl H. (kbuchegg)


Lesenswert?

So was schreibt man so
1
     rjmp Reset
2
3
.org TWIaddr
4
     rjmp TwiHandler
5
6
.org INT_VECTORS_SIZE
7
Reset: ....

dann kann dir völlig egal sein, wo genau im Speicher der Vektor sein 
muss. Und es braucht dich auch nicht zu interessieren, dass es der 24.te 
ist.

von Noname (Gast)


Lesenswert?

>Der Simulator will dann auf TWI bei $18 eingenordet werden.
Den Satz verstehe ich nicht.

Du hast ein ganz anderes Problem.
Entweder Du definierst in Deinem Code nur einen Teil der 
Interruptvectoren oder alle.
Im ersten Fall brauchst Du nach den Lücken in deinen rjmps ein .org 
sonst folgt der nächste rjmp direkt, also an falscher Stelle.
Das ist hier am Anfang der Fall, weil z.B.
1
0x003 rjmp PCINT0 ; PCINT0 Handler
2
0x004 rjmp PCINT1 ; PCINT1 Handler
3
0x005 rjmp PCINT2 ; PCINT2 Handler

fehlen.
Deswegen steht bei fehlendem .org 18 da schon Code.

Oder definiere einfach alle Interrupt Vektoren.

von Stefan E. (sternst)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Und es braucht dich auch nicht zu interessieren, dass es der 24.te
> ist.

Ist es auch gar nicht. Es ist der 18. Er hat Vector-Nummer und Adresse 
verwechselt.

von Werner (Gast)


Lesenswert?

Danke, Danke,

ich habe aus dem Link nun das "richtige" Datenblatt.
Keine "migration" PR mehr.
Das passt jetzt schon.

Aller Mühsam ist Anfang oder was war da schwer ?

von Karl H. (kbuchegg)


Lesenswert?

Stefan Ernst schrieb:
> Karl Heinz Buchegger schrieb:
>> Und es braucht dich auch nicht zu interessieren, dass es der 24.te
>> ist.
>
> Ist es auch gar nicht.

richtig. Es ist der 25.te.
Mein Fehler.

> Es ist der 18. Er hat Vector-Nummer und Adresse
> verwechselt.

Du hast gerade hex und dezimal verwechselt. genau wie der TO

von Stefan E. (sternst)


Lesenswert?

Karl Heinz Buchegger schrieb:
>> Es ist der 18. Er hat Vector-Nummer und Adresse
>> verwechselt.
>
> Du hast gerade hex und dezimal verwechselt. genau wie der TO

Nee, viel schlimmer, ich habe TWI und SPI verwechselt. :-D

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.