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!
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.