Forum: Compiler & IDEs OneBit Sound


von Thomas (Gast)


Lesenswert?

Hallo,

da habe ich ein neues Problem:

sound[] ist ein ziemlich grosses char Array. Es sollte den Speicher 
eines mega8 so ziemlich bis Anschlag füllen.

Hiermit möchte ich das Array bitweise auslesen, und dann einen Pin 
zappeln lassen:
1
for (i=0;i<=sizeof(sound)-1;i++){
2
    for (n=8;n>0;n--){
3
  if(sound[i] & (1 << (n-1))) PORTB |= (1<<PB0);
4
            else PORTB &= ~(1<<PB0);  
5
    }
6
    n=8;
7
}

Leider sieht das dann beim Kompilieren so aus:

Program:    3950 bytes (48.2% Full)
(.text + .data + .bootloader)

Data:       3286 bytes (320.9% Full)
(.data + .bss + .noinit)

und wir natürlich nix.

Über große Arrays habe ich hier schon ein paar Threads gelesen, aber 
leider nicht verstanden.
Ist mein Speicher nun wirklich voll, oder ist er nur nicht richtig 
augeteilt?
Kennt dafür jemand eine einfache Lösung, oder kann mir sagen wo ich mich 
schlau machen kann?

Danke und Gruß
Thomas

von Nico (Gast)


Lesenswert?


von Thomas (Gast)


Lesenswert?

Vielen Dank, ist ja alles ganz einfach, wenn man weiß wie's geht ;-)
1
static uint8_t sound[] PROGMEM = {0x55,0x55,0x55,.......};
und
1
if(pgm_read_byte(&sound[i]) & (1 << (n-1))) ...
und schon klappt das.

Program:    3782 bytes (46.2% Full)
(.text + .data + .bootloader)

Data:          0 bytes (0.0% Full)
(.data + .bss + .noinit)


Jetzt noch die richtige Frequenz einstellen und ich bin gespannt wie 
sich das anhört!

von Mathias O. (m-obi)


Lesenswert?

was für einen Sound spielt es denn ab? Kannst ja mal aufnehmen.

von Nico (Gast)


Lesenswert?

Ich würde das halt etwas anders machen, ungefähr so:
1
  unsigned int i = 0;
2
  for (i=0;i<sizeof(sound); i++) {
3
    unsigned char n=8;
4
    unsigned char note = pgm_read_byte(&sound[i]);
5
    do{
6
      if(note & _BV(7)) {
7
        PORTB |= (1<<PB0);
8
      } else {
9
        PORTB &= ~(1<<PB0);
10
      }
11
      note <<= 1;
12
    } while(--n);
13
  };

von Thomas (Gast)


Lesenswert?

Mathias, das Teil sollte jeden beliebigen Sound abspielen können.
Die Idee dazu habe ich hierher:

http://www.romanblack.com/picsound.htm

Das Programm kodiert eine .wav Datei nach 1-bit Format und berechnet 
noch den passenden Filter dazu.

Nico, den Wert zu verschieben statt die Maske war die Alternative ...
Mit meinen C Kenntinissen bin ich aber immer froh, wenn's erst mal 
überhaupt klappt.
Was ist eigentlich _BV? Eine eingebaute Variable?
Der Port sollte (passend zu meinem Soundfile) mit 44KHz schalten, ich 
wollte das irgendwie über eine Interruptroutine machen. Mal sehen wie 
das so wird.

von fbi (Gast)


Lesenswert?

siehe sfr_defs.h (zumindest bei meiner etwas älteren WinAVR-Version)
1
#define _BV(bit) (1 << (bit))
ist also ein Makro. Warum Nico das an einer Stelle verwendet, an anderen 
aber nicht, entzieht sich meiner Kenntnis. Konsequenterweise hätte er 
dann z.B. auch
1
PORTB |= _BV(PB0);
bzw.
1
PORTB &= ~_BV(PB0);
 schreiben sollen.

CU

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.