Hallo Zusammen, Ich programmiere gerade den Atmega 8 mit Bascom mit einem selbstgebauten seriellen Programmieradapter. Ich bin noch recht unerfahren im Programmieren und habe deshalb eine Frage: Wie mache ich das, dass ich eine Schleife habe die z.B. 4 Leds abwechselnd einschaltet bzw auslässt : Do waitms 2 Portd.0 = A // LED 1 wenn A = 1 led an Waitms 2 Portd.0 = 0 Portd.1 = B // LED 2 Waitms 2 Portd.1 = 0 Portd.2 = C // LED 3 Waitms 2 Portd.2 = 0 Portd.3 = D // LED 4 Waitms 2 Portd.3 = 0 Loop Und das nebenbei ein anderes Programm läuft das die Variablen ABCD verändert um so ein Muster oder ein Lauflicht zu erzeugen! Allerdings sollte der Schaltvorgang mit den LEDs so schnell gehen das man kein Flackern oder dergleichen sieht! Im Grunde ist das nur kleines Multiplexing da ich mir demnächst einmal einen LED Cube programmieren will. Ich habe schon im Internet gesucht und Teillösungen gefunden, wie Unterprogramme oder der Gleichen. Ich will das auch versthen und nicht ein komplettes fertiges Programm für das Multiplexen. Oder geht das noch einfacher und ich mache mir da zu viel Aufwand? Leider bin ich gerade noch am Einarbeiten in die Programmiersprache daher solch eine Frage MFG Fabian
Das wird so nichts. Du brauchst einen Timer, der dir in regelmässigen Zeitabständen eine ISR aufruft. In dieser ISR schaltest du dann um zur nächsten LED. Immer reihum. Sieh dir mal dieses Tutorial an. Das sollte dir einiges weiterhelfen http://www.rowalt.de/mc/index.htm
Vielen Danke für die schnelle Antwort! Werde mir das jetzt gleich durchlesen Fabian
Der für dich interessante Teil beginnt im Abschnitt 3. Um Timer und Interrupts gehts im Abschnitt 5
Vielen Dank! habe das nun auch umgesetzt und wollte jetzt mal fragen ob das auch no kürzer geht, wiel die Outputs X und y die die leds dann auf ground ziehen mittels transistor jedesmal ein aus und so zu schalten, verbraucht eine Menge an Flashspeicher Code : Dim A As Byte Dim B As Byte Dim C As Byte Dim D As Byte Dim X As Byte Dim Y As Byte Config Portd.0 = Output Config Portd.1 = Output Config Portd.2 = Output Config Portd.3 = Output Config Portc.5 = Output Config Portc.4 = Output Config Timer0 = Timer , Prescale = 256 Enable Timer0 On Timer0 Timer0_isr Enable Interrupts Do X = 1 A = 1 Waitms 200 X = 0 Y = 1 Waitms 200 Y = 0 A = 0 X = 1 B = 1 Waitms 200 X = 0 Y = 1 Waitms 200 Y = 0 B = 0 X = 1 C = 1 Waitms 200 X = 0 Y = 1 Waitms 200 Y = 0 C = 0 X = 1 D = 1 Waitms 200 X = 0 Y = 1 Waitms 200 Y = 0 D = 0 Loop End Timer0_isr: Portc.5 = X Portc.4 = Y Portd.0 = A Waitms 2 Portd.0 = 0 Portd.1 = B Waitms 2 Portd.1 = 0 Portd.2 = C Waitms 2 Portd.2 = 0 Portd.3 = D Waitms 2 Portd.3 = 0 Portc.5 = 0 Portc.4 = 0 Return Sry wegen der Länge! Gruß Fabian
Super Idee, in einer ISR Delays o.dergl. zu benutzen... Das macht man einfach nicht.
@ Fabian Kluge (fabian1) >habe das nun auch umgesetzt und wollte jetzt mal fragen ob das auch no >kürzer geht, wiel die Outputs X und y die die leds dann auf ground Logisch, man nehme ein Array. Und wie bereits gesagt, du musst dich mal grundlegend über Interrupts informieren. So geht das nicht. Und lange Codes gehören in den Anhang. Augen auf! Steht direkt hier drüber! Siehe Anhang. Ist NICHT getestet, es fehlt auch noch die Initialisierung des Array, hab ich auf die Schnelle im Handbuch von BASCOM nicht gefunden. MFG Falk
Hi
>Kein delay in einer ISR. Punkt.
Blödsinn. Nicht das ich ein Verfechter davon bin. Aber diese
kategorische Aussage ist falsch.
MfG Spess
Allenfalls ein NOP. Mehr nicht. Mach n'timer mit 1ms, und zaehle dort. ISR Timer0 { reload Timer register timerflag=true; } main while true { if timerflag { LED=0 .. .. .. .. timerflag=false } }
Sooo, nach einigen BASCOM-Stolperfallen (Arrayindex fängt bei 1 an!, Hexzahlen werden mit &H und nicht $ angegeben, steht nirgendwo im Handbuch :-( hab ich das mal fehlerfrei simuliert. MFG Falk
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.