PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 8 bit D/A Wandler von C in Bacom



Furtion
04.01.2008, 15:52
Hi,

nachdem ich heute verzwiefelt versucht habe C zu lehren, um die
Software diese D/A Wandler zu verstehen:
http://www.karlsaam.de/karlsaam_cms/node/37
habe ich es nach langen frustrierenden Versuchen aufgegeben und hoffe nun
auf Hilfe.

Das Programm funktioniert wunderbar, bis auf die TAtsache, dass ich es
net verstehe, und da ich es erstmal in Bascom umsetzen möchte wäre
ein Verständnis nicht schlecht.

Das Programm erzeugt mit 8 verschiedenen Wiederständen ein
Lautsprächer SIgnal. Es kann 8 bit Mono11khzAUdiodatein mit der
beiligenen Software abspielen.

Also hier der C Coder (wav.c)




#include "wav.h"

int play=0;
unsigned char b;
unsigned long SongPos=0;

void init_wav(void){
DDRD=0xff;
timer_enable_int(_BV(TOIE1));
TCCR1B |= (1<<CS10 | 0<<CS11 | 1<<CS12);
TCNT1 = 65535 - (SYSCLK / 1024)/wav_sampling;
sei();
}

SIGNAL (SIG_OVERFLOW1){
TCNT1 = 65535 - (SYSCLK / 1024)/wav_sampling;
if (play ==1){
b=pgm_read_byte_near(WAVE+SongPos);
SongPos++;
PORTD=b;
if (SongPos > wav_size) { play=2; SongPos=0; PORTD=0; }
}
}


PROGMEM unsigned char WAVE[] = {
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
.....
/* Zur übersicht weggelassen */
...
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0x00 };



Dazu kommt noch der wav.h



#ifndef _WAV_H
#define _WAV_H

#include <avr/interrupt.h>
#include <compat/deprecated.h>
#define SYSCLK 8000000
#define wav_size 4939
#define wav_sampling 12000

#include <avr/pgmspace.h>
extern PROGMEM unsigned char WAVE[];
extern int play;
extern void init_wav(void);

#endif //_WAV_H


So die anderen Files sind meiner Meinung nach eher unwichtig können
aber auf der Seite von Karl Saam runtergeladen werden.
An dem Programm verstehe ich folgendes net:

- einmal das wav.h ist mir ein Rätzel, aber ich glaube dieses define
setzt eine Variable.

Das ist die Enable von Timer0


timer_enable_int(_BV(TOIE1));


Das verstehe ich wieder net:


TCCR1B |= (1<<CS10 | 0<<CS11 | 1<<CS12);


Dann



TCNT1 = 65535 - (SYSCLK / 1024)/wav_sampling;


dass müste der Timerwert sein oder?

Was bedeutet der Befehl "sei()" ?

Und das verstehe ich auch net:


if (play ==1){
b=pgm_read_byte_near(WAVE+SongPos);
SongPos++;
PORTD=b;
if (SongPos > wav_size) { play=2; SongPos=0; PORTD=0; }

Das ist meiner Meinung nach das was den Port dazu bringt ein TOn
aus dem Lautsprecher zu bringen. Aber da ist keine Loop oder so was
in der Richtung.

In der liste sind dann die PWM Signale der 8 Ports, glaube ich, was net
heißt das es stimmt.

Zusätzlich hätte ich noch die Frage:
PORTD=0xHEX ZAHL.
Kann man die Hex Zahl auch durch einen Binärcode ändern so wie:
PORTD=0x00101000

roboterheld
04.01.2008, 16:08
es gibt es was :

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial

brauchst ca 1 jahr dafür um es zu kapieren.

es gibt auch noch schöne c-bücher für die grundregeln von c.

roboterheld
04.01.2008, 16:09
....Kann man die Hex Zahl auch durch einen Binärcode ändern so wie:
PORTD=0x00101000.....

in der neuesten winavr-c-version ab mai 2007

Furtion
04.01.2008, 16:15
Hi,

ich habe mir den Artikel schon durchgelesen, bis zu dem Punkt wo es um
die I/0s geht, danach habe ich versucht eine LED an und auszuschalten,
und danach einen andere und danach noch eine.... Was aber nicht
geklapt hat. Auch die Hilfe von Ulrich Radig hat mir net geholfen und
das aus der RN Wissen auch net.

Andree-HB
04.01.2008, 16:19
...wie/warum kann eigentlich ein gesperrter User Beiträge schreiben ???

Furtion
04.01.2008, 16:24
Hi,

das habe ich mich auch schon gefragt.

Vitis
04.01.2008, 16:31
sei = set enable interrupts ... bedeutet, interrupts global eingeschaltet

Furtion
04.01.2008, 16:37
Hi,

ok "sei()" ist geklärt. Aber was mir noch einfällt wo wird er Prescal gesetzt?