PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Einsteiger braucht Expertenunterstützung



Phil Connors
09.10.2006, 20:21
Hallo

Ich beschäftige mich seit ein paar Tagen mit µControllern und hatte auch noch ein paar Attiny2313 zum Spielen rumliegen.

Vorweg:

Das Thema Microcontroller ist für Anfänger wirklich nicht sehr leicht nachvollziehbar, trotz diverser Tutorial-Versuchen hier im Board oder bei mikrokontroller.net und an vielen Stellen wo man glaubt einen Einstieg gefunden zu haben, endet es leider in einem Codeschnipsel und man ist verwirrter als vorher. Allein die drei Programmiersprachen tuen ihr übriges...

Zum Problem:

Ich habe an einen Attiny2313 an Port D2 ( ist der als Eingang überhaupt geeignet?) einen Taster über einen 10K Widerstand an VCC und an GND angeschlossen und an den Ports B1,2,3 jeweils eine LED über Vorwiderstand an VCC.

Ich möchte:

Mit dem Taster Led1 anschalten, wenn die Tastendrucklänge < 100 ist und diese sollte angeschaltet bleiben, bis zum nächsten Tastendruck (egal ob kurz oder lang)

Ist der Tastendruck > 100 sollen Led1 und Led3 eingeschaltet werden und ebenfalls eingeschaltet bleiben, bis zum nächsten Tastendruck.

Tja ich habe bislang ausprobiert:



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


Config Pind.2 = Input 'Taster Eingang

Config Portb.1 = Output 'Led1 aus
Config Portb.2 = Output 'Led2 aus
Config Portb.3 = Output 'Led3 aus

Taster Alias Pind.2 'Taster def.
Led1 Alias Portb.1 'Led 1 def.
Led2 Alias Portb.2 'Led 2 def.
Led3 Alias Portb.3 'Led 3 def.

Led1 = 1
Led2 = 1
Led3 = 1

Declare Sub Stelle1 'Status1
Declare Sub Stelle2 'Status2

Debounce Taster , 0 , Stelle1 , Sub

Do
Stelle1: 'Hauptschleife
If Taster = 0 Then Led1 = 0 Else Led1 = 1
If Taster = 1 Then Return Else Gosub Stelle2

Stelle2:
Waitms 80
If Taster = 0 And Led1 = 0 Then Led3 = 0 Else Led3 = 1

Loop

Schaltet die LED's eigenlich so, wie ich möchte, nur bleiben diese nicht eingeschaltet...

Mein neuer Ansatz, klappt irgendwie noch gar nicht :(



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


Config Pind.2 = Input 'Taster Eingang

Config Portb.1 = Output 'Led1 aus
Config Portb.2 = Output 'Led2 aus
Config Portb.3 = Output 'Led3 aus

Taster Alias Pind.2 'Taster def.
Led1 Alias Portb.1 'Led 1 def.
Led2 Alias Portb.2 'Led 2 def.
Led3 Alias Portb.3 'Led 3 def.

Led1 = 1
Led2 = 1
Led3 = 1


Dim Tastendrucklaenge As Word

Do

Pulsein Tastendrucklaenge , Pind , 2 , 0

If Tastendrucklaenge > 20 And Tastendrucklaenge < 100 Then Toggle Led1
If Tastendrucklaenge > 150 Then Led3 = 0 Else Led3 = 1

Loop

Ich hoffe, mir kann jemand von Euch Experten dabei behilflich sein [-o<

Dirk
09.10.2006, 20:52
Hallo Phil,

zum 1. Beispiel:
Da gibt's durch unklare Unterprogramm-Strukturen (Return, Gosub Stelle2) keinen Ablauf, den man nachvollziehen könnte.

Unterprogramme gehören nicht in eine DO..LOOP Schleife, sondern ans Programmende:

DO
...
Gosub Unterprog1
...
Gosub Unterprog2
...
LOOP
END


Unterprog1:
...
Return

Unterprog2:
...
Return


Zum 2. Beispiel:
Schon viel besser!
Aber: Pulsein zählt 10uS Einheiten. Du mußt schon fantastische Reflexe haben, wenn du da genau zwischen 200 und 1000uS lang eine Taste drücken willst!

Gruß Dirk

Phil Connors
09.10.2006, 21:47
Hallo Dirk,

vielen Dank für Deine Antwort, dass hat mich schon sehr viel weiter gebracht - war mir mit den µs nicht klar, ich war von ms ausgegangen :-&

Jetzt funktioniert das schon fast so, wie ich das haben möchte, nur das Led1 nicht aufleuchtet, wenn Led2 aufgerufen wird und Led 2 auch nur erlischt, wenn ein weiteres langes Signal folgt - ...aber schon verdammt nah dran =D>



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


Config Pind.2 = Input 'Taster Eingang

Config Portb.1 = Output 'Led1 aus
Config Portb.2 = Output 'Led2 aus
Config Portb.3 = Output 'Led3 aus

Taster Alias Pind.2 'Taster def.
Led1 Alias Portb.1 'Led 1 def.
Led2 Alias Portb.2 'Led 2 def.
Led3 Alias Portb.3 'Led 3 def.

Led1 = 1
Led2 = 1
Led3 = 1


Dim Tastendrucklaenge As Word

Do

Pulsein Tastendrucklaenge , Pind , 2 , 0

If Tastendrucklaenge > 1000 And Tastendrucklaenge < 5000 Then Toggle Led1
If Tastendrucklaenge > 5000 Then Toggle Led3

Loop

Phil Connors
09.10.2006, 22:52
Hallo

Noch ein kleiner Nachtrag, bin ja blöd brauch ja nur den kompletten B-Port toggeln. Jetzt bleibt nur noch das Problem des Ausschaltens auch über einen kurzen Tastendruck.


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


Config Pind.2 = Input 'Taster Eingang

Config Portb.1 = Output 'Led1 aus
Config Portb.2 = Output 'Led2 aus
Config Portb.3 = Output 'Led3 aus

Taster Alias Pind.2
Led Alias Portb 'Taster def.
Led1 Alias Portb.1 'Led 1 def.
Led2 Alias Portb.2 'Led 2 def.
Led3 Alias Portb.3 'Led 3 def.

Led1 = 1
Led2 = 1
Led3 = 1


Dim Tastendrucklaenge As Word

Do

Pulsein Tastendrucklaenge , Pind , 2 , 0

If Tastendrucklaenge > 200 And Tastendrucklaenge < 3000 Then Toggle Led1
If Tastendrucklaenge > 5000 Then Toggle Led

Loop

Dirk
10.10.2006, 09:29
Hallo Phil,


Jetzt bleibt nur noch das Problem des Ausschaltens auch über einen kurzen Tastendruck.

Du kriegst das hin!! O:)

Aber denk an deine Reaktionszeiten und an deinen Zeigefinger:
Deine LED1 soll toggeln bei einem Tastendruck zwischen 2ms (= 200 x 10us) und 30ms. Das sind immer noch Tausendstel Sekunden!
Ich will dir nicht zu nahe treten: Viel kürzer wirst du das aber nicht hinkriegen (es sei denn, du bist Superman).

Gruß Dirk