Forum: Mikrocontroller und Digitale Elektronik Timerproblem mit BASCOM


von Markus (Gast)


Lesenswert?

Hallo Timerbascomtüftler,

ich habe ein kleines Problem mit den Timern in BASCOM. Bin auch totaler
Mehrbein-Anfänger, deshalb versuche ich mich gerade mit BASCOM an die
kleinen Käfer heranzutasten.

Nachdem ich mehrere Threads gelesen habe, daß die 8bit und 16Bit Timer
zB. im ATMEGA16 nur wenige Millisekunden vor sich hinzählen können bis
sich dann ein Interrupt meldet. Das wäre aber recht ungeschickt für
mein Programm. Deshalb mal etwas mehr dazu:

Es soll nach einem Tastendruck ein kleiner Timer/Counter aktiviert
werden, der nach ca. 3 Sekunden (Timer-Überlauf) eine Aktion
durchführt. Wait oder Waitms (o.ä.) ist unbrauchbar, da das Programm
durch diesen Befehl komplett angehalten wird. Genauer gesagt, nach dem
Tastendruck sollen die Fenster im Auto betätigt werden, und das
Innenlicht zB. 10sek später ausgehen (zwei Timer die zu
unterschiedlichen Zeiten gestartet werden und unterschiedlich
aufhören). Den jeweiligen Status was an und was aus ist würde ich dann
auch in eine Variable schreiben, damit falls sich der Controller mal
verschluckt nicht zufällig das Licht angeht. Ebenfalls hatte ich bei
der Realisierung schon daran gedacht in der Überlauf-Verzweigung den
Timer erneut anzuschubsen, damit man durch mehrmaliges hochzählen
künstlich auf die 3 Sekunden / 10 Sekunden kommt. Ob das möglich und
sinnvoll ist? Vielleicht hat auch jemand eine schlaue andere Idee wie
man so etwas kniffliges in den Griff bekommt. Falls nötig kann ich mal
das bisherige (etwas dürftige) Programm-Gerüst hochladen.

Kann mir da mal jemand einen heißen Tip geben?? ;-) Dann geht
hoffentlich auch mir ein Licht auf plink
thnx!! Markus

von Dirk (Gast)


Lesenswert?

Hi,

ein kleiner Tip:

wenn du den Timer1 im overflow Betrieb dafuer missbrauchen willst. 4Mhz
/ 64 = 1.05 sec kommt ein overflow da der Timer1 ein 16 Bit Zaehler ist
... damit du nun alle 3 Sekunden dein Ereignis startet koenntest du in
der Timer1_isr eine Variabel hochzaehlen. Wenn die Variabel 3 ist setzt
du ein flag in der ISR und fragst im Hauptprg das Flag ab.

Mfg

Dirk

von Markus (Gast)


Lesenswert?

Hi Dirk,

Danke das ging ja schnell! Das ist eine gute Idee das mit Flags bzw
Interrupts zu lösen.

Noch etwas, der Pin, der die Fenster rauf und runter schalten soll,
sollte ca. 3sec gedrückt werden.

Wenn ich das richtig verstanden habe müßte es dann so aussehen:
-------------------> schnipp
...
Config Timer1 = Timer , Prescale = 64
On Ovf1 Tim1_isr
Enable Timer1
Enable Interrupts
Do
if tuer.offen=1 then fenster.runter 'ist als set pinb.2 definiert
Set Tifr.1
if y<3 then
 start timer1
else
 y=1
 zeitabgelaufen.flag.gesetzt=1
end if
if zeitabgelaufen.flag.gesetzt=1 then fenster.rauf
... 'etwas mehr Aufgaben hier
loop

Tim1_isr:
   y=y+1
Return
...
<-------------------schnapp

Aber was ich nicht so verarbeiten konnte: ein Flag setzen
Welche und Flag's bietet der ATMEGA16? In der Hilfe von BASCOM konnte
ich nur die Interrupts der Timer finden. Das wäre beim Timer0 der Ovf0,
beim Timer1 Ovf1. Gibt es auch noch welche die man dort für universelle
Aufgaben verwenden kann?
Zitat Hilfe:
INT0, INT1, INT2, INT3, INT4,INT5, TIMER0 ,TIMER1, TIMER2, ADC , EEPROM
, CAPTURE1, COMPARE1A, COMPARE1B,COMPARE1. Or you can use the AVR name
convention :
OC2 , OVF2, ICP1, OC1A, OC1B, OVF1, OVF0, SPI, URXC,
UDRE, UTXC, ADCC, ERDY and ACI.

Sorry wenn das etwas eine etwas zu einfache Sichtweise ist, bin halt
noch Anfänger :o)
greez und Danke!!
Markus

von Dirk (Gast)


Lesenswert?

Hi,

ich meinte als Flag eine Variabel.

Dim Flag_Bit As Bit


und dann einfach in der ISR dann Flag_Bit = 1

dann fragst du im MainPrg das Flag ab z.B.

if Flag_Bit =  1 then
toggle Portc.1
end if


Damit das so funktioniert mit deiner Taste 3 Sek druecken musst du erst
die Taste entprellen.

Mfg

Dirk

von Peter D. (peda)


Lesenswert?

Wenn man mehrere Zeitabläufe parallel ausführen will, ist natürlich ein
Scheduler bestens geeignet.

Man übergibt ihm einfach die Funktion und sagt ihm führe diese dann und
dann aus und fertig.
Dann kann man sofort mit den nächsten Aufgaben fortfahren und der
Scheduler kümmert sich automatisch um den Ablauf.

Hier mal ein komplettes Beispiel:

http://www.mikrocontroller.net/forum/read-4-49709.html#49709

Ist aber in C geschrieben, da man dafür ja Zeiger auf Funktionen
übergeben muß.


Peter

von Markus (Gast)


Lesenswert?

Hi
erstmal ein ganz großes Danke für die rege Teilnahme :o)

@Dirk,
das hat soweit geklappt mit der Abfrage. Toggle geht auch, was nicht
geht ist, wenn ich über
Bitwait Portd.1 , Reset
die Taste abfrage: da wird komischerweise auf dem Leih-Board STK200 der
Transistor neben der ISP Buchse ziemlich heiß...

@peter
Danke erstmal für den Hinweis - elegant und effektiv hört sich die
Beschreibung schon an!! An c habe ich auch schon gedacht. Ich war mir
nur nicht sicher warum ich es nicht probiert habe. Gerade habe ich mir
deshalb winavr runtergeladen, es ordnungsgemäß installiert und mir dann
mal Dein Beispiel angeschaut. Mittlerweile weiß ich auch warum ich als
Anfänger winavr nicht genommen hab. Zum Beispiel vermisse ich einen
Simulator, eine Möglichkeit einzustellen was für einen Schips ich habe,
als Basic-Umsteiger eine halbwegs verständliche deutsche Hilfe, oder wo
der HEX-Code für Ponyprog erzeugt wird ... Fragen über Fragen. Als
C-Bergsteiger hat man's da net wirklich leicht, besser gesagt mir
fehlt da was greifbares :-)

von Peter D. (peda)


Lesenswert?

Als ich angefangen habe, lief auf den PCs noch DOS3.3, deshalb hat die
Kommandozeile nichts schreckliches für mich.

Wenn ich mal Funktionen testen will, mache ich das unter Borland-C.
Und für die Hardware verlasse ich mich auf die Erläuterungen in den
Datenblättern bzw. teste es auf dem STK500 aus.

Aber die BASCOM-Leute sollen ja sehr rührig sein, vielleicht basteln
die auf Anfrage auch einen Scheduler mit rein.


Peter

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.