OneBit Sound

Gast #1081716
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
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 17 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.