Hallo, ich arbeite mit dem Attiny 13A und habe im Datasheet gelesen, daß es möglich ist, trotz Einstellung des Portpins auf "Ausgang" einen Software Interrupt via PCINT auszulösen. Meine Frage ist, wie das genau funktioniert. Ich habe im COde ein SBI PinB,X gesetzt, jedoch wird trotz I-Flag aktiv und Portpin auf Eingang KEIN Interrupt ausgelöst!!! Weiß jemand evtl. warum dies so ist?
Mathias (Gast) >ich arbeite mit dem Attiny 13A und habe im Datasheet gelesen, daß es >möglich ist, trotz Einstellung des Portpins auf "Ausgang" einen Software >Interrupt via PCINT auszulösen. Ja. >Meine Frage ist, wie das genau funktioniert. Genau so, wie wenn es auf Eingang stehen würden. Denn den PIN-Zustann kann man immer zurücklesen. Und auch die PCINT-Logik sieht immer den Pinszustand, egal ob der von innen oder aussen aktiv getrieben wird. >Ich habe im COde ein SBI PinB,X gesetzt, jedoch wird trotz I-Flag aktiv >und Portpin auf Eingang KEIN Interrupt ausgelöst!!! Im Simulator? Kann sein das DORT diese Funktionalität nicht korrekt simuliert wird. Das echte Silizium kann es.
Gerade mal im Atmelstudio 7.0 Simuliert, es funktioniert. Stellt sich nur die Frage wozu es überhaupt gut ist, wenn man genau weiß wann der Pin geändert wird könnte man doch gleich eine Funktion benutzen bzw. den Code gleich nach der Pinänderung ausführen?
Hintergrund ist die Erzeugung von Software-Int´s am PB5 , d.h. Reset-Pin
Wo liegt der Sinn von Software-Interrupts? Speziell beim AVR, der keine mehrstufigen Interruptlevel kennt? Ein normaler Funktionsaufruf, ggf. voher mit Interruptsperre, tut das Gleiche.
Was PB5 angeht... Es funktioniert zumindest simuliert nur mit PB0..PB4. Allerdings kenne ich mich mit dem Simulator nicht gut aus, wer weiß ob dort noch was eingestellt werden muß. Es könnte allerdings durchaus Sinn machen, PB5 ist schließlich kein normaler IO Pin.
1 | #include <avr/io.h> |
2 | #include <avr/interrupt.h> |
3 | |
4 | #define Pin_x PB0
|
5 | volatile uint8_t isr_zaehler = 0 ; |
6 | |
7 | int main(void) |
8 | {
|
9 | //////////////////////////////////////////////////////////////////////////
|
10 | // PCINTerrupt
|
11 | GIMSK = ( 1 << PCIE); |
12 | PCMSK = ( 1 << Pin_x); |
13 | //////////////////////////////////////////////////////////////////////////
|
14 | // PORT PINS
|
15 | DDRB = 0xFF; |
16 | sei(); |
17 | while (1) |
18 | {
|
19 | for (int i = 0; i < 5; i++) |
20 | {
|
21 | PORTB |= ( 1 << Pin_x); // Pin ein |
22 | //PINB |= ( 1 << Pin_0); // Toggle Pin
|
23 | }
|
24 | for (int i = 0; i < 5; i++) |
25 | {
|
26 | PORTB &=~ ( 1 << Pin_x); // Pin aus |
27 | }
|
28 | }
|
29 | }
|
30 | |
31 | ISR(PCINT0_vect) |
32 | {
|
33 | isr_zaehler++; |
34 | }
|
Mathias schrieb: > Einstellung des Portpins auf "Ausgang" ... > Portpin auf Eingang KEIN Interrupt ausgelöst!!! Weil da ausdrücklich Ausgang steht.
Falk B. schrieb: > Wo liegt der Sinn von Software-Interrupts? Speziell beim AVR, der > keine > mehrstufigen Interruptlevel kennt? Ein normaler Funktionsaufruf, ggf. > voher mit Interruptsperre, tut das Gleiche. Das frage ich mich praktisch jedesmal wenn ich den Interrupt-Teil eines AVR-Datenblatts lese.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.