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
Gast
#1305797
Super Idee, in einer ISR Delays o.dergl. zu benutzen... Das macht man einfach nicht.
ja wie dann? das ist ja die Frage! Gruß Fabian
@ 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
bzw wenn icht sind die LEDs garnicht mehr zu sehen!
Gast
#1305875
Kein delay in einer ISR. Punkt.
Gast
#1305889
Hi
>Kein delay in einer ISR. Punkt.
Blödsinn. Nicht das ich ein Verfechter davon bin. Aber diese
kategorische Aussage ist falsch.
MfG Spess
Gast
#1305899
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
}
}
Vielen Dank! werde das nun gleich mal versuchen Gruß FAbian
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
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.