PIC & Interrupt

Gast #1444120
Lesenswert?

Hi

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

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

Das Prrogramm sieht so aus (der Code ist lang deshlab hier nur das 
wesentliche):
1
 #pragma interrupt check
2
 #pragma interruptlow check   //zur Sicherheit
3
...
4
 void check(void);
5
...
6
...
7
void main(void){...}
8
...
9
...
10
void check (){
11
   blink();
12
   INTCONbits.TMR0IF=0;   //Rücksetzen der flag
13
}

die flag wird zwar 1 wenn der Timer überlauft, aber der Interrupt wird 
nicht ausgelöst. Hat jemand einen Plan warum?
Gast #1444136
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
Gast #1444281
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?
Gast #1444885
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?
Gast #1444914
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.
Gast #1444924
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
Gast #1444934
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.
#1445002
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!!
Gast #1445330
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren