[Attiny45] Audio über ADC und PWM laufen lassen

#1970242
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
Angehängte Dateien:
#1970406
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);
#1970864
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.
(Firma: TravelRec.) Persönliche Seite #1971040
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.
Gast #1971142
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren