PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bei jedem Interrupt Unterprogramm auslößen?



Wasi
04.01.2006, 16:31
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?

Wasi
04.01.2006, 18:38
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.

Wasi
04.01.2006, 18:59
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

Wasi
04.01.2006, 20:40
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.

Wasi
04.01.2006, 21:28
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

Wasi
04.01.2006, 21:58
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

Wasi
05.01.2006, 10:39
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

RalfP
05.01.2006, 15:31
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

Wasi
06.01.2006, 12:15
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! ;)

RalfP
06.01.2006, 16:11
Nix zu danken, gerne wieder.

Gruß Ralf :cheesy: