Kein blinken bei Blinklichtprogrammierung

Gast #1010539
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?
Moderator Persönliche Seite
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
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
Gast
>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.
Gast
@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

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.