Forum: Mikrocontroller und Digitale Elektronik Lauflicht


von Tobias Halenka (Gast)


Lesenswert?

Hallo

Ich bin neuling und versuche ein einfaches lauflicht zu Programieren.
Ich weiß aber nicht wie ich das Programm schreiben soll. Das Lauflicht
soll immer nur in eine Richtung Laufen. Die LED´s sind mit dem PORTB
verbunden! Nur habe ich keine Ahnung wie meinem AT90S2313 sagen kann
das er einen Pin weiter springen soll!
Danke schon mal

von Jörg Wunsch (Gast)


Lesenswert?

uint8_t c = 1;
DDRB = 0xff;
for (;;) {
  PORTB = c;
  if (c == 0x80) c = 1;
  else c <<= 1;
}

von formtapez (Gast)


Lesenswert?

Da ich nicht weiss in welches Programmiersprache Du programmierst erklär
ich es mal so:

$01 in eine Variable speichern
Variable an PortB ausgeben
Warten
Variable linksschieben (oder rechts ...)
Variable an PortB ausgeben
Warten
Variable linksschieben (oder rechts ...)
Variable an PortB ausgeben
Warten
usw.

Alles klar ? ;)

MfG
formtapez

von Tobias Halenka (Gast)


Lesenswert?

@Jörg Wunsch
Sorry ich arbeite mit dem AVR Studio!
Ich gleub dien Programm ist in C oder? Ich werde aber erstmal weiter
mit AVR Arbeiten weil ich nur ungern jetzt wo ich es einigermaßen
verstanden habe mit C anfangen möchte! Trotzdem Danke für die Antwort!
@formtapez
Das mit der Variable habe i´ch verstanden aber wie veschiebe ich sie
nach Links oder rechts! Und wie bringe ich meinem Atmel bei zu warten?

von Andreas Hesse (Gast)


Lesenswert?

Hallo,

bits schieben in Registern kannst Du mit den Befehlen
lsl (=Logical shift left)
lsr (=Logical shift right)
rol (=links rollen, der nimmt das Carry Flag mit)
ror (=rechts rollen, der nimmt das Carry Flag mit)
Genaueres steht im Instruction Set Summary von Atmel.

Verzögerungsschleifen können so aussehen:
(wartet etwa 0,5 s bei 4 MHZ)
;*************************************************
;*** Delay: 2000000 Cycles
;*************************************************
;*** inner loop: 196
;*** middle loop: 188
;*** outer loop: 18
;*** difference: 2
;*************************************************
           ldi R16, 18
DelayLoop0:
           ldi R17, 18
DelayLoop1:
           ldi R18, 19
DelayLoop2:
           dec R18
           brne DelayLoop2
           dec R16
           brne DelayLoop1
           dec
           brne DelayLoop0

Kann man aber auch mit Timern machen

Gruss
Andreas

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.