mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Software Interrupt bei pic18F458


Autor: Olli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich habe folgende Frage:
Bietet der 18F458 Software Interrupts?

Habe es im Moment so gelöst, dass ich einen Interrupt aktiviere (z.B. 
INT0) und diesen per Software setze.

Finde das UNSCHÖN. Hätte gerne Software IRs, die ich bequem setzen und 
rücksetzen kann und trotzdem alle I/O IRs nutzbar bleiben.

Im Datenblatt habe ich leider nix darüber gefunden.


Gruß O'

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was ist der Unterschied zwischen einem Softwareinterrupt und einem Call 
zu einer Funktion, die zu Anfang die Interrupts sperrt ?

Keiner.


Peter

Autor: Olli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK, dankeschön

Programmiere in C.
Muss ich das dann mit inline_Assembler machen oder gibts da 
Funktionen/Befehler.


Vielen Dank O'

Autor: tastendrücker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da wird es sicher einen Befehl zum setzen/löschen des GIE (Global 
Interrupt Enable) Flags geben. Das sollte in der Doku zum Compiler 
stehen.

Autor: Steff (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So könnte ein selber gebastelter SoftwareIR aussehen:

Void call_SWIR(char IRNr)
{
    // Deactivate Interrupts
    INTCONbits.GIEH = 0x00;
    INTCONbits.GIEL = 0x00;

    switch(IRNr)
    {
  case1:
         // CODE
       // …….
       break;
  default:
       break;
    }

    // Reactivate Interrupts
    INTCONbits.GIEH = 0x01;
    INTCONbits.GIEL = 0x01;
}


Gruß Steff

Autor: Olli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

danke für die Antworten.
Habe n bissel nachgeforscht (C18 Users Gide)

Wenn ichs richtig verstanden habe übernimmt die ISR das Deaktivieren der 
Interrupts und letztendliche Reaktivieren beim Verlassen.

Das bedeutet, dass ich meine SoftwareIRs wie folt realisieren könnte:

Struktur strctSWIR erstellen mit x gewünschten IR_Status_Bits.

Im Code:

..
..
..
strctSWIR.SWIR1 = 0x01;
high_isr();
..
..

In der high_ISR frage ich einfach strctSWIR.SWIR1 ab, so wie ich die 
I/O-Interrupts auch abfrage.

Müsste funktionieren oder?


Gruß O'

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.