Forum: Mikrocontroller und Digitale Elektronik Knight rider lauflicht


von Heinz peter P. (poschi8)


Lesenswert?

Hallo alle zusammen,

ich habe mal eine Frage zu folgendem Code:
1
.INCLUDE "m32def.inc"
2
.def akku=R16
3
4
init:
5
6
  ldi akku, 0b11110111
7
  out PORTB, akku
8
9
links:
10
  cpi akku, 0b01111111
11
  breq rechts
12
  lsl akku
13
  inc akku
14
  out PORTB, akku
15
  rjmp links
16
17
rechts:
18
  cpi R16, 0b11111110
19
  breq links
20
  lsr akku
21
  ori akku, 0b10000000
22
  out PORTB, akku
23
  rjmp rechts

Was macht der Befehl, ori akku, 0b10000000, im Unterprogramm "rechts"???
Das Programm ist ein Lauflicht so wie bei Knight Rider, aber ich versteh 
diesen einen Befehl nicht ganz, also was der eben bewirkt.

Wäre toll wenn ihr mir helfen könntet, danke auf jeden Fall mal für eure 
Antworten!!! :)

Gruß,
Poschi

von spess53 (Gast)


Lesenswert?

Hi

>Was macht der Befehl, ori akku, 0b10000000, im Unterprogramm "rechts"???

Setzt Bit7 auf 1.

Allerdings kann man

>lsr akku
> ori akku, 0b10000000

durch 'asr akku' ersetzen.


MfG Spess

von Karl H. (kbuchegg)


Lesenswert?

spess53 schrieb:

> Allerdings kann man
>
>>lsr akku
>> ori akku, 0b10000000
>
> durch 'asr akku' ersetzen.

Ich denke nicht, dass es dann noch funktioniert.
So wie 'links' geschrieben ist, ist akku gleich 0b01111111 wenn es das 
erste mal in 'rechts' hineingeht. Ein asr würde dann daraus 0b00111111 
machen.

daher muss man explizit das MSB setzen.

PS: Im Programm ist ein Fehler.
Du setzt die Pins nicht auf Ausgang!

init:

  ldi akku, 0b11110111
  out PORTB, akku



das muss
  out DDRB, akku
lauten und nicht PORTB

von Tom (Gast)


Lesenswert?

Kann sein, dass mit dem Init-Teil die Ausgänge auf einen Anfangswert 
gesetzt werden sollen (aber Sinn macht es nicht). Das DDRB könnte 
ausserhalb des Code-Ausschnitts gesetzt werden.

von spess53 (Gast)


Lesenswert?

Hi

>Ich denke nicht, dass es dann noch funktioniert.

Stimmt. Also diesen Teil bitte ignorieren.

MfG Spess

von Karl H. (kbuchegg)


Lesenswert?

Tom schrieb:
> Kann sein, dass mit dem Init-Teil die Ausgänge auf einen Anfangswert
> gesetzt werden sollen (aber Sinn macht es nicht). Das DDRB könnte
> ausserhalb des Code-Ausschnitts gesetzt werden.

Möglich.
Auch möglich, dass es sich um die erste Anzeigestufe nach dem 
Einschalten handelt. Das 0b11110111 als Initialiwert könnte man so 
auffassen.

In dem Fall fehlt dann die Initialisierung des DDRB komplett. Ich glaube 
nämlich nicht daran, dass da noch etwas nicht gezeigt wurde :-)

von Sven (Gast)


Lesenswert?

Ist auch egal, weil das so schnell durchlaufen würde, dass man eh nichts 
sieht.

Ich würd mal noch 2 Warteschleifen spendieren.

von poschi8 (Gast)


Lesenswert?

Danke für die vielen Antworte...
Und ja bei der Initialisierung habe ich mich vertan, das stimmt schon.
Aber mit ldi akku, 0b11110111 soll der Anfangswert defieniert werden.
Und die Geschwindikeit ist fürs erste auch kein Thema weil ich das nur 
für Schulische zwecke programmiert habe, also zum herzeigen das es geht, 
auf einen AVR werde ich das nicht wirklich rausschreiben.
Danke auf jeden Fall für alle eure Antworten :)

Gruß,
Poschi

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.