Forum: Mikrocontroller und Digitale Elektronik Problem++ - Compilerfehler?!


von Schmidtche (Gast)


Lesenswert?

Hallo zusammen,

Bin schon seit längerem auf einem ATTINY13 am programmieren, hatte 
zunächst etwas Assembler gemacht und wollte nun auf C++ umsteigen.
Jetzt zum Problem: Sobald ich in meinem Quelltext irgendwo z.B. i++ 
schreibe, um hchzuzählen, macht mir der Compiler (WinAVR) 28kB aus nem 
einfachen Blinkprogramm, blinken tuts auch nicht :-((( Ich benutze 
Code::Blocks mit WinAVR.

Dankeschön im Vorraus!
Gruß

.chris.

von M. J. (manfred-64)


Lesenswert?

Hi,

wenn dein 'I' ein Float Type ist würde mich das nicht wirklich wundern.


mfg

von (prx) A. K. (prx)


Lesenswert?

Und wie stellst du dir ohne Quelltext irgendwelche Hilfe vor?

von Peter II (Gast)


Lesenswert?

Bitte Beispiel zeigen.

von Guru (Gast)


Lesenswert?

> Sobald ich in meinem Quelltext irgendwo z.B. i++
>schreibe, um hchzuzählen, macht mir der Compiler (WinAVR) 28kB aus nem
>einfachen Blinkprogramm, blinken tuts auch nicht

Was macht der Compiler aus dem einfachen Blinkprogramm?

Es ist zwar zur Gänze nie ganz auszuschliessen, das Compilerfehler 
vorliegen. Aber bei einem Operator wie ++ der millionenfach, täglich 
jedenfalls bestimmt mehrere tausend Male, verwendet wird, wäre so ein 
Fehler schon längst aufgefallen. Es ist also extremst unwahrscheinlich 
das es am Compiler liegt.

Im allgemeinen ist es sowieso so, das man zuerst seinen eigenen Code 
verdächtigen sollte als den Compiler (es sei denn man hat den Compiler 
gerade selbst geschrieben). Also schmink Dir das erstmal ab. Ich muss 
sowieso immer innerlich leicht grinsen, wenn jemand sowas ohne 
wenigstens den Ansatz eines Beleges behauptet. :-)

So global kann man ohnehin nicht antworten, wenn man nicht weiss was nun 
genau schief läuft. Beschreibe mal genau, was das Problem ist und zeige 
den Quellcode.

von Schmidtche (Gast)


Lesenswert?

Hallo,

Sorry, hatte den Quelltext verpeilt.
Hier isser:
1
#include <avr/io.h>
2
#include <util/delay.h>
3
#include <stdint.h>
4
int main(void)
5
{
6
7
    int n = 1000;
8
    DDRB = (0 << DDB0 | 0 << DDB1 | 0 << DDB2 | 1 << DDB3 | 1 << DDB4);
9
    while(1)
10
    {
11
        do
12
        {
13
            PORTB = 16;
14
            _delay_ms(n);
15
            n-- ;
16
            PORTB = 8;
17
        } while(n>100);
18
19
    };
20
21
    return 0;
22
}

Wenn ich das so compiliere kommen gut 28kB zusammen, ohne das n-- sind 
es 1,4kB. Hatte zu Anfang ein Beispiel abgetippt, in dem ne For-Schleife 
als Pause eingebaut war, da bestand das gleiche Problem.

Danke schonmal für die Antworten!
lg

.chris.

von Peter II (Gast)


Lesenswert?

Hier ist das Problem

_delay_ms(n);


delay sollte man mit Konstanten aufrufen, nicht mit Variablen.

von Schmidtche (Gast)


Lesenswert?

Hi

ok, das Problem wäre gelöst, danke.
Wenn ich nun aber folgendes mache:
1
/*
2
 */
3
4
#include <avr/io.h>
5
#include <util/delay.h>
6
#include <stdint.h>
7
int main(void)
8
{
9
10
11
    DDRB = (0 << DDB0 | 0 << DDB1 | 0 << DDB2 | 1 << DDB3 | 1 << DDB4);
12
    int n = 3;
13
14
    while(1)
15
    {
16
        do
17
        {
18
            PORTB = 16;
19
            _delay_ms(1000);
20
            n-- ;
21
            PORTB = 8;
22
            _delay_ms(1000);
23
        } while(n!=0);
24
25
    };
26
27
    return 0;
28
}

dann müsste er eigentlich 3mal wechselblinken und dann stoppen - tut er 
aber nicht. Sorry für die Anfängerfragen, aber Assembler iss schon was 
anderes :-)

lg

.chris.

von Peter II (Gast)


Lesenswert?

Schmidtche schrieb:
> dann müsste er eigentlich 3mal wechselblinken und dann stoppen - tut er
> aber nicht.
Und was tut das Programm dann?

von (prx) A. K. (prx)


Lesenswert?

Schmidtche schrieb:

> dann müsste er eigentlich 3mal wechselblinken und dann stoppen

Nein. Die while-Schleife sorgt dafür, dass es weiter geht und die 
do-while-Schleife effektiv nutzlos ist. Mit
n = 3 2 1 0 -1 -2 -3 ...

von Schmidtche (Gast)


Lesenswert?

Hi

...ok, habs verstanden, er läuft ja in die do-while immer wieder rein.
Ich schlaf mal drüber und meld mich dann wieder..

Vielen Dank für die Hilfe!

lg

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.