Forum: Mikrocontroller und Digitale Elektronik Zeitschleife mit Variablen


von Fabian K. (fabian1)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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

von Fabian K. (fabian1)


Lesenswert?

Vielen Danke für die schnelle Antwort!
Werde mir das jetzt gleich durchlesen

Fabian

von Karl H. (kbuchegg)


Lesenswert?

Der für dich interessante Teil beginnt im Abschnitt 3. Um Timer und 
Interrupts gehts im Abschnitt 5

von Fabian K. (fabian1)


Lesenswert?

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

von STK500-Besitzer (Gast)


Lesenswert?

Super Idee, in einer ISR Delays o.dergl. zu benutzen...
Das macht man einfach nicht.

von Fabian K. (fabian1)


Lesenswert?

ja wie dann? das ist ja die Frage!
Gruß Fabian

von Falk B. (falk)


Angehängte Dateien:

Lesenswert?

@  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

von Fabian K. (fabian1)


Lesenswert?

bzw wenn icht sind die LEDs garnicht mehr zu sehen!

von pfft.. (Gast)


Lesenswert?

Kein delay in einer ISR. Punkt.

von spess53 (Gast)


Lesenswert?

Hi

>Kein delay in einer ISR. Punkt.

Blödsinn. Nicht das ich ein Verfechter davon bin. Aber diese 
kategorische Aussage ist falsch.

MfG Spess

von pfft.. (Gast)


Lesenswert?

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
  }
 }

von Fabian K. (fabian1)


Lesenswert?

Vielen Dank!
werde das nun gleich mal versuchen
Gruß FAbian

von Falk B. (falk)


Angehängte Dateien:

Lesenswert?

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
Noch kein Account? Hier anmelden.