Ich bin auch langsam am verzweifeln! Bin absoluter Anfänger!! Ich muss für jemanden etwas bauen. Dies besteht aus 9 LED, die mit einem Taster jeweils wagrecht oder Diagonal leuchten sollen. Und wenn kein Taster gedrückt, sollen alle Blinklen. Bin jetzt so weit, dass ich die LED über den Atmega8 einschalten kann. Weder Blinklich noch Taster funktionieren. Das Flashen des Atmega8 klappt, nur ich weiß nicht wie ich das Programmieren soll. Kann mir jemand Helfen? Mit freundlichen Grüßen Stefan
Blinken über Interrupt und Timer realisieren, Abfrage der Taster mittels DEBOUNCE...
Kannst du mir ein Beispiel geben wie ich das programmieren soll?
Dom. mach aber hin die Hausaufagbe muss morgen fertig sein !!!
Aha, der "jemand" ist ein Lehrer - und - wie bei meinen Herren Söhnen auch so oft - wird die Hausaufgabe mal wieder "in letzter Minute" begonnen. So eine Aufgabe erfordert aber schon ein wenig "Einarbeitung" - bis morgen wird das sicher nix mehr...
Stefan Meyer wrote: > Ich will [...]. Meinem Sohn (5) hab ich "ich möchte" beigebracht... aber nungut. Wie darf ich mir "diagonal oder horizontal leuchten" vorstellen? Wie sind die LEDs angeordnet? Zeichnung? Gruß Dominique Görsch
Hier schonmal aus meiner Snippetsammlung was, womit ich blinke... aktuell für 5 LEDs A0-A4 vorgesehen, muss man für 9 dann noch ein bissl aufbohren, aber das schaffste sicher selber. Für mehr Hilfe brauch ich mehr Infos.
1 | Config Timer0 = Timer , Prescale = 1024 |
2 | |
3 | On Timer0 Timer0_isr |
4 | |
5 | Enable Timer0 |
6 | Enable Interrupts |
7 | |
8 | Dim Intervall As Integer , Blink_on As Integer |
9 | Dim Led As Integer , Pin As Integer |
10 | |
11 | Const False = 0 |
12 | Const True = 1 |
13 | |
14 | Main: |
15 | Do
|
16 | If Blink_on = True And Intervall >= 3 Then |
17 | Blink_on = False |
18 | Intervall = 0 |
19 | Elseif Blink_on = False And Intervall >= 15 Then |
20 | Blink_on = True |
21 | Intervall = 0 |
22 | End If |
23 | |
24 | For Led = 1 To 5 |
25 | Pin = Led - 1 |
26 | If Ledstate(led) = 2 Then |
27 | Porta.pin = Blink_on |
28 | End If |
29 | Next Led |
30 | Loop
|
31 | |
32 | |
33 | Timer0_isr: |
34 | Intervall = Intervall + 1 |
35 | Return
|
36 | |
37 | End
|
Die LED werden wie ein Quadrat angeordnet also 3Led's in der 1. reihe, 3LED's in der 2. Reihe, 3LED's in der 3 Reihe. Diagonal = von links bis rechts oben.
Siehe oben, da haste schonmal ne ganze Menge... das Debounce muss halt noch in die Main-Loop. Debounce ist in der BASCOM-Hilfe ganz gut erklärt. Konkrete Fragen beantworte ich aber auch gern.
Der Meldet irgent wie so 3 errors. Aber so richtig blicke ich das noch nicht!
Stefan Meyer wrote: > Der Meldet irgent wie so 3 errors. Etwas präziser wäre nicht schlecht. > Aber so richtig blicke ich das noch nicht! Was genau? Gruß Dominique Görsch
Und was hat der Lehrer zu der nicht Lösung gesagt? Oder hast Du heute krank gemacht?
1. ist das nicht für die Schule - sondern privat gebrauch!!! 2. Kann ich das ganze auch so machen: $regfile = "m8def.dat" $crystal = 1000000 Config Portd.2 = Output Config Portd.3 = Output Config Portd.4 = Output Config Portd.5 = Output Config Portd.6 = Output Config Portd.7 = Output Config Portb.0 = Output Config Portb.1 = Output Config Portb.2 = Output Do Portd. 2 = 1 Waitms 100 Portd. 2 = 0 Waitms 100 Portd. 3 = 1 Waitms 100 Portd. 3 = 0 Waitms 100 Portd. 4 = 1 Waitms 100 Portd. 4 = 0 Waitms 100 Portd. 5 = 1 Waitms 100 Portd. 5 = 0 Waitms 100 Portd. 6 = 1 Waitms 100 Portd. 6 = 0 Waitms 100 Portd. 7 = 1 Waitms 100 Portd. 7 = 0 Waitms 100 Portb. 0 = 1 Waitms 100 Portb. 0 = 0 Waitms 100 Portb. 1 = 1 Waitms 100 Portb. 1 = 0 Waitms 100 Portb. 2 = 1 Waitms 100 Portb. 2 = 0 Waitms 100 Loop Und halt noch "irgendwie" die Taster danach setzten? Möglichst einfach, mit möglichst wenigen schritten. Die Geschwindigkeit gefällt mir so, nur das ,was Dominique Görsch gepostet hat weis ich nicht, wie ich die Led's den Port bestimme, bzw wie ich es erweitern oder bearbeiten kann. Mit freundlichen Grüßen Stefan
Poste doch mal das ganze Bascom File damit mann etwas sieht.
Wie ganzes Bascom File? Was ich gerade gepostet habe, ist dass was ich mir gestern "angeeignet" habe. Also, dass weiß ich wie es funktioniert.
Richtig, deswegen such ich ja ne Lösung, mit der ich dann noch die Taster einbinden kann. Suche schon 2 Stunden im Internet nach möglichkeiten. Möchte ja so was wie Programmteile mache - weiß aber nicht wie das geht. Unter Programmteile meine ich, dass wenn ich z.b. Taster 1 Drücke eine bestimmte Aktion ausgeführt wird, die wenn ich dann los lasse, wie aufhört und das Blinken wieder anfängt.
if taster1 == 0 then gosub test1 test1 mach irgend was return so in etwa?
Aha, du willst dass die LEDs der Reihe nach blinken, dann schreib das doch auch. > Und wenn kein Taster gedrückt, sollen alle Blinklen. Oben schrubst du nämlich, dass alle blinken sollen... Ich rate dir dennoch, statt mit Waitms das mit 'nem Timer zu machen, auch wenn du es auch so hinbekommst. Für die Taster hab ich dir schon mehrfach den Tipp zu Debounce gegeben. Die BASCOM-Hilfe enthält Beispiele dafür! Gruß Dominique Görsch
Eine neue Frage, würde dass mit sub Funktionieren bzw mit 5 Tastern? Wie müsste ich das in den oben Geposteten Code intergrieren?
Stefan Meyer wrote: > würde dass mit sub Funktionieren bzw mit 5 Tastern? Ich denk 2 Taster? > Wie müsste ich das in den oben Geposteten Code intergrieren? Eine Tastenabfrage (ohne Interrupts) macht in deinem Code keinen Sinn, weil die Schleife viel zu lange braucht, bis sie durchlaufen ist.
Entschuldigung, wenn ich mich unklar ausgedrückt habe. Möchte es mit ca. 5 Tastern machen, 1 für unterste led reihe, 2. Taster zweite reihe, 3. Taster 3. reihe Led's. 4. Taster Diagonale links unten nach rechts oben, 5. Taster von rechts unten nach links oben. Mir ist auch egal ob ohne Taster druck alle gleichzeitig Blinken oder der Reihenach, wie oben. Wie das mit Main-Loop oder Debounce funktionieren soll, weiß ich nicht NOCH nicht. Wie müsste ich die Subs eigentlich markieren, bzw. einbinden?
Was mach ich hier Falsch? $regfile = "m8def.dat" $crystal = 1000000 Config Portc.3 = Input Config Portd.2 = Output Config Portd.3 = Output Config Portd.4 = Output Config Portd.5 = Output Config Portd.6 = Output Config Portd.7 = Output Config Portb.0 = Output Config Portb.1 = Output Config Portb.2 = Output Declare Sub Unterprogramm Do Portd. 2 = 1 Waitms 150 Portd. 2 = 0 Waitms 150 Portd. 3 = 1 Waitms 150 Portd. 3 = 0 Waitms 150 Portd. 4 = 1 Waitms 150 Portd. 4 = 0 Waitms 150 Portd. 5 = 1 Waitms 150 Portd. 5 = 0 Waitms 150 Portd. 6 = 1 Waitms 150 Portd. 6 = 0 Waitms 150 Portd. 7 = 1 Waitms 150 Portd. 7 = 0 Waitms 150 Portb. 0 = 1 Waitms 150 Portb. 0 = 0 Waitms 150 Portb. 1 = 1 Waitms 150 Portb. 1 = 0 Waitms 150 Portb. 2 = 1 Waitms 150 Portb. 2 = 0 Waitms 150 Loop If Pinc.3 = 1 Then Gosub 1 Do Loop Sub Unterprogramm Portc.5 = 1 End Sub
Dein If Pinc.3 = 1 Then Gosub 1 wird nie erreicht, da der Controller die Schleife darüber abarbeitet.
Kann ich das übverarbeiten irgentwie abstellen? Wie muss ich das programmieren, das die 9LED's an verschiedenen Ausgängen gleichzeitig blinken?
Hi, Ich schlage dir vor, den BASCOM-Kurs auf www.halvar.at GRÜNDLICH durchzulesen! Dort stehen sehr viele interessante funktionen. MfG Bauteiltöter
Wenn ich das bei dem BASCOM-Kurs richtig verstanden habe, kann ich das mit dem AtMega8 gar nicht machen, da der nur 2 Ports hat, die als interrupt Port nutzen kann. Ist das richtig?
Es gibt da noch den PinChangeInterrupt. Da kannst Du jedem Pin einen Int. zuordnen.
Halte deine Main-Loop kurz genug, schau das keine Waits drin sind, dann brauchst du für die Taster keine Interrupt.
Würde das als Mainloop funktionieren? Config Timer1 = Timer, Prescale = 8 Config Pinc.2 = Output Config Pind.2 = Output Config Pind.3 = Output Config Pind.4 = Output Config Pind.5 = Output Config Pind.6 = Output Config Pind.7 = Output Config Pinb.0 = Output Config Pinb.1 = Output Config Pinb.2 = Output Led1 Alias Portc.2 'Hier wird das Unterprogramm festgelegt, das 'in dem von ihnen eingestellten Intervall aufgerufen wird On Timer1 Timer_irq Const Timervorgabe = 23869 Enable Timer1 Enable Interrupts 'Hier ist die Programmhauptschleife Do 'Hier könnte Ihr Hauptprogramm stehen Loop Timer_irq: Timer1 = Timervorgabe Toggle Led1 Toggle Portd.2 Toggle Portd.3 Toggle Portd.4 Toggle Portd.5 Toggle Portd.6 Toggle Portd.7 Toggle Portb.0 Toggle Portb.1 Toggle Portb.2 Return Wie und wo müsste ich jetzt die Taster reinschreiben?
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.