Forum: Mikrocontroller und Digitale Elektronik Programm für Bascom


von Reinhard (Gast)


Lesenswert?

Hallo Leute
als anfänger brauche ich mal eure hilfe.
wer kann mir mal in Bascom ein programm für den atmel 2343 schreiben,
daß folgende funktion erfüllt
LED Kontrolle an PB0
Taster L an PB1
Taster r an PB2
LED L an PB3
LED R an PB4

das programm soll nun folgendes machen.
ich drücke 1x taster L so soll die LED L an gehen und Kontroll LED, sie
sollen nun solange leuchten bis entweder die taste L noch weitere 2x
gedrückt wurden, oder einmal die taste R.
das ganze nun andersrum mit der rechten taste,
1x drücken LED R und Kontrolle an solange an bis entweder taste R noch
weitere 2x gedrückt wurden oder 1x taste L.
und dann wieder warten bis entweder wieder taste L oder R 1x gedrückt
wurde usw.

ich kriege es einfach nicht hin, kann machen was ich will, sonst
verliere ich noch die lust an der ganzen sache

besten dank
reini

von Markus Kaufmann (Gast)


Lesenswert?

Hallo Reinhard,

hier ist leider nicht der kostenlose Programmierservice, der den Leuten
ihre Programme schreibt. Wir helfen Dir aber gerne dabei, selbst auf
die Lösung zu kommen; Dein Problem ist eigentlich nicht sonderlich
schwierig (wenn man den Lösungsansatz kennt).

Beschreib doch mal, wie Du bisher vorgegangen bist und was nicht
funktioniert hat.

Prinzipiell ist es hier wichtig, sich zu merken was bisher schon
passiert ist, d.h. welche LED gerade an ist und welche Taste schon wie
oft gedrückt wurde. Außerdem müssen die Tasten entprellt werden
(hardware- oder softwareseitig).

Markus

von Reinhard (Gast)


Lesenswert?

Hallo
ich habe das gemacht.
'Pin 5 = PB0 - Led ein/aus
Config Pinb.0 = Output
'Pin 6 = PB1 - Blinker links Eingang
Config Pinb.1 = Input
'Pin 7 = PB2 - Blinker rechts Eingang
Config Pinb.2 = Input
'Pin 2 = PB3 - Blinker links Ausgang
Config Pinb.3 = Output
'Pin 3 = PB4 - Blinker rechts Ausgang
Config Pinb.4 = Output

'Variablen setzen
Dim SchaltindexLink As Byte
Dim SchaltindexRechts As Byte
Dim Msekunden As Integer
Const Einsekunde = 2000

'Anfangswerte setzen
SchaltindexLinks = 0
SchaltindexRechts = 0

'Timer Setzen
Config Timer0 = Timer , Prescale = 8
On Timer0 Timer0_isr
Enable Timer0
Enable Interrupts

Portb.0 = 0
Msekunden = 0

'Led blinken
Portb.0 = 1
Msekunden = 0
Do
nop
Loop Until Msekunden > Einsekunde
Portb.0 = 0
Msekunden = 0
Do
nop
Loop Until Msekunden > Einsekunde
Portb.0 = 1
Msekunden = 0
Do
nop
Loop Until Msekunden > Einsekunde
Portb.0 =0

Msekunden = 0

'Hauptprogramm
Do
 If SchaltindexLinks = 1 Then
    Do
     Portb.3 = 1
     Portb.0 = 1
        If Portb.1 = 1 Then
        SchaltindexLinks = SchaltindexLinks + 1
        End If
    Loop Until SchaltindexLinks = 3 or Pinb.2 = 1
     SchaltindexLinks = 0
     Portb.3 = 0
     Portb.0 = 0

 Elseif SchaltindexRechts = 1 Then
    Do
     Portb.4 = 1
     Portb.0 = 1
        If Portb.2 = 1 Then
        SchaltindexRechts = SchaltindexRechts + 1
        End If
   Loop Until SchaltindexRechts = 3 or Pinb.1 = 1
     SchaltindexRechts = 0
     Portb.4 = 0
     Portb.0 = 0
End If
If Pinb.1 = 1 Then
  SchaltindexLinks = 1
End If
If Pinb.2 = 1 Then
  SchaltindexRechts = 1
End If
Loop
End

und das geht nicht weil ich zu dumm bin

reini

von Markus Kaufmann (Gast)


Lesenswert?

Hallo Reinhard,


wo ist denn der Code von Timer0_isr ?

Eine Sekunde wartet man im Bascom am einfachsten mit "wait 1".

Weist Du, was Tastenprellen ist und falls ja, hast Du es
berücksichtigt?

Markus

von Markus Kaufmann (Gast)


Lesenswert?

Nachtrag:
Dir ist klar, daß ein Microcontroller pro Sekunde tausende Befehle
abarbeitet? Und daß Pinb.1 bzw. Pinb.2 solange auf 1 bleiben, bis Du
den Taster wieder losläßt?

Anders ausgedrückt:
Du setzt z.B. Schaltindexlinks auf 1, danach geht der Wert sofort auf 2
(die Taste ist ja immernoch gedrückt) und dann auf 3 und dann wieder
auf 0 usw. usf.

Markus

von Reinhard (Gast)


Lesenswert?

Ja wie jetzt!
gut das mit den timer lassen wir mal sollte ja eigentlich nur eine
kontrolle sein.
das hauptprogramm ist mir wichtig!
ich drücke taste und solange sie gedrückt ist zählt doch das ding nicht
weiter oder und jedesmal setzt er den index doch um 1 rauf oder.
ist den nicht die taste entprellt wenn ich den pin als eingang setze?
jetzt bin ich wieder so weit wie am anfang??
was ist den nun falsch an dem listing?
ich meine ich wende mich an euch um hilfe zu bekommen ich habe leider
kein studium als elektrotechniker oder wie auch immer. ich wollte nur
mal einwenig in die welt der chips eindringen und wollte für die
modellbahn eine lichtsteuerung bauen. aber ich seh schon es wird wohl
nix.
den wenn ich es wüste wie es geht würde ich ja nicht um hilfe suchen
reini

von Markus Kaufmann (Gast)


Lesenswert?

Hallo Reinhard,

hier hats alle möglichen Leute, vom absoluten Anfänger bis zum
erfahrenen Profi. Das sieht man den Leuten aber nicht an, deswegen ist
es wichtig, daß man sagt, wie die eigenen Vorkenntnisse sind.

Tastenprellen ist das Phänomen, daß beim Drücken eines Tasters der
Kontakt nicht einfach geschlossen wird, sondern die Kontaktzunge zuerst
Kontakt bekommt, dann aber abprallt (Kontakt öffnet wieder), wieder
nach unten kommt (Kontakt schließt wieder) usw. usf.
Das Ganze wiederholt sich ein paarmal, bis der Kontakt sauber
geschlossen wird. Wenn man mit dem Taster einfach ganz normal z.B. eine
LED schaltet, dann fällt das nicht auf, weil das menschliche Auge dafür
viel zu träge ist. Hat man aber einen Microcontroller, dann macht es
plötzlich einen Unterschied. Die Lösung ist dabei, daß man schaut wie
lange der Taster betätigt wird. Kein Mensch kann einen Taster nur für 2
Millisekunden drücken, also kann man das ignorieren.

Tasten werden nicht automatisch entprellt wenn Du den Pin als Eingang
setzt, weil der Microcontroller ja nicht wissen kann, was Du eigentlich
damit machen möchtest.

Dein eigentliches Problem ist aber ein anderes:
Wenn Pinb.1 = 1 ist, dann setzt Du SchaltindexLinks auf 1, aber Pinb.1
bleibt danach solange auf 1, bis Du die Taste losläßt. Nachdem die
Variable gesetzt wurde, fängt Deine Schleife (Hauptprogramm) wieder von
vorne an, er geht in den "If SchaltindexLinks = 1 Then" - Teil rein,
macht die beiden LEDs an und Pinb.1 ist immer noch 1 (das Ganze hat nur
ein paar Microsekunden gedauert!) und deswegen wird SchaltIndexLinks
jetzt auf 2 gesetzt. Dann läuft bei Dir die innere Schleife (Pinb.1 ist
immer noch 1), SchaltindexLinks wird auf 3 gesetzt, die innere Schleife
verlassen, die LEDs wieder ausgeschalten (das alles hat jetzt weniger
als eine Millisekunde gedauert), daraufhin wird das große if verlassen,
die Pinb.1 wieder überprüft, die ist immer noch 1 und das Spielchen
geht von vorne los.

War das soweit verständlich und hilft Dir die Erklärung weiter?

Markus

von Reinhard (Gast)


Lesenswert?

Ja jetzt komme ich der sache schon näher.
also mus ich entprellen sonst erreiche ich nie die 1
und der chip muß angehalten werden solange ich drücke oder?
blos wie mache ich das?
mit wait geht es wohl kaum.
na ja danke erstmal werde jetz schlafen gehen, da ich morgen früh raus
muß
ich bin eigentlich am ende mit meinem sprachschatz was basic angeht?

also besten dank
reini

von ThomasB (Gast)


Lesenswert?

Hallo:
Die Entprellung der Tasten , geht mit dem Befehl:
DEBOUNCE

zb. Bebounce pinb.1,0,led,sub

weitere Infos -> Onlinehilfe des Compilers.

ThomasB

von Markus Kaufmann (Gast)


Lesenswert?

Hallo Reinhard,

genau, Du mußt
a) die Tasten entprellen und
b) einen Tastendruck als solchen erkennen (insbesondere das Loslassen)

Ich würde das über einen Timerinterrupt machen. Wenn Du ihn mit 1000Hz
laufen läßt, dann kannst Du messen, wieviele Milisekunden der Taster
gedrückt bzw. nicht gedrückt ist. Der Taster gilt erst dann als an,
wennn er mindestens 100ms gedrückt wurde und das Signal muß eben auch
mindestens 100ms aus sein, damit er als losgelassen erkannt wurde.

Markus

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.