Ich habe bisher nur ganz kleine Sachen selbst gemacht. Wie ist das mit den Interrupts. Ich möchte den Int0 verwenden mehr hat der Tiny eh nicht. Das ist Pin B.1 ok wie genau funktioniert das? Springt der bei jedem Flankenwechsel in die ISR routine und bearbeitet diese genau einmal?
Also sowohl bei steigender als auch bei fallender Flanke?
Es gibt ein paar Register mit denen man einstellen kann, ob der Interrupt bei steigender Flanke, fallender Flanke, bei jeder Flanke, einem High-Level oder einem Low-Level ausgelöst wird. Bascom erledigt das Setzen dieser Register, so dass man sie gar nicht im einzelnen kennen muss, sondern nur die richtige (und einfache!) Bascom-Syntax braucht. In der Bascom-Hilfe steht beim Befehl "Config INT0" alles wesentliche.
Dann muss man noch wissen, dass man Interrupts aus- und einschalten kann, denn mitunter kann es ja mal sein, dass das Hauptprogramm für eine Zeit eben nicht durch Interrupts gestört werden darf. Dieses Aus- und Einschalten geschieht auf zwei Ebenen:
Erstens muss man jeden einzelnen Interrupt aktiv freigeben, damit er ausgeführt werden kann. in diesem Falle wäre der Befehl Enable INT0.
Zweitens muss man eine "globale" Aktivierung aller Interrupts vornehmen, und zwar mit dem Befehl Enable Interrupts.
Nur wenn der einzelne Interrupt freigegeben ist UND die globale Freigabe erfolgt ist, werden Interrupts auch ausgeführt. Sinn dieser doppelten Freigabe-Ebene ist es, die Interrupts sowohl einzeln und gezielt ein- und ausschalten zu können, aber auch mit einem einzigen Befehl (disable Interrupts) global alle Interrupts zu deaktivieren, z.B. wenn der Controller gerade eine zeitkritische Aufgabe abarbeitet, bei der er nicht gestört werden darf.
Interrupt-Routinen (ISR) sollte so kurz wie möglich sein, um den Ablauf des Hauptprogramms nicht allzusehr aufzuhalten. In Deinem Fall könnte man das Subtrahieren der Werte aber auch gleich mit der fallenden Flanke mit erledigen und dem Hauptprogramm durch setzen eines Flag-Bits singalisieren, dass es eine neu gemessene Pulsdauer gibt. Dein Code war schon nahe dran:
Code:
...
Dim Signal_alt as Byte
Dim Signal_neu as Byte
Dim Flag as Bit
Dim Impulsdauer as Byte
Config INT0 = change
On INT0 Flanke
enable INT0
Enable Interrupts
Do
...
...
If Flag = 1 then
Flag = 0
...
(Schauen, ob der neue Impuls anders war als der zuletzt gemessene)
...
End if
Loop
ISR_Flanke:
If PINB.1 = 1 then
Signal_alt = Timer0
Else
Signal_neu = Timer0
Impulsdauer = Signal_neu - Signal_alt
Flag = 1
End if
Return
So könntest Du erstmal einen einfachen Code stricken der zunächst einmal nur überprüft, ob sich die Impulslänge nennenswert verändert hat. Wenn dieser Code läuft, könnte man den PWM-Teil dazubasteln!
Lesezeichen