Software Interrupt bei AVR-µC´s

Gast #4446171
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?
#4446290
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.
#4446372
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?
#4446505
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
}
Gast #4446706
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.