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
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
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
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
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
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
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
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
Hallo: Die Entprellung der Tasten , geht mit dem Befehl: DEBOUNCE zb. Bebounce pinb.1,0,led,sub weitere Infos -> Onlinehilfe des Compilers. ThomasB
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.