Forum: Mikrocontroller und Digitale Elektronik Programmgröße ATtiny2313


von Christian H. (ct2034) Benutzerseite Flattr this


Lesenswert?

Hallo liebe Community

Könntet ihr mir vielleich erklären, warum dieses Programm so groß ist. 
Es ist genau ein kleines bisschen zu groß für meinen ATtiny2313. Ich hab 
aber absolut keine Ahnung warum, das Programm kann doch fast nix.
1
#include <avr\io.h>
2
#define F_CPU 8000000UL     /* Quarz mit 8 Mhz */
3
#include <util/delay.h>
4
5
int main(void)
6
{
7
//**** Initialiserung  ****
8
9
int anz_tastendr = 0, gedr = 0, anz_abl = 20;
10
double anz_abfragen=10000;
11
12
DDRD = 0b01000000;  // LED 1 ist Ausgang
13
DDRB = 0b00000000;  // Taster (Bit 1) als Eingabe
14
15
//****  Aufnahme der Anzahl Tastendrücke  ****
16
while (anz_abl > 0)
17
{
18
anz_abfragen=10000;
19
20
while (anz_abfragen>0)
21
{
22
  
23
  if ((PINB & 0b00000010) != (0))    // Wenn Taster gedrückt
24
  {
25
  
26
    if (gedr != 0) anz_tastendr++;  // Wenn er nicht schon gedrückt gewesen ist
27
    gedr = 1;            // jetzt war er gedrückt
28
    
29
  }
30
31
  anz_abfragen--;
32
}
33
34
//****  Ausgabe des Blinkens  ****
35
if (anz_tastendr > 10) anz_tastendr = 10;
36
37
38
while (anz_tastendr > 0)
39
{
40
  PORTD = 0b01000000;
41
  _delay_ms(20);
42
  PORTD = 0b00000000;
43
  _delay_ms(1000);
44
  anz_tastendr--;
45
}
46
47
}
48
49
50
return 0;
51
}

von Alex B. (Firma: Ucore Fotografie www.ucore.de) (alex22) Benutzerseite


Lesenswert?

Hast du Code-Optimierung bei den Compiler-Einstellungen aktiviert?

von Dodo M. (Gast)


Lesenswert?

1
double anz_abfragen=10000

Deswegen. Ersetz das durch'n Ganzzahltypen.

von Flo (Gast)


Lesenswert?

entfern erst mal den double Typ, den brauchst du nicht, mach daraus ein 
long int (besser uint32_t ).
Das kann auch einiges an Programmspeicher freischaufeln, da du dann die 
Berechnungsprozeduren für double nicht mehr benötigst.
Die sind umfangreicher als man denkt ;-)

Falls es dann immer noch zu viel Code ist, schau mal ob du in deinem 
Projektordner eine List-Datei hast und die posten.

von Christian H. (ct2034) Benutzerseite Flattr this


Lesenswert?

Alles klar.
Lag wohl an dem Double.. jetzt sind nur noch 10% belegt :)
Meinen Code muss ich aber trotzdem nochmal posten.

Ich hoffe mir kann jemand helfen. Ich weiß nicht was da nicht stimmt, 
aber mein Programm scheint nicht mehr aus der Ausgabeschleife 
herauszukommen.. oder die anz_tastendr ist dementsprechend groß - habt 
ihr ne Idee woran das liegt?
Ich hoffe durch die Kommentare versteht man es halbwegs..
1
// Dieses Programm soll Tastendrücke zählen und danach die entsprechnde Anzahl Blitze ausgeben
2
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3
4
#include <avr\io.h>
5
#define F_CPU 8000000UL     /* Quarz mit 8 Mhz */
6
#include <util/delay.h>
7
8
int main(void)
9
{
10
//**** Initialiserung  ****
11
12
int anz_tastendr = 0, gedr = 0;
13
long int anz_abfragen=10000;
14
15
DDRD = 0b01000000;  // LED 1 ist Ausgang
16
DDRB = 0b00000000;  // Taster (Bit 1) als Eingabe
17
18
//****  Aufnahme der Anzahl Tastendrücke  ****
19
start:
20
21
anz_abfragen=10000;
22
23
abfrage:
24
25
if (anz_abfragen>0)
26
{
27
  if ((PINB & 0b00000010) != (0))    // Wenn Taster gedrückt
28
  {
29
    if (gedr != 0) anz_tastendr++;  // Wenn er nicht schon gedrückt gewesen ist
30
    gedr = 1;            // jetzt war er gedrückt
31
    goto abfrage;          
32
  } else if (anz_tastendr != 0)    // Jetzt wird das warten abgefangen 
33
  {
34
    anz_abfragen--;          // Zum warten wird runtergezählt
35
    goto abfrage;
36
  } else goto abfrage;          // Jetzt wird noch nicht gewartet da noch nicht eingegeben wurde
37
}
38
39
40
//****  Ausgabe des Blinkens  ****
41
42
/*if (anz_tastendr > 10) anz_tastendr = 10;*/
43
44
while (anz_tastendr > 0)
45
{
46
  PORTD = 0b01000000;
47
  _delay_ms(40);
48
  PORTD = 0b00000000;
49
  _delay_ms(1000);
50
  anz_tastendr--;
51
}
52
53
anz_tastendr = 0;
54
gedr = 0;
55
goto start;
56
57
return 0;
58
}

von Markus E. (engelmarkus)


Lesenswert?

Also dieser Abfrage-Code sieht sehr komisch aus, vor allem dieses "goto" 
verwirrt. Kannst du das auch anders schreiben? Dann löst sich das 
vielleicht von alleine. Du gehst ja in allen Zweigen immer hoch zu 
"abfrage"?
Außerdem seh ich nicht, dass er irgendwo "warten" würde, so wie du das 
da hinschreibst...
1
uint16_t anz_abfragen = 10000;
2
3
while (anz_abfragen-- > 0) {
4
  if (PINB & 0b00000010) {
5
    anz_tastendr++;
6
  }
7
  
8
  delay_ms(500);
9
}

von Karl H. (kbuchegg)


Lesenswert?

Christian Tietgens schrieb:

> Ich hoffe mir kann jemand helfen.

Ja.
Schmeiss dein Programm weg und schreibs neu.
Aber diesmal legst du dir selbst eine Restriktion auf: keine goto!

von holger (Gast)


Lesenswert?

>Aber diesmal legst du dir selbst eine Restriktion auf: keine goto!

Dann nimmt er halt "come from" ;)

von Christian H. (ct2034) Benutzerseite Flattr this


Lesenswert?

> Dann nimmt er halt "come from" ;)

??
1
come from abfrage

;-)

von Karl H. (kbuchegg)


Lesenswert?

Ist ein Scherz unter Insidern :-)
Die Programmiersprache heißt 'INTERCAL' und ist eine nicht ernst 
gemeinte Programmiersprache.

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.