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