Archiv verlassen und diese Seite im Standarddesign anzeigen : Bei jedem Interrupt Unterprogramm auslößen?
Hi,
ich hab hier im Forum schon mal was gefunden das daß beinhaltet was ich suche, jedoch finde ich das nicht mehr, vielleicht kann mir da ja jemand
weiter helfen?
Ich möchte das bei jedem Interrupt ein Unterprogramm ausgelößt wird.
Wie kann ich das machen?
Prüfen ob ein Interrupt ausgelößt wurde?
Torsten_G
04.01.2006, 18:17
Das lässt sich so pauschal kaum beantworten.
Gemeinerweise könnte man sagen, lies das Datasheet.
Brauchst Du Hardware-Interrupt?
Oder Timer/Counter-Interrupt?
Welchen Cip verwendest Du?
Überhaupt schon mal was ausprobiert?
Wühl Dich ruhig erstmal durch die Bascom-Programme + Hilfe.
Und dann probier was aus, wenn´s dann noch nicht richtig funzt, den Code reinstellen und das Problem schildern.
Es ist viel einfacher und lehrreicher, an einer konkreten Aufgabe zu arbeiten, als hier irgendwelche gelehrten Fachvorträge über sämtliche Interrupt-Möglichkeiten zu posten.
Viele Grüße
Torsten
Rage_Empire
04.01.2006, 18:21
Wie wärs mit einem Source, den wir analysieren können?
Hi,
das dachte ich mir schon, das daß kommen wird.
Aber nun zur sache.
Ich betreibe eine Uhr und möchte nach jedem, oder entsprechenden
Interrupt die Uhrzeit Aktualisiert ausgeben.
Wie kann ich nun feststellen, das ein Interrupt ausgelößt wurde?
Enable Interrupts
Config Date = Dmy , Separator = .
Config Clock = Soft 'this is how simple it is
Date$ = "03.01.06"
Time$ = "18:34:00"
Timsk.toie0 = 0
Assr.as0 = 1
Tccr0 = &B00010101
Timsk.toie0 = 1
Waitms 1000
Ich nutze einen Externen Uhrenquarz, der auf dem STK501 ist und einen mega128.
Die Ausgabe funktioniert bei Tastendruck und gibt mir die Uhrzeit aus, möchte aber das die Uhrzeit nach jeder sekunde ausgegeben wird, praktisch ohne immer die Taste zu drücken.
Rage_Empire
04.01.2006, 18:42
Ist das der ganze Source? Sieht irgendwie unvollständig aus. Aber zu deinem Vorhaben, da wirst du einen Timerinterrupt verwenden müssen.
Nein, das ist nicht der komplette Source.
Wie schon erwähnt, die Uhr an sich funktioniert ja und am Source sieht man
das ich da die Clock Soft nehme.
Du meinst ich benötige in etwa sowas?
https://www.roboternetz.de/phpBB2/viewtopic.php?t=15477
Verstehe ich jetzt nicht ganz, ich hab jetzt eine Uhr und muß noch einen
Timer starten um die Interrupts herraus zu bekommen, ist das richtig?
Torsten_G
04.01.2006, 20:26
Was ist bloß so schlimm daran, den vollständigen Code zu posten?
"Enable Interrupts" macht zwar die Interrupts scharf, aber Du hast ja gar keinen in Deinem Programm, zumindest nicht, soweit hier erkennbar.
Irgendwo musst Du schließlich eine Interrupt-Service-Routine bekanntgeben, was soll sich sonst tun?
z. B.:
On Timer1 ISR_Timer1 'Subroutine bei Überlauf Timer1
On Int0 ISR_Int0 'Subroutine bei Statuswechsel an Pin Int0
Und natürlich muß der jeweilige Interrupt auch konfiguriert sein.
Ob die SoftClock überhaupt einen Interrupt liefert, entzieht sich meiner Kenntnis.
Mit dem angegebenen Link bist Du schon auf der richtigen Fährte.
Konfiguriere Dir mal einen Timer (0 oder 1 sollten in jedem Fall gehen) so, dass er alle 10ms durchläuft. Dann zählst Du in der ISR des Timers gemütlich bis 100, und wenn das passiert ist, schiebst Du die Uhrzeit aufs Display und fängst von vorne an.
Viele Grüße
Torsten
Was ist bloß so schlimm daran, den vollständigen Code zu posten?
Nichts ist daran schlimm, jedoch ist da nichts drin was den Interrupt betrifft, daher nur das nötigste.
Ob die SoftClock überhaupt einen Interrupt liefert, entzieht sich meiner Kenntnis.
Der µC übernimmt die Arbeit der Uhr wenn SoftClock verwendet wird, daher
auch der sehr Kurze Source den er benötigt.
Mit dem angegebenen Link bist Du schon auf der richtigen Fährte.
Konfiguriere Dir mal einen Timer (0 oder 1 sollten in jedem Fall gehen) so, dass er alle 10ms durchläuft. Dann zählst Du in der ISR des Timers gemütlich bis 100, und wenn das passiert ist, schiebst Du die Uhrzeit aufs Display und fängst von vorne an.
Werde ich mal machen und melde mich dann wieder.
Danke für deine Hilfe.
Torsten_G
04.01.2006, 20:57
]
...
Nichts ist daran schlimm, jedoch ist da nichts drin was den Interrupt betrifft, daher nur das nötigste.
...
Woher willst Du das wissen, wenn Du Dich mit den Interrupts noch nicht auskennst? O:)
Nein, im Ernst, der vollständige Code ist immer besser, den kann man sich dann auch mal nach Bascom reinholen, kompilieren, übertragen, usw.
Aber sieh einer an, was man so alles in der Bascom-Hilfe findet - man muß (wer hätt´s gedacht!) nur bei "Suchen" mal "Softclock" eingeben... :-b
Syntax
CONFIG CLOCK = soft | USER [, GOSUB = SECTIC]
Remarks
Soft Use SOFT for using the software based clock routines. Use USER to write/use your own code in combination with an I2C clock chip for example.
Sectic This option allows to jump to a user routine with the label sectic.Since the interrupt occurs every second you may handle various tasks in the sectic label. It is important that you use the name SECTIC and that you return with a RETURN statement from this label. The usage of the optional SECTIC routine will use 30 bytes of the hardware stack. This option only works with the SOFT clock mode. It does not work in USER mode.
So wie ich das verstehe ist, wenn ich die Option Sectic nutze,
jede sekunde in den angegbenen Label springt und dies ausführt was
da an Code ist?!?
Wenn das so ist, dann wäre das daß richtige!
Die Syntax wird hier so angegeben:
Config Clock = soft | User [, GOSUB = SECTIC]
Wo gebe ich jetzt bitte den Label an, in den er springen soll?
Das hab ich ja schon drin:
Config Clock = soft
Dieses "SECTIC" muß ja angegeben werden, somit bliebe ja nur noch dies:
Config Clock = soft, meinLabel = SECTIC
Kannst du da weiterhelfen?
Torsten_G
04.01.2006, 21:37
Richtig, so verstehe ich das auch.
Aber nicht MeinLabel=Sectic sondern bitte Gosub=Sectic, wie es da steht. Sectic ist bereits der Label, und der Name ist festgelegt.
So gesehen, ist "Sectic" die ISR der Softclock...
Und dann, irgendwo, am hintersten Ende Deines Programms, außerhalb irgendwelcher Do-Loops, schreibst Du mal die magischen Zeilen des Labels... [-o<
Sectic:
'Hier steht Dein Code für die Ausgabe der Uhrzeit
'Oder toggle mal eine LED...
Return
Ich würde sagen, versuch´s doch mal so, und berichte bitte, was passiert!
Viele Grüße
Torsten
Hab das durch das probieren auch festgestellt mit dem label ;).
Hab das jetzt mal so gemacht:
Config Clock = Soft , Gosub = Sectic
'Gib die Uhrzeit an das LCD aus
Sectic:
Call Printtext(1 , 2 , Time$)
Return
Teilweise erhalt ich auf das LCD Fliegenschieß, dann kommt Kurzzeitig das
was auch ausgegeben werden soll und dann nur noch schwarz, alle Pixel
sind dann aktiviert.
Das sieht garnicht gut aus.
Torsten_G
04.01.2006, 22:57
Och Wasi, nun stell doch ENDLICH mal Deinen kompletten Code rein... #-o
Wie soll man Dir denn sonst helfen??
Echt, manchmal geht´s hier zu wie im Pentagon... :-#
Aber immerhin tut sich ja mal was.
Kommt der Display-Müll wenigstens im Sekundentakt wie erwartet?
Geh doch mal weg von der Display-Ausgabe und lass eine LED blinken, wenn´s nicht zuviel Mühe macht.
Grüße
Torsten
Hab das jetzt mal mit der LED gemacht.
$regfile = "m128def.dat"
$crystal = 4000000
'Ports konfigurieren
Config Portd = Output 'Alle Port D Pins sind Ausgänge
Config Portb = Input 'Alle Port B Pins sind Eingänge
Ddra = 00000100
Config Spi = Hard , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 4
Spiinit 'Initialisierung der SPI-Schnittstelle
Config Clock = Soft , Gosub = Sectic 'this is how simple it is
'assign the date to the reserved date$
'The format is MM/DD/YY
Date$ = "03.01.06"
Time$ = "18:34:00"
Timsk.toie0 = 0
Assr.as0 = 1
Tccr0 = &B00010101
Timsk.toie0 = 1
Enable Interrupts
Waitms 1000
Do
Loop
Sectic:
If Porta.2 = 0 Then
Toggle Porta.2
Else
Toggle Porta.2
End If
Return
End 'end program
Und das Funktioniert auch, die Led geht an und nach 1sec wieder aus usw.
Hab dann mal geprüft, ob das noch mit einem taster und Led an und aus
in der Schleife geht und das läuft.
$regfile = "m128def.dat"
$crystal = 4000000
Declare Sub Keypressed1
'Ports konfigurieren
Config Portd = Output 'Alle Port D Pins sind Ausgänge
Config Portb = Input 'Alle Port B Pins sind Eingänge
Ddra = 00000111
Config Spi = Hard , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 4
Spiinit 'Initialisierung der SPI-Schnittstelle
Config Clock = Soft , Gosub = Sectic 'this is how simple it is
'assign the date to the reserved date$
'The format is MM/DD/YY
Date$ = "03.01.06"
Time$ = "18:34:00"
Timsk.toie0 = 0
Assr.as0 = 1
Tccr0 = &B00010101
Timsk.toie0 = 1
Enable Interrupts
Waitms 1000
Do
Debounce Pina.1 , 0 , Keypressed1 , Sub 'Taster entprellen, reagiert wenn Taste losgelassen wird
Loop
Sectic:
If Porta.2 = 0 Then
Toggle Porta.2
Else
Toggle Porta.2
End If
Return
Sub Keypressed1
If Porta.1 = 1 Then
Toggle Porta.3
Else
Toggle Porta.3
End If
End Sub
End 'end program
Also das Funktioniert ja schon mal.
Torsten_G
05.01.2006, 12:24
Na also, geht doch, Wasi!
Aber jetzt bitte den Code mit dem Display, wo es Probleme gab!
Und etwas Offtopic, ich würde mal behaupten, da denkst Du zu kompliziert:
Sectic:
If Porta.2 = 0 Then
Toggle Porta.2
Else
Toggle Porta.2
End If
Return
Das sollte eigentlich genügen:
Sectic:
Toggle Porta.2
Return
Grüße
Torsten
Hallo Wasi.
Versuch doch mal folgendes:
SECTIC:
timeoutput=1 'timeoutput ist eine Variable, die Du im Hauptprogramm als Byte dimensionierst
RETURN
In Deinem Hauptprogramm überprüfst Du dann, ob die Variable timeoutput eine 1 enthält und gibst dann die Zeit aus.
Das ganze sollte dann so ähnlich aussehen.
...
...
DIM timeoutput AS BYTE
DO
if 1=timeoutput then
Printtext(1,1,TIME$)
timeoutput=0
End if
LOOP
SECTIC:
timeoutput = 1
RETURN
END 'Programmende
Ich nehme mal an, daß Du ´ne Subroutine Printtext hast, mit der Du Strings ans Display ausgibst.
So müßte es eigentlich funktionieren.
Gruß Ralf
Hab das ganze mal so versucht, um zu prüfen ob das ganze auch
funktioniert und hab es mal in die schleife geschmissen.
Do
Call Printtext(1 , 1 , Time$)
Debounce Pina.0 , 0 , Keypressed2 , Sub 'Taster entprellen
Debounce Pina.1 , 0 , Keypressed1 , Sub 'Taster entprellen
Loop
Das hat dann auch funktioniert, jedoch wird das dann zig Tausendemal
ausgeführt.
Hab jetzt das von @RalfP genommen und das funktioniert dann auch prima.
Jede sekunde wird dann die Zeit ausgegeben.
Do
Debounce Pinc.7 , 0 , Keypressed2 , Sub 'Taster entprellen, reagiert wenn Taste losgelassen wird
Debounce Pinc.6 , 0 , Keypressed1 , Sub 'Taster entprellen, reagiert wenn Taste losgelassen wird
If 1 = Timeout_min Then
Aa = Time$
Aa = Left(aa , 5)
If &H00 = Menuel Then
Aa = " " + Aa
Call Printtext(1 , 6 , Aa)
End If
If &H00 = Menuer Then
Aa = " " + Aa
Call Printtext(8 , 6 , Aa)
End If
Timeout_min = 0
End If
Loop
Sectic:
Aa = Time$
Aa = Right(aa , 2)
A = Val(aa)
If 0 = A Then
Timeout_min = 1
Danke an euch für die SUPER hilfe! ;)
Nix zu danken, gerne wieder.
Gruß Ralf :cheesy:
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.