PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Interruptproblem INT_RB



RoboLeo
20.10.2005, 15:13
HI

Ich habe einen 16F628A PIC. Nun wollte ich ueber die Interruptroutine INT_RB = Interupt on pin change RB4 - RB7 eine einfache LED Steuerung realisieren. Nur so zum testen.

Mit enable_interupts(INT_RB); wird der Interrupt aktiviert.

#int_RB
RB_isr()
{
output_High(PIN_A6);
delay_ms(500);
output_Low(Pin_A6);
}


Ich bin jetzt davon ausgegangen das bei einem Wechsel einer der Eingangspins die LED kurz aufleuchtet und dann wieder erlischt.
Als ich das Programm mal simuliert habe scheint sich der PIC irgendwie in eine Schleife zu begeben. Da der Ausgang A6 bei High-Pegel an einem der Eingangspins blinkt. Sind alle Eingaenge low ist der Ausgang auch Low.

Hab ich da grundsaetzlich was falsch verstanden oder warum funkt das nicht.

Gruss

Fritzli
21.10.2005, 16:31
Hallo

1) Vergiss die Simulation von Interrupts! MPLAB macht da teilweise nicht ganz mit.

2) Ev. musst Du zuerst noch den PORTB einlesen, um die "missmatch-condition" aufzuheben, wie's im Datenblatt so schön heisst. Ich hab zwar den selben Compiler, weiss aber nicht, ob der das bereits von sich aus macht (ich mach die ISR's immer zu Fuss via #int_global).

Also wär z.B. sowas am Anfang der ISR einzubauen:



#asm
movf 6,1
#endasm


Gruess
Fritzli

RoboLeo
24.10.2005, 07:37
Sers

Das Programm hab ich mit PIC Simulator IDE simuliert. Dachte eigentlich das der schon ziemlich gut funkt.

Hab mal den Code eingefuegt. Jetzt blinkt alles nur noch zwei mal. Immerhin.

Was genau
bewirkt movf 6,1

Sorry hab von Assemblercode nicht so viel Ahnung.

Gruss

Fritzli
24.10.2005, 11:24
Hallo

'movf 6,1' wäre etwas schöner geschrieben 'movf PORTB, F'. Damit liest man den PORTB und schreibt ihn direkt wieder zurück. Warum das nötig ist, steht beim int-on-change im Datenblatt.

Was lieferst Du denn als Eingangssignal? Stimulus? Was macht die Software in realer Hardware?


Gruess
Fritzli

RoboLeo
24.10.2005, 13:23
Sers

Also das Einganssignal wird mal direkt von einem Hallsensor kommen (5V). Die Software soll dann jeweils die Impulse in einer Variablen aufaddieren und in bestimmten Zeitintervallen via RS232 ausgeben. Das ganze wird dann noch mit Labview weiterverarbeitet.
Im reallen hab ich das bis jetzt noch nicht probiert. Werd ich in den naechsten Tagen machen.
Da die Impuls der Sensoren aber in sehr kurzen Zeitabstaenden ausgeloest werden wird es wohl schwierig sein herauszufinden ob der PIC nun richtig zaehlt oder nicht.
Deswegen wollte ich das mit der Software von Oshon probieren.

Gruss

RoboLeo
25.10.2005, 07:23
Sers

Hab den Fehler gefunden. Da ich den Pins keine Variable zugewiesen habe muss man es so schreiben. Dann funkts einwandfrei.

if(input(PIN_B4) == 1)
{
hallgear++;
}

if(input(PIN_B5) == 1)
{
hallwheel++;
}


Gruss