Hallo,
meine Aufgabe besteht darin, einen KnightRider zu programmieren:
* gegeben ist ein 8-bit Mikrocontroller
* auf zwei Ports soll mein KnightRider laufen A und B
* A wird als Ausgang konfiguriert
Mein Quellcode:
1
intmain(void)
2
{
3
DDRA=0b11111111;
4
DDRB=0b01010101;
5
6
PORTA=0b00000111;
7
inti,j;
8
9
while(1){
10
11
if(i=0){
12
PORTA=0b00000001;
13
_delay_ms(100);
14
PORTA=0b00000011;
15
_delay_ms(100);
16
}
17
18
for(i=0;i<9;i++){
19
PORTA=0b00000111>>i;
20
_delay_ms(100);
21
}
22
23
for(j=0;j<9;j++){
24
PORTA=0b11100000<<j;
25
_delay_ms(100);
26
}
27
}
28
}
Ich habe es bisschen umständlich gemacht aber es funktioniert dennoch.
Laut meinem Praktikumsbetreuer kann ich die if und for Anweisungen
kürzen und es auf eine Zeile reduzieren. Es muss ca. so aussehen:
1
PORTA=(((PINB&0b01010101)|(~0b01010101))<<2);
Das wird aber nicht funktionieren, da ich die Zeile nicht verstehe und
generell nicht weiß, wie genau es gekützt werden soll, damit in der
while(1) genau diese Zeile steht.
Kennt sich jemand evtl damit aus oder kennt ein Tutorial (nur mit
Erklärung) dazu?
Mnb B. schrieb:> if (i=0) {
Das ist eine Zuweisung. Die Bedingung ist nie wahr. Selbst wenn es ein
Vergleich wäre, wäre es falsch - i und j werden nicht initialisiert und
enthalten zu Beginn zufällige Werte.
In den beiden for-Schleifen werden 3x sinnvolle Werte ausgegeben, in den
restlichen 6 Durchläufen wird nur 0 geschrieben. Ist das Absicht?
Dr. Sommer schrieb:> Ist das Absicht?
Vermutlich. Die Idee war einfach von links nach rechts die LEDs zu PortA
und dann zu B durchlaufen zu lassen. Die "Plätze" verschieben sich aber.
Sprich wenn es bei 00001000 anfängt, muss es im nächsten Durchlauf
00000100 sein. Also die Kette ist immer noch dieselbe aber die eins
verschiebt sich solange, bis die Ursprungsform von 00001000 wiederkehrt
und dasselbe für PortB.
Die Aufgabe besteht darin, exakt dasselbe durchzuführen, nur
"einzeilig".
@ Mnb B. (poiuzt)
>meine Aufgabe besteht darin, einen KnightRider zu programmieren:
Kaum. Eher ein Lauflicht, das wie beim KnightRider aussieht.
>* gegeben ist ein 8-bit Mikrocontroller
Der anscheinend ein AVR ist. Könnte man ja mal sagen, siehe
Netiquette.
>* auf zwei Ports soll mein KnightRider laufen A und B
Warum 2 Ports?
>* A wird als Ausgang konfiguriert
Und was ist mit Port B?
> if (i=0) {
Ist eine ZUWEISUNG und KEINE Abfrage! Typische Falle bei C!
Aber wozu?
> for(i=0; i<9; i++) {> PORTA = 0b00000111>>i;
Kann man machen, aber warum nicht einfach ein Muster passend schieben,
immer nur einen Schritt?
Eher so
...und wenn man keine Glühlampen sondern LED benutzt (heutzutage ja sehr
wahrscheinlich), fehlt der "Schweif" per SW PWM - das wäre dann Teil B
der Hausaufgabe, mit dem du richtig Eindruck schinden könntest...
Klaus.
Klaus R. schrieb:> ...und wenn man keine Glühlampen sondern LED benutzt (heutzutage ja sehr> wahrscheinlich), fehlt der "Schweif" per SW PWM - das wäre dann Teil B> der Hausaufgabe, mit dem du richtig Eindruck schinden könntest...>> Klaus.
Das kommt erst nächstes Jahr. Aber bis dato muss ich erstmal das
verstehen.
Falk B. schrieb:> Warum 2 Ports?
Um die Schwierigkeit (im Praktikum) zu erhöhen.
Danke für den Quellcode.
Meine Version basiert halt auf Internetwissen, da mein Prof krank ist
und erst nächstes Jahr kommt. Bis dato muss ich es dennoch irgendwie
hinkriegen.
@Christopher B. (chrimbo)
>> muster >= 1;>das ist übrigens Vergleichstatements die nicht ausgewertet werden. Ich>gehe davon aus du meinstest <<= bzw. >>=
Uuups, erwischt ;-)
Mnb B. schrieb:> Die Absicht der Aufgabe besteht darin, den Quellcode nur auf eine Zeile> zu reduzieren, also:
Da gibt es dann 2 Möglichkeiten:
1. Das läuft dann halt so schnell durch, dass du einen Logikanalyzer
brauchst.
Oder
2. Lass die Zeilenumbrüche weg:
1
while(1){
2
PORTA=muster[i];i++;if(i>9)i=0;_delay_ms(200);
3
}
Voila, alles in einer Zeile... ;-)
Mnb B. schrieb:> PORTA = (((PINB & 0b01010101) | (~0b01010101))<<2);
Was kommt da am Port B herein?
@Mnb B. (poiuzt)
>Ausgehend von allen Versionen des Codes hier, welchen Ansatz muss ich>für die while-Schleife verwenden, um beispielweise> PORTA = (((PINB & 0b01010101) | (~0b01010101))<<2);> zu bekommen?
Was soll denn PINB hier bewirken? Soll es als Zwischenspeicher dienen?
Und warum PINB? Wenn schon, dann PORTA.
>Die Absicht der Aufgabe besteht darin, den Quellcode nur auf eine Zeile>zu reduzieren, also:
Glaub ich nicht so ganz.
> PORTA = (((PINB & 0b01010101) | (~0b01010101))<<2);
Das ist eine Bitmanipulation, wenn gleich ich den Sinn dahinter
nicht verstehen.
Falk B. schrieb:> Was soll denn PINB hier bewirken? Soll es als Zwischenspeicher dienen?> Und warum PINB? Wenn schon, dann PORTA.
Nee aber PORTB war definiert als 01010101. (Kann ich daraus DDRB=
0b01010101 schlussfolgern?) Daher habe ich PINB mit reingenommen. Weil
sonst sehe ich keinen Sinn in der Aufgabe Port B überhaupt zu erwähnen.
Kleine Klugscheißerei am Rande:
Das Auto mit dem Lauflicht heißt K.I.T.T.
Der KnightRider ist der fahrende Ritter, also der Mann. Der hatte keine
Lichter am Körper bzw. an seiner Kleidung.
Doch! Beim Mauerfall hatte er eine "beeindruckend blinkende Lederjacke"
an! Aber streng genommen war das sein alter ego als Künstler, da der Job
bei der FFRUV nicht einträglich genug war...
Klaus.
Hier ist eine winzige Schaltung mit ATtiny13 für 12 Leuchtdioden:
http://stefanfrings.de/knightrider/index.html
Es ist sogar noch ein Pin frei für Erweiterungen - Hoho!
Wenn man Glühlampen (über SSR angesteuert) verwendet, sieht das richtig
gut aus.
@Klaus R. (klaus2)
>Doch! Beim Mauerfall hatte er eine "beeindruckend blinkende Lederjacke">an! Aber streng genommen war das sein alter ego als Künstler, da der Job>bei der FFRUV nicht einträglich genug war...
Aha!!! Also ist der auch beim Verfassungsschutz rausgeflogen! Hat der
seinen Chef für blöd erklärt oder der Mechanikerin (Name?) an den
Hintern gefaßt? ;-)
(FFRUV = Foundation für Recht und Verfassung, so jedenfalls die
denglische Übersetzung)
(dum didel dum, dum didel dum, dum didel dum, dum, dum . . . . . dum
dum)