Forum: Mikrocontroller und Digitale Elektronik Software Interrupt bei AVR-µC´s


von Mathias (Gast)


Lesenswert?

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?

von Falk B. (falk)


Lesenswert?

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.

von Holger L. (max5v)


Lesenswert?

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?

von Mathias (Gast)


Lesenswert?

Hintergrund ist die Erzeugung von Software-Int´s am PB5 , d.h. Reset-Pin

von Falk B. (falk)


Lesenswert?

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.

von Holger L. (max5v)


Lesenswert?

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
}

von Peter D. (peda)


Lesenswert?

Mathias schrieb:
> Einstellung des Portpins auf "Ausgang"
...
> Portpin auf Eingang KEIN Interrupt ausgelöst!!!

Weil da ausdrücklich Ausgang steht.

von Sascha (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.