Forum: Mikrocontroller und Digitale Elektronik [Attiny45] Audio über ADC und PWM laufen lassen


von Sam .. (sam1994)


Angehängte Dateien:

Lesenswert?

Hallo

Ich versuche gerade über einen Tiny45 Sound laufen zu lassen. Der Quelle 
wird mit dem ADC digitalisiert und per FastPWM wieder ausgegeben. 
Problem: Es funktioniert nicht. Die Hardware müsste stimmen die hab ich 
schonmal verwendet. Hier ist der Code:
1
#include <avr/io.h>
2
#define F_CPU 8000000
3
#include <util/delay.h>
4
5
int main()
6
{
7
    DDRB = 2;
8
    ADMUX = (1 << MUX0);
9
    ADCSRA = (1 << ADEN) | (1 << ADPS1) | (1 << ADPS2);
10
    TCCR0A = (1 << COM0B1) | (1 << WGM00) | (1 << WGM01);
11
    TCCR0B = (1 << CS00);
12
    while(1)
13
    {
14
        ADCSRA |= (1 << ADSC);
15
        while (ADCSRA & (1<<ADSC));
16
        OCR0B = ADCL;
17
    }
18
}

Der Audio Eingang wir übrigens mit einem 2W Verstärker angesteuert. Wenn 
man den Eingang direkt an den Lautsprecher hängt ist es relativ laut.

Link zum Datenblatt falls jemand es braucht: 
http://www.atmel.com/dyn/resources/prod_documents/doc2586.pdf

von Fragender (Gast)


Lesenswert?

Und wo is nu dein Problem???

von Nn N. (jaytharevo)


Lesenswert?

Schaut nicht so schlecht aus.

Aber, warum lagerst du denn die A-D Umwandlung nicht aus.
Du könntest den ADC im Freerunnig-Mode lauf lassen. Bei fertiger 
Wandlung einfach die eine Zeile
1
OCR0B = ADCL;
 in der ISR ausführen. In der Main() könntest du den Controller schlafen 
legen (IDLE Mode), oder andere Dinge veranstalten.

Kleinigkeiten:
Du:
1
ADMUX = (1 << MUX0);
2
TCCR0B = (1 << CS00);

"Richtig":
1
ADMUX |= (1 << MUX0);
2
TCCR0B |= (1 << CS00);

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Samuel K. schrieb:
> Der Audio Eingang wir übrigens mit einem 2W Verstärker angesteuert. Wenn
> man den Eingang direkt an den Lautsprecher hängt ist es relativ laut.

Da Dein Eingang keinen Spannungsteiler für Wechselspannung besitzt, 
dürftest Du den Tiny bereits gegrillt haben. 2mW hätten gereicht!

von Sam .. (sam1994)


Lesenswert?

Julian Schild schrieb:
> Schaut nicht so schlecht aus.
>
> Aber, warum lagerst du denn die A-D Umwandlung nicht aus.
> Du könntest den ADC im Freerunnig-Mode lauf lassen. Bei fertiger
> Wandlung einfach die eine ZeileOCR0B = ADCL; in der ISR ausführen. In
> der Main() könntest du den Controller schlafen
> legen (IDLE Mode), oder andere Dinge veranstalten.

Ich wollte auch erst freerunning machen. Aber beim Tiny45 gibts 
anscheinend nur so ein AutoTrigger-Mode. Und in den wollte ich mich 
nicht noch einlesen müssen.

> Kleinigkeiten:
> Du:ADMUX = (1 << MUX0);
> TCCR0B = (1 << CS00);
>
> "Richtig":ADMUX |= (1 << MUX0);
> TCCR0B |= (1 << CS00);

Als erste Anweisung ist es doch egal.

Fragender schrieb:
> Und wo is nu dein Problem???

Es kommt nichts aus dem Lautsprecher raus.

Knut Ballhause schrieb:
> Da Dein Eingang keinen Spannungsteiler für Wechselspannung besitzt,
> dürftest Du den Tiny bereits gegrillt haben. 2mW hätten gereicht!

Ich hab den Schaltplan oben angehängt. PS: Die gleiche Eingangsschaltung 
hab ich auch bei meinen Spektrumanalyer auf dem Steckbrett verwendet. 
Die hat funktioniert (ebenfalls mit 2W verstärker).

Mir ist noch eingefallen, das ich eigentlich ADCW >> 2 nehmen muss um 
den Wert abzufragen: Wenn das Signal größer ist als 256 kommt Murks 
heraus.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Samuel K. schrieb:
> Ich hab den Schaltplan oben angehängt.

Das habe ich gesehen. Du hast den ADC gleichspannungsseitig auf Vcc/2 
vorgespannt. Über den Kondensator ist der Verstärker angeschlossen. 
Liefert dieser nun eine Wechselspannung von mehr als 5Vss, geht es dem 
Tiny schlecht, weil er die volle Spannung sieht. Bei mehr als 6Vss 
brennen die Portdioden durch, bei mehr als 7Vss geht der gesamte 
Controller in Rauch auf.

Samuel K. schrieb:
> PS: Die gleiche Eingangsschaltung
> hab ich auch bei meinen Spektrumanalyer auf dem Steckbrett verwendet.
> Die hat funktioniert (ebenfalls mit 2W verstärker).

Zufall oder Glück.

von Sam .. (sam1994)


Lesenswert?

Knut Ballhause schrieb:
> Zufall oder Glück.

Oder das ich nur 2/3 aufdrehe.

von Julian (Gast)


Lesenswert?

Hey,


schau mal hier:

"If the result is left adjusted and no more than 8-bit precision is 
required, it is sufficient to read
ADCH. Otherwise, ADCL must be read first, then ADCH, to ensure that the 
content of the data
registers belongs to the same conversion. Once ADCL is read, ADC access 
to data registers is
blocked. This means that if ADCL has been read, and a conversion 
completes before ADCH is
read, neither register is updated and the result from the conversion is 
lost. When ADCH is read,
ADC access to the ADCH and ADCL Registers is re-enabled."

Samuel K. schrieb:
> Mir ist noch eingefallen, das ich eigentlich ADCW >> 2 nehmen muss um
> den Wert abzufragen: Wenn das Signal größer ist als 256 kommt Murks
> heraus.

Da du im Programm nur das Low Byte gelesen hast brauchst du das Ergebnis 
nicht um 2 Stellen verschieben.


Der ATTiny hat sehr wohl einen Freeruning Mode. Schau da noch mal ins 
Datenblatt.
Im Register ADCSRB, die Bits ADTS2 ADTS1 ADTS0 sind dafür 
verantwortlich.

MfG,
Julian

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.