www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PIC & Interrupt


Autor: Lukas (der von der Insel) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Ich versuche immer noch meinen PIC 18f4685 einen Interrupt beizubringen.

Der Interrupt wird aktiviert mit folgender Routine:
void Interrupt_enable(){
  T0CON=  0b10000111;
  INTCON= 0b10100000;    //enable interrupts, enable TMR0 overflow interrupt
  INTCON2=0b00000100;    //TMR0 interrupt high priority
  RCON=   0b10000000;    //enable priority levels
  TMR0H = 0; //clear timer
  TMR0L = 0; //clear timer
}

Das Prrogramm sieht so aus (der Code ist lang deshlab hier nur das 
wesentliche):
 #pragma interrupt check
 #pragma interruptlow check   //zur Sicherheit
...
 void check(void);
...
...
void main(void){...}
...
...
void check (){
   blink();
   INTCONbits.TMR0IF=0;   //Rücksetzen der flag
}


die flag wird zwar 1 wenn der Timer überlauft, aber der Interrupt wird 
nicht ausgelöst. Hat jemand einen Plan warum?

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du alle Peripherie-Interrupts abschaltest (INTCON.6)...

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>die flag wird zwar 1 wenn der Timer überlauft, aber der Interrupt wird
>nicht ausgelöst. Hat jemand einen Plan warum?

Ganz einfach: Du hast eine Interruptroutine, aber am Interruptvektor
ist die Adresse nicht bekannt bzw. der Sprung dorthin nicht eingetragen.

void check(void);

#pragma code high_vector=0x08
  void interrupt_at_high_vector(void)
  {
   _asm GOTO check _endasm
 }
#pragma code

Autor: Lukas (der von der Insel) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
TMR0 ist ja eine interne Funktion, deshalb kann ich die periphären 
Interrupts deaktivieren. Hab trotzdem grad mal mit INTCON.6=1 verusucht, 
mit dem selben Ergebnis

Autor: Lukas (der von der Insel) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke Holger, so hats geklappt

kannst du mir bitte noch sagen, was die genannte pragma directive genau 
bewirkt bzw wie das Programm abläuft?

gruß
Lukas

Autor: Lukas (der von der Insel) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und noch eine Frage, ich hatte in der check() Funktion ursprünglich noch 
die Abfrage:

if(INTCONbits.TMR0IF==1{...

das ist doch überflüssig oder? check wird ja ausschließlich aufgerufen, 
wenn TMR0IF == 1 ist oder?

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lukas (der von der Insel) schrieb:

> das ist doch überflüssig oder? check wird ja ausschließlich aufgerufen,
> wenn TMR0IF == 1 ist oder?

Bei dir vieleicht, aber wenn noch eine Interruptquelle hinzu kommt nicht 
mehr.

Autor: Lukas (der von der Insel) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok danke erstmal. Hab noch eine Frage bez. Interrupt. Ich möchte bei 
einem bestimmten Interrupt das laufende Programm nicht nur unterbrechen 
sondern komplett stoppen und in eine Funktion springen. Wie macht man 
sowas?

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn man bei Verstand ist überhaupt nicht. Es sei denn du meinst damit 
eine Notausgang der Art "Don't Panic - STOP".

Autor: Lukas (der von der Insel) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ne, ich meine das Programm soll nicht mehr an der Stelle fortfahren, wo 
der Interrupt passierte und das Programm unterbrochen wurde, sondern 
etwas anderes machen

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>ne, ich meine das Programm soll nicht mehr an der Stelle fortfahren, wo
>der Interrupt passierte und das Programm unterbrochen wurde, sondern
>etwas anderes machen

Dein Konzept ist grundsätzlich falsch.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>ne, ich meine das Programm soll nicht mehr an der Stelle fortfahren, wo
>der Interrupt passierte und das Programm unterbrochen wurde, sondern
>etwas anderes machen

Das macht man, in dem man im Interrupt ein Flag setzt (Register oder 
Speicherstelle mit einem bestimmter Wert laden). Im Hauptprogramm wird 
das Flag abgefragt und ggf. die entsprechende Aktion ausgelöst. Danach 
wird das Flag wieder gelöscht.

MfG Spess

Autor: Lukas (der von der Insel) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, ich bastle an einer Aquariensteuerung rum. Der PIC kontrolliert 
dauernd die Sensoren und steuert dementsprechend Pumpen, Kühler, Lampen 
usw. Dies geschieht von der Funktion auto() aus.

Nun möchte ich aber noch die Tastatur abfragen was ich nun mit einem 
TimerInterrupt bewerkstelligt habe. Wenn ich nun z.B. auf Pause drücke 
soll die Funktion auto() verlassen werden (bis ich sie selber wieder 
aufrufe), und stattdessen in die Funktion manual() gesprungen werden. 
Natürlich sollen in der Funktion manual() die Tasten wieder per 
Interrupt abgefragt werden.

Autor: Maik Werner (werner01)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so jetzt will ich aber auch mal wieder was sagen hier!

dann würde ich das gedrückte Pause-Taster irgendwie speichern z.B. in 
einem Merker Bit 0 oder so. Denn der Controller soll sich ja was merken 
und der Merker wird auch ständig abgefragt in deiner Pause-Schleife und 
Autoschleife.Mit Auto-Taste löschst du das Bit einfach wieder, oder aus 
1 wird 0 und dann soll der Zeiger halt wieder in die Autoroutine hüpfen. 
Also wenn "TASTE"=5 oder so, dann Merker setzen, dann gehe in 
Paueschleife (von Automatikroutine) und in der Schleife fragst Du Merker 
wenn 0 dann gehe in die Automatikroutine.und In der Pauseroutine löschst 
Du Merker wenn der Autotaster gedrückt,Also "TASTE"=3 oder so, dann 
löschen Merker. deine Tasteninfos übergibst Du ja bestimmt in Variable 
z.B. "TASTE" oder so.
kannst aber auch nen Kippschalter nehmen ,der merkt sichs auch!!

Autor: Runner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Tag alle zusammen,
ich habe ein Problem.
Ich muss für die Arbeit mit einem PIC18F2431 eine Steuerung realisieren.
leider muss ich das in Assembler machen und weis nicht wie ich einen 
Interrupt erstellen soll.
Es wäre nett, wenn mir jemand ein Beispiel mit leicht verständlicher 
beschreibung geben könnte.
Ich muss eine Start/Stop Funktion am Pin 23 zu laufen bringen, bin aber 
noch ein blutiger Anfänger, was Programmiern angeht.

Vielen Dank für jede Hilfe.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau mal bei www.sprut.de vorbei, da sind die PICs prima erklärt, auch 
für Assembler ;)

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.