Das Elektor-Forum schließt seine Pforten (siehe auch http://www.elektormagazine.de/forum). Ab Freitag, den 01. März, ist es nicht mehr möglich, sich im Forum einzuloggen. Alle Inhalte des Forums bleiben jedoch bis Ende März noch sichtbar. Am 01. April wird das Forum schließlich komplett geschlossen.

Tasterzustand bzw Tastzeit abfragen

ATMega-Controller in BASIC programmieren

Postby basno » Tue Dec 30, 2008 12:00 am

Hallo zusammen.

Da ich erst vor kurzem angefangen habe, mit Bascom zu programmieren, habe ich einige Probleme.

Ich möchte mit meinem Testaufbau auf einem STK 500
die Länge eines Tastendrucks abfragen und dementsprechend, je nach Tast-länge, verschiedene Ports toggeln lassen. Ich habe versucht, es an die (Tastenabfrage im Interrupt Heft 01/09) anzulehnen. Nur leider bekomme ich , für meine Verhältnisse , eine unverständliche Fehlermeldung.

Zuvor hatte ich versucht, dies per select case in der Hauptschleife zu erledigen.
(in der ISR lediglich : if pinb.0 = 0 then incr Zaehler)

Dabei hatte ich dann allerdings das Problem, dass lediglich der erste Zustand erkannt und ausgeführt wurde.
Dies empfand ich später auch logisch, da ich ja den Zaehler nach dem Schaltbefehl auf 0 zurückgesetzt hatte.
Nur wo muss ich den Zähler dann zurücksetzen damit nicht nur der erste Befehl ausgeführt wird bzw. die höheren werte von Zahler erkannt , ausgeführt und gelöscht werden.

Jetzt bin ich vor lauter Problemen von einem auf das andere Problem gekommen- ich hoffe Ihr verzeit mir dies

Wünsche allen einen guten Rutsch ins neue Jahr

Gruß Basno
Attachments

[The extension bas has been deactivated and can no longer be displayed.]

Screen.JPG
basno
 
Posts: 3
Joined: Fri Jan 03, 2014 1:52 pm

Postby burkhard kainka » Tue Dec 30, 2008 12:00 am

LED1 war noch nicht benannt. Und es fehlten ein paar End If. Jetzt wird es jedenfalls übersetzt.

Viel Erfolg!


$regfile = "attiny2313.dat"
$crystal = 8000000


Dim Zaehler As Word
Dim Ticks As Byte

Switch0 Alias Pinb.0
Led1 Alias Portd.2 ' fehlte
Led2 Alias Portd.3
Led3 Alias Portd.4
Led4 Alias Portd.5
Led5 Alias Portd.6 ' relay for wiper motor

Config Portb.0 = Input

Config Portd.2 = Output
Config Portd.3 = Output
Config Portd.4 = Output
Config Portd.5 = Output
Config Portd.6 = Output

Config Timer0 = Timer , Prescale = 1024
Enable Interrupts
Enable Timer0
Timer0 = 0

On Timer0 Timer0isr
Led1 = 1
Led2 = 1
Led3 = 1
Led4 = 1
Led5 = 1




Do

Toggle Led5


Loop



Timer0isr:
Ticks = Ticks + 1

If Ticks = 1 Then
If Switch0 = 0 Then Zaehler = Zaehler + 1
End If

If Ticks = 2 Then
If Zaehler = 62 Then
Toggle Portd.2 : Zaehler = 0
End If
End If

If Ticks = 3 Then
If Zaehler = 124 Then
Toggle Portd.3 : Zaehler = 0
End If
End If


If Ticks = 4 Then Ticks = 0


Return
burkhard kainka
 
Posts: 736
Joined: Thu Jan 02, 2014 10:41 am

Postby basno » Tue Dec 30, 2008 12:00 am

Vielen Dank Herr Kainka!

Ist mir zwar ein wenig peinlich aber vielleicht war es schon zu spät

Jetzt funktioniert es natürlich. Allerdings würde ich es gerne ein wenig abändern, sodas das Programm nicht mehr die Ports toggelt , sondern die jeweiligen leds für ca 1 Sekunde einschaltet.

Bzw. anders ausgedrückt: Das Programm soll die Tastendrücke zählen:
3 Tastendrücke nur led1 eine Sekunde an
6 Tastendrücke nur led2 eine Sekunde an
weniger Tastendrücke als 3 oder 6 sollten verworfen werden.

Bei meinem jetzigen Programm geht zB. nach x Tastendrücken led1 an ,nach weiteren Tastendrücken geht zusätzlich led2 an
anschließend led1 aus und dann led2 aus . Danach beginnt alles von vorne.
Wie kann ich dies erreichen - ich wäre für jeden Tip dankbar?
Ist mein Ansatz mit dem Timer für diese Aufgabenstellung überhaupt sinnvoll?

$regfile = "attiny2313.dat"
$crystal = 8000000


Dim Zaehler As Word
Dim Ticks As Byte

Switch0 Alias Pinb.0
Led1 Alias Portd.2 fehlte
Led2 Alias Portd.3
Led3 Alias Portd.4
Led4 Alias Portd.5
Led5 Alias Portd.6

Config Portb.0 = Input

Config Portd.2 = Output
Config Portd.3 = Output
Config Portd.4 = Output
Config Portd.5 = Output
Config Portd.6 = Output

Config Timer0 = Timer , Prescale = 1024
Enable Interrupts
Enable Timer0
Timer0 = 0

On Timer0 Timer0isr
Led1 = 1
Led2 = 1
Led3 = 1
Led4 = 1
Led5 = 1




Do

Toggle Led5


Loop



Timer0isr:
Ticks = Ticks + 1

If Ticks = 2 Then
If Switch0 = 0 Then Zaehler = Zaehler + 1
End If

If Ticks = 4 Then
If Zaehler = 4 Then
Toggle Portd.2
If Switch0 = 0 Then Zaehler = Zaehler + 1 Else Zaehler = 0

End If
End If

If Ticks = 6 Then
If Zaehler = 8 Then
Toggle Portd.3 : Zaehler = 0

End If
End If


If Ticks = 7 Then Ticks = 0


Return

Nochmals vielen Dank'
basno
 
Posts: 3
Joined: Fri Jan 03, 2014 1:52 pm

Postby burkhard kainka » Tue Dec 30, 2008 12:00 am

Das ist etwas komlizierter, weil man auch auswerten muss, wie lange eine Taste nicht gedrückt ist. Wenn man z.B. 1 s lang nicht drückt, beginnt das Zählen von vorn. Und gleichtigig ist die aktuelle Eingabe abgeschlossen. Es waren z.B. drei mal, dann folgt die Aktion soundso.

In der Timer-Routine würde ich versuchen auch die Nicht-gedrückt-Zeit zu messen.
burkhard kainka
 
Posts: 736
Joined: Thu Jan 02, 2014 10:41 am

Postby basno » Tue Dec 30, 2008 12:00 am

Besten Dank Herr Kainka,

so habe ich schonmal einen Ansatz. Jetzt kann ich mir in aller Ruhe mal den Kopf zerbrechen.

Es ist schön, das Sie sich die Zeit nehmen, Anfängern zur Seite zu stehen.

Wünsche allen einen guten Rutsch ins neue Jahr!

Gruß Basno
basno
 
Posts: 3
Joined: Fri Jan 03, 2014 1:52 pm


Return to BASCOM-AVR-Kurs

Who is online

Users browsing this forum: No registered users and 1 guest