Wo die Daten speichern?

Gast #1629997
Seit ich in meinem Programm für den ATtiny25 eine etwas größere Tabelle 
mit 1364 Eintragen habe geht nix mehr:
1
const unsigned char My_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?
Gast #1630102
Danke, jetzt klappt es, fast ...  :-(
1
#include <avr/io.h>
2
#include <avr/pgmspace.h>
3

4
void PWM_Pulse(unsigned char);
5
const unsigned char My_sin[] PROGMEM ={
6
0x80,0x81,0x81,0x82,0x82,0x83,0x83,0x84,
7
0x85,0x85,0x86,0x86,0x87,0x87,0x88,0x89,
8
//usw.
9
0x75,0x75,0x76,0x76,0x77,0x78,0x78,0x79,
10
0x79,0x7A,0x7A,0x7B,0x7C,0x7C,0x7D,0x7D,
11
0x7E,0x7E,0x7F,0x80,
12
};
13
int main(void)
14
{
15
  DDRB  = (1 << DDB4);  // PB4=Pin3 als Output
16
  PORTB =  0;
17

18
  while(1)
19
  {
20
    unsigned short int n;
21
    unsigned char x;
22
    for(n=0;n<1364;n++) 
23
    {
24
      x = My_sin[n];
25
      PWM_Pulse(x);
26
    }
27
  }
28
}
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?!
Gast #1630135
holger schrieb:
> Da musst du pgm_read_byte() benutzen;)
> Deine Tabelle liegt ja jetzt im Flash.

Jetzt geht's JIPPIE
1
      for(n=0;n<1364;n++) 
2
      {
3
        x =  pgm_read_byte(&(My_sin[n]));
4
        PWM_Pulse(x);
5
      }
Besten Dank holger!   :-)
Gast #1635688
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
void PWM_Pulse(unsigned char Zeit_high)
3
{
4
  unsigned char Zeit_low = ~Zeit_high;
5

6
  PINB = (1 << PIN4);  // Portleitung toggeln => high
7
  switch(Zeit_high & 0b00000111)
8
  {
9
    case 7:  asm volatile("NOP");
10
    case 6:  asm volatile("NOP");
11
    case 5:  asm volatile("NOP");
12
    case 4:  asm volatile("NOP");
13
    case 3:  asm volatile("NOP");
14
    case 2:  asm volatile("NOP");
15
    case 1:  asm volatile("NOP");
16
    case 0:  asm volatile("NOP");
17
  }
18
  Zeit_high >>= 3;
19
  while(Zeit_high > 0)
20
  {
21
    asm volatile("NOP");//1
22
    asm volatile("NOP");//2
23
    asm volatile("NOP");//3
24
    asm volatile("NOP");//4
25
    Zeit_high--;
26
  }
27

28
  PINB = (1 << PIN4);  // Portleitung toggeln => low
29
  switch(Zeit_low & 0b00000111)
30
  {
31
    case 7:  asm volatile("NOP");
32
    case 6:  asm volatile("NOP");
33
    case 5:  asm volatile("NOP");
34
    case 4:  asm volatile("NOP");
35
    case 3:  asm volatile("NOP");
36
    case 2:  asm volatile("NOP");
37
    case 1:  asm volatile("NOP");
38
    case 0:  asm volatile("NOP");
39
  }
40
  Zeit_low >>= 3;
41
  while(Zeit_low > 0)
42
  {
43
    asm volatile("NOP");//1
44
    asm volatile("NOP");//2
45
    asm volatile("NOP");//3
46
    asm volatile("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!

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.