delay bringt mich zum verzweifeln; Optimization level?

Gast #587843
Lesenswert?

Hi Community,

bin "relativ neu" in der µC Entwicklung mit AVR. Ich wollte ganz einfach 
eine led blinken lassen, wie im tutorial beschrieben. Ich hab jetzt 
ehrlich bestimmt 50 Varianten durch. Doch immer das selbe resultat: LED 
leuchtet permanent. Ich hab auch die max. delay time berücksichtigt. 
Bitte um hilfe, ich vermute das der Quelltext soweit richtig ist und 
vielleicht nur meine winavr Einstellung falsch ?!?!
Als Warning gibt er komischerweise nur manchmal aus :
warning "Compiler optimizations disabled; functions from <util/delay.h> 
won't work as designed"

Atmega8515L

Mein Quelltext:
#include "avr/io.h"

#ifndef F_CPU
#define F_CPU 1000000UL
#endif

#include "util/delay.h"




int main(void)
{

  uint8_t i=0;


  DDRA = 0b00000001;
  PORTA= 0b00000001;


  while(1)
  {

  PORTA ^= (1 << PA0);

    for(i=0;i<100;i++)
    {
    _delay_ms(10);
    }

  }

return 0;
}
Gast #587859
Lesenswert?

Hi,

danke für die schnelle Antwort. Hab ich jetzt eingestellt. Hat aber 
immer noch nicht die Wirkung gebracht.

Ich hab da meine Frequenz eingestellt 1000000 Hz und das Model 
Atmega8515.

Hab das Stk500 und wenn ich den µC progge setze ich auf intern 1 MHz 
(default)

Ist das vielleicht doppelt gemoppelt wegen dem Quelltext

#ifndef F_CPU
#define F_CPU 1000000UL
#endif

Danke
groetjes Henni
Moderator Persönliche Seite #587870
Lesenswert?

Habe einen STK500 aus dem Schrank genommen (da steckt ein ATmega8515
von Haus aus drin), deinen Code compiliert, geflasht -- geht.  Mir
kommt es so vor, als würde er zu schnell blinken, hab's aber auch
nicht nachgemessen oder andwerweitig analysiert.

> warning "Compiler optimizations disabled; functions from <util/delay.h> won't 
work as designed"

Ja, wenn du _delay_ms() nehmen willst, solltest du die Optimierung
einschalten, sonst wird alles viel zu langsam gehen.

Hier das Hexfile, ist ja ziemlich klein.
1
:1000000010C029C028C027C026C025C024C023C0D6
2
:1000100022C021C020C01FC01EC01DC01CC01BC0EC
3
:100020001AC011241FBECFE5D2E0DEBFCDBF10E065
4
:10003000A0E6B0E0EAE7F0E002C005900D92A0363D
5
:10004000B107D9F710E0A0E6B0E001C01D92A036DC
6
:10005000B107E1F701C0D4CF81E08ABB8BBB31E0AF
7
:10006000E4ECF9E08BB383278BBB20E0CF01019751
8
:0A007000F1F72F5F2436D1F7F5CF2A
9
:00000001FF

Der disassemblierte Code sieht eigentlich OK aus:
1
00000058 <main>:
2
  58:   81 e0           ldi     r24, 0x01       ; 1
3
  5a:   8a bb           out     0x1a, r24       ; 26
4
  5c:   8b bb           out     0x1b, r24       ; 27
5
  5e:   31 e0           ldi     r19, 0x01       ; 1
6
  60:   e4 ec           ldi     r30, 0xC4       ; 196
7
  62:   f9 e0           ldi     r31, 0x09       ; 9
8
  64:   8b b3           in      r24, 0x1b       ; 27
9
  66:   83 27           eor     r24, r19
10
  68:   8b bb           out     0x1b, r24       ; 27
11
  6a:   20 e0           ldi     r18, 0x00       ; 0
12
  6c:   cf 01           movw    r24, r30
13
  6e:   01 97           sbiw    r24, 0x01       ; 1
14
  70:   f1 f7           brne    .-4             ; 0x6e <main+0x16>
15
  72:   2f 5f           subi    r18, 0xFF       ; 255
16
  74:   24 36           cpi     r18, 0x64       ; 100
17
  76:   d1 f7           brne    .-12            ; 0x6c <main+0x14>
18
  78:   f5 cf           rjmp    .-22            ; 0x64 <main+0xc>

In Adresse 0x60/0x62 wird rr30 mit 0x9c4 = 2500 geladen.  Das ist
dann der Schleifenzähler für die innere Schleife (0x6e/0x70), die
wird also 4 * 2500 = 10000 Mal durchlaufen.  Darum gewickelt ist
die x100 äußere Schleife.  Wenn das Teil also schneller blinkt,
müssen die Fuses irgendwie anders stehen...
Gast #587872
Lesenswert?

Hmmm ja,

dann ist ein fragezeichen weniger bei mir. Das Problem ist immer noch 
das selbe das die LED konstant 5 V bekommt. Alle anderen ports sind low, 
auch nachgemessen.

Wo liegt mein Fehle, bzw. mögliche Fehlerquellen???

Danke groetjes Henni
Gast #587877
Lesenswert?

Hi Jörg das ist ja richtig nett von dir das du so einen aufwand machst, 
danke.

Mein Problem ist aber das meine LED augenscheinlich immer an ist und 
auch immer 5V am ausgang hat. Also muss ich die Fuses überprüfen???

Henni
Gast #587891
Lesenswert?

den Atmega auslesen geht, datei im Anhang.
Ich versuch ma nen anderen PIN, müsste eigentlich aber egal sein.

Also auf 0 Volt geht bei mir nichts. Kann aber auch sein das mein 
Multimeter zu träge ist und das nicht so schnell mitbekommt. Aber die 
LED ist augenscheinlich immer an und ich will ja ca. ne Sekunde pause 
haben.


groetjes Henni
Angehängte Dateien:
#587893
Lesenswert?

Henni wrote:
> den Atmega auslesen geht, datei im Anhang.
> Ich versuch ma nen anderen PIN, müsste eigentlich aber egal sein.
>
> Also auf 0 Volt geht bei mir nichts. Kann aber auch sein das mein
> Multimeter zu träge ist und das nicht so schnell mitbekommt. Aber die
> LED ist augenscheinlich immer an und ich will ja ca. ne Sekunde pause
> haben.

Wenn du die Vermutung hast, dass die LED in Wirklichkeit
ganz schnell blinkt, kannst du das leicht abtesten.
Schalte einfach daneben eine LED auf Dauer-EIN. Eine
blinkende LED ist deutlich dunkler.

#587899
Lesenswert?

Henni wrote:
> Ich versuch ma nen anderen PIN, müsste eigentlich aber egal sein.

Das ist richtig.
Aber eigentlich muesste dein Programm auch funktionieren :-)

Alles schon dagewesen:
Das erste Programm schaltet lediglich die LED ein.
Reingebrannt, geht. LED leuchtet

Das nächste Programm entsteht aus dem ersten, indem
die LED zum Blinken gebracht wird. Nur aus irgendeinem
Grund schafft es das Programm nicht bis in den µC
(Compilerfehler, Brennfehler, was weiss ich). Auf
jeden Fall führt der µC immer noch Programm 1 aus,
während der Programmierer denkt das Programm 2 läuft.

Der genervte Programmierer steht dann mit einem µC da,
der partout nicht blinkt, obwohl das Programm das eigentlich
vorschreibt.

Wie gesagt: Alles schon mal dagewesen.
Gast #587904
Lesenswert?

Sorry ich habs, danke an alle !

Ich bin davon ausgegangen wenn ich das compiliere und built mache, 
anschließend eine übertragung zum stk500 veranlasse, das er auch das 
file nimmt.

Aber es ist so das ich das INput HEX-File Verzeichnis seperat/manuell 
wechseln muss, lol. man o man . Da stand noch mein altes 
projektverzeichnis drinne.

Danke für die mühen, trotzdem hätte ich es ohne euch nicht geschafft. So 
wußte ich das es nämlich nicht am code lag.

Danke und weiterhin viel spass

groetjes Henni

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren