Tonerzeugung mit DAC - PIC16F15376 - C Problem

OP #5087084
Lesenswert?
• ▲
▼
Ich versteh gerade die Welt nicht mehr, ich versuche einen "Ton" mit 
einem DAC zu erzeugen, das funktioniert auch, sobald ich allerdings die 
Schleifen in eine Funktion auslagere, hör ich nichts mehr, also z.B. 
sollte
1
playFreq(8,4000);
 das selbe tun wie
1
        for(long j = 0; j < 4000; j++){
2
            DAC1CON1 = DAC1CON1++;
3
            __delay_us(8);
4
        }

allerdings passiert gar nix (d.h. eine Pause zwischen den 3 anderen 
"Tönen", außerdem ist diese Pause viel länger als der nachfolgende Ton, 
obwohl er die selbe Anzahl an Schleifendurchläufe hat und auch die 
Delaydauer gleich ist). Was übersehe ich?
1
#include <xc.h>
2
#define _XTAL_FREQ 4000000
3

4
#pragma config WDTE = OFF // WDT operating mode (WDT Disabled, SWDTEN is ignored)
5

6
void initDAC(){
7
    DAC1CON0bits.DAC1EN = 1;    //Enable DAC
8
    DAC1CON0bits.DAC1OE1 = 1;   //Tie voltage level to DAC1OUT1 pin
9
    
10
    DAC1CON0 &=~(1<<2);
11
    DAC1CON0 &=~(1<<3);  //Use VDD
12
}
13

14
void playFreq(short delayTime, int howLong){
15
    for(int n = 0; n < howLong; n++){
16
        DAC1CON1 = DAC1CON1++;
17
        __delay_us(delayTime);
18
    }
19
}
20

21
void main(void) {
22
    initDAC();
23
    
24
    while(1){
25
        playFreq(8,4000);
26
        
27
        for(long j = 0; j < 4000; j++){
28
            DAC1CON1 = DAC1CON1++;
29
            __delay_us(8);
30
        }
31
        
32
        for(long k = 0; k < 4000; k++){
33
            DAC1CON1 = DAC1CON1++;
34
            __delay_us(16);
35
        }
36
        
37
        for(long i = 0; i < 12000; i++){
38
            DAC1CON1 = DAC1CON1++;
39
            __delay_us(32);
40
        }
41
    }
42
}
#5087175
Lesenswert?
• ▲
▼
Toralf W. schrieb:
> ... also eine minimale Konstante reinsetzen und in einer Schleife
> so oft
> aufrufen, bis deine gewünschte Verzögerungszeit erreicht ist.

Bei einem us Makro und einem Instruction Cycle von 1us?
Das geht schief ;-)

@Max
Warum wird der Ton eigentlich nicht mit einer PWM erzeugt?

btw:
    DAC1CON0 &=~(1<<2);
    DAC1CON0 &=~(1<<3);  //Use VDD

>>> DAC1CON0bits.PSS = 0b00;  //Use VDD
OP #5087203
Lesenswert?
• ▲
▼
Volker S. schrieb:
> __delay_us ist keine Funktion sondern ein Makro.
> Es ist nicht möglich eine Variable zu übergeben...

Ah, danke für den Hinweis, allerdings funktioniert es so auch nicht :(
1
void playFreq(short delayTime, int howLong){
2
    for(int n = 0; n < howLong; n++){
3
        DAC1CON1 = DAC1CON1++;
4
        for(int d = 0; d < delayTime; d++){
5
            asm("nop");
6
        }
7
    }
8
}
9

10
void main(void) {
11
    initDAC();
12
    
13
    while(1){
14
        playFreq(8,4000);
15
        playFreq(16,4000);
16
        playFreq(32,4000);
17
    }
18
}

Volker S. schrieb:
> Warum wird der Ton eigentlich nicht mit einer PWM erzeugt?

Hab ich mir nicht überlegt, aber wäre wahrscheinlich sinnvoller, da man 
dort die Periode einstellen kann, oder?

Ich hatte vor, ein analoges Tonsignal einzulesen und dann über den DAC 
wieder auszugeben, ich bin mir nicht sicher, ob das realisierbar ist? 
Ich steige aber nicht durch, warum der oben gezeigte Code nicht 
funktioniert :(
#5087248
Lesenswert?
• ▲
▼
Max M. schrieb:
> Wie kann es denn 19 Zyklen dauern, um ein Register hochzuzählen...

Wenn du ein int (16bit) nimmst muss erst mal ein Register hochgezählt 
werden und überprüft werden, ob dieses übergelaufen ist.
Dann muss gegebenenfalls noch ein zweites Register hochgezählt werden...

<edit>
Schau doch mal da: 
http://www.hs-ulm.de/users/vschilli/Mikrocontroller/uCQ/_downloads/uCquick-X.pdf
 4.1 Blink Variante 1 – Zählen

Antwort schreiben

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.

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.