OneBit Sound

Gast #1081716
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
Gast #1081759
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!
Gast #1081803
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
  };
Gast #1081973
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.
Gast #1083117
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren