Forum: Mikrocontroller und Digitale Elektronik PIC & Interrupt


von Lukas (der von der Insel) (Gast)


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?

von (prx) A. K. (prx)


Lesenswert?

Wenn du alle Peripherie-Interrupts abschaltest (INTCON.6)...

von holger (Gast)


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

von Lukas (der von der Insel) (Gast)


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

von Lukas (der von der Insel) (Gast)


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

von Lukas (der von der Insel) (Gast)


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?

von (prx) A. K. (prx)


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.

von Lukas (der von der Insel) (Gast)


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?

von (prx) A. K. (prx)


Lesenswert?

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

von Lukas (der von der Insel) (Gast)


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

von holger (Gast)


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.

von spess53 (Gast)


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

von Lukas (der von der Insel) (Gast)


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.

von Maik W. (werner01)


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!!

von Runner (Gast)


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.

von Michael (Gast)


Lesenswert?

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

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.