Forum: Compiler & IDEs Kein blinken bei Blinklichtprogrammierung


von Konrad (Gast)


Lesenswert?

Moin!
Ich starte grade in das Thema Mikrocontroller und habe mal angefangen 
eine LED blinken zulassen dafür habe ich folgendes Programm geschrieben.
1
#include <avr/io.h> 
2
#include <stdint.h>
3
4
int main (void) { 
5
DDRA = 0xff;
6
int i;
7
int a;
8
i=1;
9
a=10000;
10
11
while(1){
12
i++;
13
14
if(i==a){
15
i=1;
16
a++;
17
if(a==32000){
18
a=10000;
19
}
20
21
PORTA = PORTA ^ 0x01;
22
}
23
24
}
25
26
return(0);
27
}
avr-gcc compiliert das ganz braf aber im Controller passiert garnichts 
die LED leuchtet bei knapp 2.5V(statt 5V) blinkt aber nicht.
Entferne ich nun das:
a++;

Blink die LED aber halt in dem festen Takt.
Könnt ihr irgendwo einen Fehler entdecken?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Konrad wrote:

> die LED leuchtet bei knapp 2.5V(statt 5V) blinkt aber nicht.

Sie blinkt so schnell, dass du es nicht mehr siehst...  Der Compiler
schmeißt deine aus seiner Sicht nutzlosen Schleifen für die
Verzögerung raus.

Mach's so:
1
#define F_CPU 1000000
2
#include <util/delay.h>
3
4
...
5
  for (;;) {
6
    PORTA = PORTA ^ 0x01;
7
    _delay_ms(100);
8
  }

oder fang gleich mit dem Demoprojekt der avr-libc an:

http://www.nongnu.org/avr-libc/user-manual/group__demo__project.html

von Konrad (Gast)


Lesenswert?

Hmm das ist ja blöd mit dem Compiler naja so klappt es ja auch.
Vielen Dank an dich!

von Matthias (Gast)


Lesenswert?

Wenn man das Optimierungslevel ändert, lässt er doch die schleifen 
drinnen.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Matthias wrote:
> Wenn man das Optimierungslevel ändert, lässt er doch die schleifen
> drinnen.

Genau.  Wenn man beim Porsche die Handbremse angezogen lässt, rast
er auch nicht so schnell los. :-)

von Peter D. (peda)


Lesenswert?

Konrad wrote:
> Hmm das ist ja blöd mit dem Compiler naja so klappt es ja auch.

Nö, ist nicht blöd, sondern äußerst praktisch:

Man schreibt die benötigte Zeit einfach hin, compiliert, brennt und dann 
stimmts auch.


Wenn Du in einer Schaltung 47k Widerstände brauchst, nimmst Du doch auch 
gleich die richtigen und bastelst nicht haufenweise Trimmpotis rein, die 
man umständlich abgleichen muß.


Peter

von Matthias (Gast)


Lesenswert?

>Genau.  Wenn man beim Porsche die Handbremse angezogen lässt, rast
>er auch nicht so schnell los. :-)

Ich lasse die Optimierungen auch immer drinnen, aber man kann sie auch 
ausschalten, wenn er sein Programm testen will. Ich wollte nur sagen, 
dass es geht.

von Friedrich Feichtinger (Gast)


Lesenswert?

@Konrad

Ich weiß nicht ob du deinen Code wirklich so unformatiert geschrieben 
hast, oder ob das nur durch das Kopieren aus dem Editor entstanden ist, 
aber im ersten Fall würde ich dir dringend raten Einrückungen zu 
verwenden.

Der Code wirkt furchtbar unleserlich.

Zum Thema:

> Wenn Du in einer Schaltung 47k Widerstände brauchst, nimmst Du doch auch
gleich die richtigen und bastelst nicht haufenweise Trimmpotis rein, die
man umständlich abgleichen muß. <

Aber wer was dazu lernen will, der kauft sich nicht gleich einen 
fertigen Schaltkreis ( #include <util/delay.h> ) sondern versucht es 
zunächst mal selbst.

Die sinnvolle Methode Zeitverögerungen am Controller zu bewirken heißt 
Timer. Die oben angesprochene Funktion baut aller Wahrscheinlichkeit 
auch darauf auf. Im Prinzip gibt es 2 Möglichkeiten: Entweder du setzt 
einen Timer und wartest in einer Schleife bis er sein Flag setzt, oder, 
wenn dein Controller nicht so viel Zeit zu verschwenden hat, du 
verwendest einen Interrupt.

Am besten du läd'st dir das Datenblatt deines Controllers herunter und 
kämfpst dich durch den Abschnitt 'Timer'

mfg Fritz

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.