PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Basic Programmierschwierigkeiten



rocketman123
25.11.2007, 13:12
Hallo,
ich bring mir gerade Basic bei.
ich programmiere über bascom einen atmega8.
ich möchte wenn eine taste 3s lang gedrückt wird so ein bestimmter Ausgang schalten.
wie kann ich das in basic programmieren.

also:
if Taster (3s gedrückt) then Ausgang 1 aktiv
if Taster (nochmals 3s gedrückt) then Ausgang 1 deaktiv

hab schon den "Taster AND WAITMS 3000 then Ausgang1" aktiv
ausprobiert aber da bringt er mir nur fehlermeldungen

danke
mfg

Dirk
25.11.2007, 14:15
Hallo rocketman123,

so einfach wird das nicht gehen.
Du müßtest folgendes versuchen:

1. Du müßtest den Taster regelmässig in bestimmten Abständen, z.B. 5x pro Sekunde (alle 200ms), abfragen. Also: Taste abfragen, dann 200 ms Pause.
2. In einer Schleife geschieht das 3 Sekunden lang, also insgesamt 15 Mal. Sieh dir in der Hilfe die Schleifen an (DO-LOOP und WHILE-WEND)!
3. Damit die Schleife 3 Sekunden läuft, brauchst du einen Zähler (eine Variable), der die Schleife nach 15 Durchläufen abbricht (DO-LOOP UNTIL Zähler > 15).
4. Wenn alle 15 Tasterabfragen = 1 sind, dann wird die LED ein- oder ausgeschaltet (getoggelt). Wenn eine der Abfragen = 0 ist, wird die Schleife sofort abgebrochen (EXIT DO) und neu gestartet.

Versuch 'mal dein Glück.

Gruß Dirk

rocketman123
25.11.2007, 16:08
kann mir jemand ein beispiel prgramm geben. ich bin noch nicht so fit in basic. oder ne seite wo ich mich schlau machen kann und basic für bascom lernen kann

AlKI
25.11.2007, 19:07
hmm, ich würde es so machen:



'hier davor noch das übliche geschribsel. statt den buchstaben x,y,p und q,
'die gleich noch kommen musst du dir eben die entsprechenden
'Portnamen bzw die pinnummern eingeben


PINx.y = Input 'Pin y von Port x als Eingang
PORTx.y = 1 'Pullup von dem pin an
Taster Alias PINx.y 'Pin y von port x heißt jetzt "Taster"

Portp.q = Output 'Pin q von Port p ist dein output, wird nach 3 sec taster=0 getoggelt
Ausgang Alias Portp.q 'jetzt heißt der pin q von port p "Ausgang

dim Zähler as byte 'Variable "Zähler" deklariert


'Hauptschleife kommt jetzt:

Do

Zähler = 0 'das setzt den Zähler wieder zurück, wenn die While-schleife
'unterbrochen wurde. wird auch gebraucht, damit "Zähler"
'einen bestimmten Wert hat, wenn die While-Schleife beginnt

while Taster = 0 'der Taster an Pin y von Port x muss nach GND gehen,
'darum ist logisch 1 hier low, also 0. wenn Taster = 1,
'dann hört die while-schleife auf, wird über die Do-Loop-Schleife
'aber immer wieder aufgerufen. dadurch wird nach jeder
'Tasterunterbrechung neu angefangen zu zählen
Zähler = Zähler + 1 'Die Variable "Zähler wird um 1 erhöht
if Zähler = 30 Then 'wenn Zähler 30 mal um eins erhöht wurde,
'was aufgrund der waitms-funktion nur 10mal pro sec passiert,
'dann

toggle Ausgang 'wird der ausgang getoggelt
Zähler = 0 'der zähler wieder rückgesetzt
endif 'und neu angefangen

waitms 100 'das ist die waitms- funktion. wenn du genauere ergebnisse haben willst,
'setze sie auf 10 und bei der if- anweisung "if Zähler = 300"
'dann könnte nur das byte nicht mehr ausreichen,
'als dass die Variable "Zähler " definiert ist.

Wend

loop


Ich habs jetzt mal für nen Mega8515 ausprobiert und port-/pinnamen eingegeben:


$regfile = "m8515.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 8000000




Config Pina.0 = Input 'Pin y von Port x als Eingang
Porta.0 = 1 'Pullup von dem pin an
Taster Alias Pina.0 'Pin y von port x heißt jetzt "Taster" (kann sein, dass es "Taster Alias PORTx.y" heißen muss)

Config Porta.1 = Output 'Pin q von Port p ist dein output, wird nach 3 sec taster=0 getoggelt
Ausgang Alias Porta.1 'jetzt Heißt Der Pin Q Von Port P "Ausgang"

Dim Zaehler As Byte 'Variable "Zähler deklariert"


'Hauptschleife kommt jetzt:

Do

Zaehler = 0

While Taster = 0 'der Taster an Pin y von Port x muss nach GND gehen,
' darum ist logisch 1 hier low, also 0. wenn Taster = 1,
' dann hört die while-schleife auf
Zaehler = Zaehler + 1 'die Variable "Zähler wird um 1 erhöht"

If Zaehler = 30 Then 'wenn Zähler 30 mal um eins erhöht wurde,
'was aufgrund der waitms-funktion nur 10mal pro sec passiert, dann

Toggle Ausgang 'wird der ausgang getoggelt
Zaehler = 0 'der zähler wieder rückgesetzt
End If 'und neu angefangen

Waitms 100 'das ist die waitms- funktion. wenn du genauere ergebnisse haben willst,
'setze sie auf 10 und bei der if- anweisung "if Zähler = 300"
'dann könnte nur das byte nicht mehr ausreichen,
'als welches die Variable "Zähler " definiert ist.

Wend

Loop

EDIT: fehler behoben, funktioniert!

T.J.
25.11.2007, 20:08
evlt. kann der befehl bitwait auch helfen?

AlKI
25.11.2007, 20:12
öhm, hehe, bin auch nurn neuling, wie funzt denn der bitwait?

EDIT: thx, ok, aber nicht mehr heute :-)

T.J.
25.11.2007, 20:16
:D , ja nun hab seit 14 Monaten Bascom nicht angefasst. mache das meiste mit ASM. aber guck mal bitte in die Bascom Hilfe, da sollte das stehen

AlKI
26.11.2007, 11:36
Gnaaah, ich bin doof!

hinter While und die Bedingung gehört natürlich KEIN "THEN"

so isses für den compiler richtig, ich probiers gleich mal aus:

$regfile = "m8515.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 8000000




Config Pina.0 = Input 'Pin y von Port x als Eingang
Porta.0 = 1 'Pullup von dem pin an
Taster Alias Pina.0 'Pin y von port x heißt jetzt "Taster" (kann sein, dass es "Taster Alias PORTx.y" heißen muss)

Config Porta.1 = Output 'Pin q von Port p ist dein output, wird nach 3 sec taster=0 getoggelt
Ausgang Alias Porta.1 'jetzt Heißt Der Pin Q Von Port P "Ausgang"

Dim Zaehler As Byte 'Variable "Zähler deklariert"


'Hauptschleife kommt jetzt:

Do

Zaehler = 0

While Taster = 0 'der Taster an Pin y von Port x muss nach GND gehen,
' darum ist logisch 1 hier low, also 0. wenn Taster = 1,
' dann hört die while-schleife auf
Zaehler = Zaehler + 1 'die Variable "Zähler wird um 1 erhöht"

If Zaehler = 30 Then 'wenn Zähler 30 mal um eins erhöht wurde,
'was aufgrund der waitms-funktion nur 10mal pro sec passiert, dann

Toggle Ausgang 'wird der ausgang getoggelt
Zaehler = 0 'der zähler wieder rückgesetzt
End If 'und neu angefangen

Waitms 100 'das ist die waitms- funktion. wenn du genauere ergebnisse haben willst,
'setze sie auf 10 und bei der if- anweisung "if Zähler = 300"
'dann könnte nur das byte nicht mehr ausreichen,
'als welches die Variable "Zähler " definiert ist.

Wend

Loop


Und es funktioniert! ich editiere noch den anderen Beitrag, damit der auch richtig ist.