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.
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 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
Für die Lage des Vektoren gibt es Konstanten! Benutze sie. Den Rest hab ich (noch) nicht durchgesehen.
Gast
#1950375
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
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 :-)
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
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.