mikrocontroller.net

Forum: Compiler & IDEs OneBit Sound


Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
for (i=0;i<=sizeof(sound)-1;i++){
    for (n=8;n>0;n--){
  if(sound[i] & (1 << (n-1))) PORTB |= (1<<PB0);
            else PORTB &= ~(1<<PB0);  
    }
    n=8;
}

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

Autor: Nico (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank, ist ja alles ganz einfach, wenn man weiß wie's geht ;-)
static uint8_t sound[] PROGMEM = {0x55,0x55,0x55,.......};
und
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!

Autor: Mathias O. (m-obi)
Datum:

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

Autor: Nico (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde das halt etwas anders machen, ungefähr so:
  unsigned int i = 0;
  for (i=0;i<sizeof(sound); i++) {
    unsigned char n=8;
    unsigned char note = pgm_read_byte(&sound[i]);
    do{
      if(note & _BV(7)) {
        PORTB |= (1<<PB0);
      } else {
        PORTB &= ~(1<<PB0);
      }
      note <<= 1;
    } while(--n);
  };

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: fbi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
siehe sfr_defs.h (zumindest bei meiner etwas älteren WinAVR-Version)
#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
PORTB |= _BV(PB0);
bzw.
PORTB &= ~_BV(PB0);
 schreiben sollen.

CU

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.