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.
Hi, wenn dein 'I' ein Float Type ist würde mich das nicht wirklich wundern. mfg
> 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.
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.
Hier ist das Problem _delay_ms(n); delay sollte man mit Konstanten aufrufen, nicht mit Variablen.
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.
Schmidtche schrieb: > dann müsste er eigentlich 3mal wechselblinken und dann stoppen - tut er > aber nicht. Und was tut das Programm dann?
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 ...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.