Furtion
04.01.2008, 16: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
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