Forum: Mikrocontroller und Digitale Elektronik LED-Blinker von AtMega8(328) auf AtTiny2313


von Mike U. (civicoid)


Lesenswert?

Hallo liebe Elektroniker ...

... so langsam weiß ich keinen Rat mehr.
Ich hänge zur Zeit bei folgendem Problem.
Ich habe ein Projekt begonnen, welches auf
einem Atmega328 um ehrlich zu sein auf
einem Arduino Uno entstanden ist.

Vom Prinzip her ist es eigentlich recht einfach.
Ich möchte lediglich verschiedene Blink-Modi auf allen
möglichen Ports ausgeben.

Auf dem Arduino als auch auf dem Atmega8 läuft das
Ganze ohne Probleme. Nur sobald ich das Ganze für den
Attiny2313 anpasse läuft es nicht so wie gewollt.

Vielleicht hat je jemand von euch noch eine gute Idee,
woran es liegen kann.

Ich habe versucht sowohl in Arduino, WinAVR als auch AVRStudio
das Projekt zu kompilieren aber das Problem bleibt gleich.
Im Atmega läuft es, im Attiny nicht.

_Der Code (vom AVR-Studio)_

1
#define F_CPU 8000000UL  // 8 MHz
2
#include <avr/io.h>
3
#include <util/delay.h>
4
5
char LED_00[]={0,1,0,0,0,0,1,0,1,0,0};
6
char LED_01[]={0,0,1,0,0,0,1,0,1,0,0};
7
char LED_02[]={0,0,0,1,0,0,1,0,1,0,0};
8
char LED_03[]={0,0,0,0,1,0,1,0,1,0,0};
9
char LED_04[]={1,0};
10
char LED_05[]={0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};  // Strobo
11
char LED_06[]={1,1,0,0,0,0,0,0,0,0,0,0};              // Rundumleuchte
12
char LED_07[]={0,0,0,1,1,0,0,0,0,0,0,0};
13
char LED_08[]={0,0,0,0,0,0,1,1,0,0,0,0};
14
char LED_09[]={0,0,0,0,0,0,0,0,0,1,1,0};
15
char LED_10[]={1,0,0,0,0,0,1};
16
char LED_11[]={0,0,0,0,0,1,1};
17
18
char LED_SIZE[]={
19
  sizeof(LED_00),
20
  sizeof(LED_01),
21
  sizeof(LED_02),
22
  sizeof(LED_03),
23
  sizeof(LED_04),
24
  sizeof(LED_05),
25
  sizeof(LED_06),
26
  sizeof(LED_07),
27
  sizeof(LED_08),
28
  sizeof(LED_09),
29
  sizeof(LED_10),
30
  sizeof(LED_11),
31
};
32
33
const int ledCount = 12;  // Anzahl der LEDs im Array
34
char LED_NOW_OUT[]     ={  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};            // aktueller Zählstand der einzelnen LEDs
35
char LED_DELAY[]       ={100,100,100,100,250, 10, 50, 50, 50, 50, 30, 50};               // aktueller DELAYs der einzelnen LEDs
36
char LED_DELAY_NOW[]   ={  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};               // aktueller DELAYs der einzelnen LEDs
37
38
int main(void)
39
{
40
  // Set Port ABD pins as all outputs
41
    //DDRA = 0xff;
42
  DDRB = 0xff;
43
  DDRD = 0xff;
44
  
45
  
46
  
47
 for(;;)  //Endlosschleife
48
  {
49
    for (int thisLed = 0; thisLed < ledCount-1; thisLed++) {
50
     if (LED_DELAY_NOW[thisLed] > LED_DELAY[thisLed])
51
     {
52
     LED_DELAY_NOW[thisLed]=0;
53
       LED_NOW_OUT[thisLed]++;
54
       if (LED_NOW_OUT[thisLed] >= LED_SIZE[thisLed]) // ARRAY überlauf
55
         {
56
            LED_NOW_OUT[thisLed]=0;
57
         }
58
      }
59
      else
60
      {
61
      LED_DELAY_NOW[thisLed]++;
62
      }
63
   }
64
65
// PORTS SETZEN
66
     if (LED_NOW_OUT[0] == 1) {
67
          PORTB |= _BV(PB0);     // PB0=High -> LED an
68
       }
69
       else {
70
          PORTB &= ~_BV(PB0);    // PB1=Low -> LED aus
71
       }
72
73
     if (LED_NOW_OUT[1] == 1) {
74
          PORTB |= _BV(PB1);     // PB0=High -> LED an
75
       }
76
       else {
77
          PORTB &= ~_BV(PB1);    // PB1=Low -> LED aus
78
       }
79
80
          if (LED_NOW_OUT[2] == 1) {
81
          PORTB |= _BV(PB2);     // PB0=High -> LED an
82
       }
83
       else {
84
          PORTB &= ~_BV(PB2);    // PB1=Low -> LED aus
85
       }
86
87
     if (LED_NOW_OUT[3] == 1) {
88
          PORTB |= _BV(PB3);     // PB0=High -> LED an
89
       }
90
       else {
91
          PORTB &= ~_BV(PB3);    // PB1=Low -> LED aus
92
       }
93
94
     if (LED_NOW_OUT[4] == 1) {
95
          PORTB |= _BV(PB4);     // PB0=High -> LED an
96
       }
97
       else {
98
          PORTB &= ~_BV(PB4);    // PB1=Low -> LED aus
99
       }
100
101
     if (LED_NOW_OUT[5] == 1) {
102
          PORTB |= _BV(PB5);     // PB0=High -> LED an
103
       }
104
       else {
105
          PORTB &= ~_BV(PB5);    // PB1=Low -> LED aus
106
       }
107
108
     if (LED_NOW_OUT[6] == 1) {
109
          PORTB |= _BV(PB6);     // PB0=High -> LED an
110
       }
111
       else {
112
          PORTB &= ~_BV(PB6);    // PB1=Low -> LED aus
113
       }
114
115
     if (LED_NOW_OUT[7] == 1) {
116
          PORTB |= _BV(PB7);     // PB0=High -> LED an
117
       }
118
       else {
119
          PORTB &= ~_BV(PB7);    // PB1=Low -> LED aus
120
       }
121
122
     if (LED_NOW_OUT[8] == 1) {
123
          PORTD |= _BV(PD0);     // PB0=High -> LED an
124
       }
125
       else {
126
          PORTD &= ~_BV(PD0);    // PB1=Low -> LED aus
127
       }
128
129
     if (LED_NOW_OUT[9] == 1) {
130
          PORTD |= _BV(PD1);     // PB0=High -> LED an
131
       }
132
       else {
133
          PORTD &= ~_BV(PD1);    // PB1=Low -> LED aus
134
       }
135
136
     if (LED_NOW_OUT[10] == 1) {
137
          PORTD |= _BV(PD2);     // PB0=High -> LED an
138
       }
139
       else {
140
          PORTD &= ~_BV(PD2);    // PB1=Low -> LED aus
141
       }
142
143
     if (LED_NOW_OUT[11] == 1) {
144
          PORTD |= _BV(PD3);     // PB0=High -> LED an
145
       }
146
       else {
147
          PORTD &= ~_BV(PD3);    // PB1=Low -> LED aus
148
       }
149
150
151
  _delay_ms(10); // Use this function from delay.h to delay for 1 seconds
152
  } 
153
  return 1;
154
}

: Bearbeitet durch User
von spess53 (Gast)


Lesenswert?

Hi

>Vielleicht hat je jemand von euch noch eine gute Idee,
>woran es liegen kann.

Die Ideen könnten kommen, wenn du dein Programm zeigst.

MfG Spess

von Mike U. (civicoid)


Lesenswert?

Da war jemand schneller als meine Tasten :-)

von holger (Gast)


Lesenswert?

>Vielleicht hat je jemand von euch noch eine gute Idee,
>woran es liegen kann.

Der Tiny hat zu wenig RAM.

von Mike U. (civicoid)


Lesenswert?

Das hab ich befürchtet. Bringt es etwas, den Code zu verkleinern?

von Oliver R. (orb)


Lesenswert?

Stichwort: Progmem

Das AVR-Studio zeigt den 'Füllstand' nach dem Compilieren an aber mehr 
als 100% weden nicht als Fehler gemeldet.

von Mike U. (civicoid)


Lesenswert?

Okay, da lieg ich jetzt bei *160%*
was wohl deutlich zuviel ist.
Also muss ich meinen Code umstricken?!?!

Habt ihr einen Ansatzpunkt für micht?

von Oliver R. (orb)


Lesenswert?

Da es Konstanten sind kannst Du die LED-Variablen mit 'progmem' statt 
ins Ram in den Flash legen.

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#progmem_und_pgm_read_xxx

von Mike U. (civicoid)


Lesenswert?

Ich hätte mich schon viel eher bei euch melden sollen.
Ihr seid echt spitze!!!

Ich habe jetzt alle "Variablen" die nicht verändert werden
mit PROGMEM in den Flash verschoben und siehe da

>>> *20%* <<<

*DANKE!!!*

Jetzt muss ich das ganze nur noch Flash und
dann "fingers crossed"

: Bearbeitet durch User
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.