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 }
03.11.2013 18:41 :
Bearbeitet durch User
von
spess53 (Gast)
03.11.2013 18:43
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
Da war jemand schneller als meine Tasten :-)
von
holger (Gast)
03.11.2013 18:49
>Vielleicht hat je jemand von euch noch eine gute Idee,
>woran es liegen kann.
Der Tiny hat zu wenig RAM.
Das hab ich befürchtet. Bringt es etwas, den Code zu verkleinern?
Stichwort: Progmem
Das AVR -Studio zeigt den 'Füllstand' nach dem Compilieren an aber mehr
als 100% weden nicht als Fehler gemeldet.
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?
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
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"
03.11.2013 19:29 :
Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.