Seit ich in meinem Programm für den ATtiny25 eine etwas größere Tabelle
mit 1364 Eintragen habe geht nix mehr:
1
constunsignedcharMy_data[]={
2
0x7E,0x78,0x78,0x79,0x7B,0x7D,0x78,0x78,
3
0x7F,0x7D,0x7D,0x77,0x6D,0x6A,0x68,0x6E,
4
// usw.
5
0x79,0x79,0x7A,0x7A,0x7A,0x7B,0x7B,0x7B,
6
0x7C,0x7C,0x7D,0x7D,0x7D,0x7E,0x7E,0x7F,
7
0x7F,0x80,0x80,0x80
8
};
Das sollte eigentlich noch in den ATtiny25 reinpassen...
Ich bekomme (AVR Studio) die Meldungen:
Program: 1650 bytes (80.6% Full)
(.text + .data + .bootloader)
Data: 1365 bytes (1066.4% Full)
(.data + .bss + .noinit)
Build succeeded with 0 Warnings...
Die 1066% lassen mich stutzig werden, aber was tun?
So wie du deine Tabelle definierst wird diese vom Compiler ins RAM
gepackt. Der Startup-Code kopiert die Initialisierungsdaten dann aus dem
Flash ins RAM.
Das RAM ist bei dir nur 128 Byte gross. 1365/128=1066%.
Informationen dazu, wie du deine Tabelle im Flash lassen kannst, findest
du hier: http://www.nongnu.org/avr-libc/user-manual/pgmspace.html
Andreas
Habe den PWM auf einen Lautsprecher gegeben, ist nur ein rytmisches
Kratzen zu hören.
Habe die PWM (24,5kHz) auf einen Tiefpaß mit 10k & 10nF gegeben,
auf dem Oszilloskop sind nur kratzige Kurven zu sehen, nix mit Sinus.
Irgendwie greife ich falsch auf die Tabelle zu?!
Flo schrieb:
> Was macht PWM_Pulse genau? also Code zeigen?
Leider kann ich mich nicht verschließen, dieser höflich vorgebrachten
Bitte Folge zu leisten:
1
//***********************************************
2
voidPWM_Pulse(unsignedcharZeit_high)
3
{
4
unsignedcharZeit_low=~Zeit_high;
5
6
PINB=(1<<PIN4);// Portleitung toggeln => high
7
switch(Zeit_high&0b00000111)
8
{
9
case7:asmvolatile("NOP");
10
case6:asmvolatile("NOP");
11
case5:asmvolatile("NOP");
12
case4:asmvolatile("NOP");
13
case3:asmvolatile("NOP");
14
case2:asmvolatile("NOP");
15
case1:asmvolatile("NOP");
16
case0:asmvolatile("NOP");
17
}
18
Zeit_high>>=3;
19
while(Zeit_high>0)
20
{
21
asmvolatile("NOP");//1
22
asmvolatile("NOP");//2
23
asmvolatile("NOP");//3
24
asmvolatile("NOP");//4
25
Zeit_high--;
26
}
27
28
PINB=(1<<PIN4);// Portleitung toggeln => low
29
switch(Zeit_low&0b00000111)
30
{
31
case7:asmvolatile("NOP");
32
case6:asmvolatile("NOP");
33
case5:asmvolatile("NOP");
34
case4:asmvolatile("NOP");
35
case3:asmvolatile("NOP");
36
case2:asmvolatile("NOP");
37
case1:asmvolatile("NOP");
38
case0:asmvolatile("NOP");
39
}
40
Zeit_low>>=3;
41
while(Zeit_low>0)
42
{
43
asmvolatile("NOP");//1
44
asmvolatile("NOP");//2
45
asmvolatile("NOP");//3
46
asmvolatile("NOP");//4
47
Zeit_low--;
48
}
49
}
50
//***********************************************
Das geht mit Timer & Interrupt sicher besser & eleganter.
Falls also jemand meint, da was besseres zu haben, so sei ihm
freigestellt, den Code hier doch zum Gefallen aller zu posten!