Hallo,
beschäftige mich in der Schule und jetzt auch ein bissin privat mit der
programmierung eines Microcontrollers. Programmiersprache is CPP und der
Controller dürfte ein ATmega8 sein.
Jetzt kommen wir mal zu meiner Frage, unzwar:
A) Ich schaffe es einfach nicht ein Lauflicht zu realisieren, eine
einzele LED kann ich blinken lassen (Dank eines Tuts hier). Aber wenn
ich das selbe einfach nochmal schreibe und die Pins abändere, klappt es
nicht (Ausgänge usw habe ich beachtet).
Und da das mein erste Beitrag ist hoffe ich mal ich benute auch die
Syntax vom Forum richtig:
1
#include<avr/io.h>
2
#include<util/delay.h>
3
#include<stdint.h>
4
5
constuint8_tLEDrot_B=PB0;
6
constuint8_tLEDgelb_B=PB1;
7
constuint8_tLEDgruen_B=PB2;
8
9
voidlong_delay(uint16_tms)
10
{
11
for(;ms>0;ms--)_delay_ms(1);
12
}
13
14
intmain(void)
15
{
16
DDRB=(1<<LEDrot_B);
17
DDRB=(1<<LEDgelb_B);
18
DDRB=(1<<LEDgruen_B);
19
20
while(1)
21
{
22
PORTB^=(1<<LEDgruen_B);
23
PORTB^=(1<<LEDgelb_B);
24
long_delay(1000);
25
}
26
return0;
27
}
Meiner Meinung nach müsste der Controller doch jetzt immer die gelbe und
die gruene LED an und ausschalten, oder? Den nur die gruene LED blinkt,
und die gelbe nicht oder diese flakert nur ganz schwach.
B) Noch eine Frage: Kann mir jemand Schritt für Schritt die Funktion
(ist doch eine, oder?) void long_delay erklären? Verstehe was sie macht,
aber nicht wie.
C) Dann noch eine Frage, was wäre die kleinste erkennbare Umschaltzeit
die ich erkennen kann mit dem Auge? Mir sind die 50Hz vom TV usw
bekannt, aber wie wäre eine genaue ms Zeit?
Noch als Zusatz: Richtig gelötet sind alle LEDs, wenn ich diese über
einen Taster oder über den HIGH-PIN ansteuer leuchten alle normal und
gleich stark.
Hoffe einer kann mir helfen, mfG Mole
> C) Dann noch eine Frage, was wäre die kleinste erkennbare Umschaltzeit> die ich erkennen kann mit dem Auge? Mir sind die 50Hz vom TV usw
1 Hz = 1/s also s= 1/Hz
Gruß
Tom
zu B): Man nehme eine Schleife, die man "ms"-lang laufen lässt und in
dieser Schleife wird eine Pause von 1ms gemacht. Nichts anderes als die
Multiplikation einer Millisekunde mit einer Vatiablen.
STK500-Besitzer schrieb:
> zu B): Man nehme eine Schleife, die man "ms"-lang laufen lässt und in> dieser Schleife wird eine Pause von 1ms gemacht. Nichts anderes als die> Multiplikation einer Millisekunde mit einer Vatiablen.
wobei da aber vermutlich nicht die erwartete Sekunde Pause rauskommwn
wird durch den Overhead der for-schleife...
@ Justus Skorps (jussa)
>> dieser Schleife wird eine Pause von 1ms gemacht. Nichts anderes als die>> Multiplikation einer Millisekunde mit einer Vatiablen.>wobei da aber vermutlich nicht die erwartete Sekunde Pause rauskommwn>wird durch den Overhead der for-schleife...
Die paar Mikrosekunden kann man problemlos in den Skat drücken, für
diese "Anwendung" erst recht!
MFG
Falk
Erstmal danke an euch, das ich das ODER nicht geschrieben habe verwirrt
mich auch grade. Sehe aber das es in dem Tut (Mit nur einer LED) auch
ohne ist, kann mir einer erklären warum es mit einer geht aber bei
mehreren der ODER gebraucht wird?
Dann nochmal zu B) ich verstehe ja was die Schleife macht, sie sagt ja
das man solange durchlaufen soll wie ms größer wie 0 ist, dann bei jedem
Durchlauf immer ms um eins verringern und ms wird ja am Anfang auf 1000
gesetzt, also 1000 Durchläufe.
Aber was bedeutet: _delay_ms(1); ist das die delay funktion die einfach
1ms dauert ? (diese wird ja dann 1000 mal wiederholt) und ist diese auf
1 beschränkt oder warum sagt man nicht _delay_ms_(1000)?
Mole schrieb:
> Erstmal danke an euch, das ich das ODER nicht geschrieben habe verwirrt> mich auch grade. Sehe aber das es in dem Tut (Mit nur einer LED) auch> ohne ist, kann mir einer erklären warum es mit einer geht aber bei> mehreren der ODER gebraucht wird?>
Weil im Tut wahrscheinlich nur EINE Zuweisung an DDRx gemacht wird.
Eine Zuweisung überschreibt immer alle Bits und nicht nur einzelne.
i = 9;
i = 3;
Du würdest dich schön bedanken, wenn nach der 2.ten Zuweisung noch das
eine gesetzte Bit von der 9 in i stehen würde.
> Aber was bedeutet: _delay_ms(1); ist das die delay funktion die einfach> 1ms dauert ? (diese wird ja dann 1000 mal wiederholt) und ist diese auf> 1 beschränkt oder warum sagt man nicht _delay_ms_(1000)?
Weil es früher mal eine Beschränkung für die _delay_ms Funktion gab. Die
Zeit konnte eine gewisse Grenze, die durch die Taktfrequenz des µC
vorgegeben war, nicht überschreiten.
Wenn du willst, kannst du heute auch _delay_ms(1000) schreiben. Die
Beschränkung wurde vor einiger Zeit aufgehoben.
Falk Brunner schrieb:
> Die paar Mikrosekunden kann man problemlos in den Skat drücken, für> diese "Anwendung" erst recht!
schon klar, aber lieber sagt man ihm das am Anfang, bevor er was sich
was ungenaues merkt und dann später damit mal 100 µs genau einstellen
will..
Dann noch eine Frage, ich habe jetzt alles an einen Taster geschlossen,
also erst sollen sie nacheinandere angehen wenn der Taster1 gedrückt
wird und wenn dieser wieder losgelassen wird, in umgekehrter Reihenfolge
auch wieder aus. Klappt auch soweit alles gut, aber ich habe Taster1 an
einen PullUP angeschlossen und möchte diesen einfach vorher wieder
umlegen. Wie genau müsste meine Variable und meine Abfrage dafür
aussehen?
Mole schrieb:
> Dann noch eine Frage, ich habe jetzt alles an einen Taster geschlossen,> also erst sollen sie nacheinandere angehen wenn der Taster1 gedrückt> wird und wenn dieser wieder losgelassen wird, in umgekehrter Reihenfolge> auch wieder aus. Klappt auch soweit alles gut, aber ich habe Taster1 an> einen PullUP angeschlossen und möchte diesen einfach vorher wieder> umlegen.
Was mag das wohl heissen?
Sorry für den unklaren Text, aber in Kurzform:
Habe meinen Taster1 an einem PullUP, weil mir das aber immer Probleme
gibt beim umdenken (Wenn gedrückt = 0) möchte ich das vorher ändern mit
meiner Abfrage wie oben beschrieben.
Das praktisch meine Variable "Taster1_D_PullUP" den Wert von PD2 hat,
aber dieser in meiner Variable Taster1_D genau umgedreht ist, bedeutet
das Taster1_D eine 1 hat wenn der Taster gedrückt ist.
Immer noch schwer zu verstehen aber ich weiß nicht wie ich es besser
beschreiben soll... Hoffe einer versteht es und kennt die Lösung oder
kann es den anderen näher bringen.
Okay scheinbar steigt keiner durch die Frage durch... schade.
Aber kann mir jemand sagen wie ich eine Frequenz einen Summer zuweise?
Müsste doch auch funktionieren wenn ich ihn ein- und ausschalte, wäre
eine rechteckige Frequenz, und durch den delay kann man die Zeit
bestimmen.
Mole schrieb:
> Sorry für den unklaren Text, aber in Kurzform:>> Habe meinen Taster1 an einem PullUP, weil mir das aber immer Probleme> gibt beim umdenken (Wenn gedrückt = 0) möchte ich das vorher ändern mit> meiner Abfrage wie oben beschrieben.
Gewöhn dich daran.
if( PIND & ( 1 << PD2) )
... Abfrage ob der Pin High ist
if( !( PIND & ( 1 << PD2) ) )
... Abfrage ob der Pin Low ist.
Der einzige Unterschied ist das der Ausdruck in Klammern steht und ein !
davor ist.
Wenn dir das Probleme macht, dann mach dir ein Makro dafür