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

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.