Hallo,
ich möchte gerne einen Interrupt simulieren an Port PD2.
gegeben ist das folgende Programm. Nun kann ich doch rechts (Wie auf dem
Bild bei der I/O View) das 2te Bit bei PORTD setzen und es müsste nach
einem weiteren Takt den Interrupt auslösen, oder? Das macht es aber
leider nicht. Habe ich evtl. den Interrupt falsch programmiert? Beim
MCUCR ist nur das 0te Bit auf 1 gesetzt, sollte also bei jeder
Taktflankenänderung einen interrupt auslösen.
Gruss Hans
Bert Siegfried schrieb:> Nun kann ich doch rechts (Wie auf dem> Bild bei der I/O View) das 2te Bit bei PORTD setzen und es müsste nach> einem weiteren Takt den Interrupt auslösen, oder?
Nein. Damit aktivivierst du nur den Pullup-Widerstand für den Pin, der
allerdings in einer Simulation vollkommen irrelvant ist...
Wenn du es aber mit dem Eingangs -register PIND versuchen würdest...
Ja, dann könnte das glatt klappen.
Bert Siegfried schrieb:> Hallo, hat leider nicht geklappt wenn ich den 2ten Port von PIND> auf> High setzte und dann das Programm weiter laufen lasse.
Nicht den zweiten Port, sondern Bit 2 von PIND. Das ist das dritte
Kästchen von rechts in der Zeile, wo PIND davorsteht...
Alle nötigen register gesetzt?
EICRA, EICRB, EIMSK, PCICR, PCMSK usw...
Um welchen Controller geht es eigentlich?
Beim ATmega2560 z.B. hat MCUCR herzlich wenig mit irgendwelchen
Interrupts bei Flankenänderung zu tun...
Es handelt sich um den ATMega8.
Hatte mich verschrieben, sorry, ich meinte natürlich das zweite bit von
PIND nicht den Port, doch der Interrupt wird nicht ausgeführt. Muss ich
beim ATMega8 noch mehr setzen als in meinem Code, EICRA, EICRB, EIMSK,
PCICR, PCMSK usw.. sagt mir nicht viel.
Gruss und Danke
Bert
Mein Interrupt wird auch auf dem echten Controller ATMEGA8A nicht
erkannt, auch der Interrupt aus dem AVR Tutorial hier auf der Seite wird
nicht unterstützt, habe noch mit einem Multimeter gemessen, der Port PD2
fällt auf GND wenn ich den Taster betätige, also hat der Controller eine
veränderte Taktflanke und müsste nach meinem Code doch ein Interrupt
auslösen? Habe ich evtl. was falsch verstanden?
Hier noch die modifizierte Version, die nach jedem Interrupt das LED ab
bzw. anschalten soll:
Ich habe noch etwas festgestellt, ich kann die Ports PD2 und PD3 nicht
für folgendes Programm verwenden, das einfach den Wert bei PD2 bzw PD3
einliest und ihn bei PB0 ausgibt. Ich habe die Verbindung mit einem
Multimeter zu den Ports überprüft und sie ist in Ordnung.
Bert Siegfried schrieb:> Ich habe noch etwas festgestellt, ich kann die Ports PD2 und PD3> nicht> für folgendes Programm verwenden, das einfach den Wert bei PD2 bzw PD3> einliest und ihn bei PB0 ausgibt. Ich habe die Verbindung mit einem> Multimeter zu den Ports überprüft und sie ist in Ordnung.
Dann ist wohl dein Atmega defekt.
Schon dein ursprüngliches Programm funktioniert bei mir sowohl im
Simulator als auch auf realer Hardware ganz genau wie es soll. D.h.:
Anfangs sind PB0 und PB1 Low, ab dem ersten Toggeln an PD2 gehen sie auf
High.
Und auch deine zuletzt gepostete Programmversion funktioniert. Jeder
Toggle an PD2 bewirkt, daß auch PB0 toggelt. Da profitierst du von der
Tatsache, das das Eingangsregister immer einen Takt hinterherhängt,
sonst würde die Konstruktion so nämlich nicht funktionieren.
Seltsam ist, dass ich im Simulator keine Interrupts simulieren kann,
obwohl es jetzt auf dem Atmega8 funktioniert. Auch Timer interrupts
gehen nicht, obwohl der Overflow erreicht wird.
Hi
>Seltsam ist, dass ich im Simulator keine Interrupts simulieren kann,>obwohl es jetzt auf dem Atmega8 funktioniert. Auch Timer interrupts>gehen nicht, obwohl der Overflow erreicht wird.
Schon mal mit dem 4er Studio
http://www.atmel.com/tools/studioarchive.aspx
probiert? Der Simulator vom 6er Studio scheint etwas verbugt zu sein.
MfG Spess