www.mikrocontroller.net

Forum: Compiler & IDEs Kein blinken bei Blinklichtprogrammierung


Autor: Konrad (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin!
Ich starte grade in das Thema Mikrocontroller und habe mal angefangen 
eine LED blinken zulassen dafür habe ich folgendes Programm geschrieben.
#include <avr/io.h> 
#include <stdint.h>

int main (void) { 
DDRA = 0xff;
int i;
int a;
i=1;
a=10000;

while(1){
i++;

if(i==a){
i=1;
a++;
if(a==32000){
a=10000;
}

PORTA = PORTA ^ 0x01;
}

}

return(0);
}
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?

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
#define F_CPU 1000000
#include <util/delay.h>

...
  for (;;) {
    PORTA = PORTA ^ 0x01;
    _delay_ms(100);
  }

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

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

Autor: Konrad (Gast)
Datum:

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

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn man das Optimierungslevel ändert, lässt er doch die schleifen 
drinnen.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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. :-)

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Friedrich Feichtinger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.