Programmgröße ATtiny2313

OP Persönliche Seite #1673315
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
}
Gast #1673335
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.
OP Persönliche Seite #1674544
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
}
#1674583
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
}

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