ATtiny841, onboard Temp auslesen

OP #4632622
Lesenswert?

Hallo,

ich weis die ist ungenau, ist auch nur eine Übung.

Welche 1,1V Reference aktiviert man?
Im ADMUXB Register oder die im ADMUXA Register?
Datenblatt Seite 144, 146.

Mit dem Code
1
read_onboard_Temp();    // liest µC Temperatur aus
2
message.wert[1] = ADCL;    // 
3
message.wert[2] = ADCH;    // 
4
message.wert[3] = ADC;    //

bekomme ich momentan ausgelesen für
ADCL = 28
ADCH = 1
ADC = 28

Wenn die ADC = 28 der Rest vom Byte Überlauf ist, dann stimmt das 
irgendwie nicht. Das müssten ca. 45 sein, wenn 25°C = 300 LSB sind.
1
void set_onboard_Temp_Measurement()
2
{
3
  ADCSRA = (1<<ADEN) |(1<<ADPS2) | (1<<ADPS1);  // ADC enable und Prescaler 64 (125kHz)
4
  ADMUXA = (1<<MUX3) | (1<<MUX2);    // enable Temp.Sensor
5
  ADMUXB = (1<<REFS0);        // 1,1V Reference
6
}
7

8

9
void read_onboard_Temp()
10
{
11
  ADCSRA |= (1<<ADSC);    // Start A/D Wandlung
12
  while(ADCSRA & (1<<ADSC));  // warten auf fertige Wandlung
13
}
Gast #4632638
Lesenswert?

Aus ADCL = 28 und ADCH = 1 (BYTE)

würde ich ADC (WORD)
ADC = ADCL + 256 * ADCH = 28 + 256 * 1 = 284
zusammensetzen. Das ist etwas unter 300 (< 25 °C)

Keine Ahnung, wie deine Prog-Bibliothek den Wert ADC
zusammenwurstelt...
Gast #4632659
Lesenswert?

Zur Auswahl des Temperatursensors muss ADMUX richtig gesetzt werden:
MUX[5:0] bits in ADMUX register to “111111”

Zur Auswahl der Referenzspannungsquelle 1,1 V intern gehören
REFS0, REFS1 und REFS2:
REFS0 = 0
REFS1 = 1
REFS2 = 0
ADMUX  Bits 7:6 – REFS[1:0]: Voltage Reference Selection Bits
ADCSRB Bit 4 – REFS2: Reference Selection Bit

Könnte ja sein, dass es hilft, wenn alle Einstellungen passend
gewählt sind ;-)
Gast #4632668
Lesenswert?

Hallo Veit,

deinen Code habe ich jetzt nicht geprüft.
Noch ein Hinweis in anderen Datenblättern zur internen 
Referenzspannungsquelle findet man noch einen Hinweis, dass nach dem 
Einschalten der Referenzspannungsquelle eine Wartezeit im 100 µs Bereich 
notwendig ist !

Evtl. ist das hier auch noch der Fall.
OP #4632689
Lesenswert?

Hallo,

okay, ADC ist ein 10Bit Wert. Kann mit Byte nicht stimmen. Mein 
Lesefehler. Den kann ich so nicht übertragen. Muß demzufolge die 
Einzelbytes nehmen, übertragen und dann zusammensetzen. Demnach müßten 
meine Settings stimmen, wenn du auf 284 kommst. Hat ja 10% Toleranz das 
Ding.

Aber wie kommst du auf deine Registersettings?
Hast du ins ATtiny841 Datenblatt geschaut?
http://www.atmel.com/Images/Atmel-8495-8-bit-AVR-Microcontrollers-ATtiny441-ATtiny841_Datasheet.pdf

Temperatursensor ADMUXA: MUX Bit 3 und 2  setzen
1,1V Reference ADMUXB: REF0 Bit   setzen

ist meine Interpretation

Was ist dann mit der 1,1V Reference im ADMUXA Register? Was ist das?
Table 16-3
OP #4632723
Lesenswert?

Hallo,

wenn die 284 LSB stimmen beim auslesen, dann liegt das Teil ja wirklich 
hoffnungslos daneben. Im Grunde muß ich nur 275 vom LSB abziehen und 
habe die Temp. in Grad Celius. Dann lande ich bei 9°C statt 25°C.
Das wären mehr als +/- 10°C.

Primär gehts mir darum ob ich die richtigen Bits in den richtigen 
Registern setze.
Gast #4632906
Lesenswert?

Vielleicht mal den 'ADC Noise Reduction Mode' versuchen, der hat bei 
meinem ATtiny84A (ich weiß, ist ein anderer Chip) eine deutliche 
Verbesserung gebracht (wobei allerdings 'gut' noch immer etwas anderes 
ist).
OP #4633218
Lesenswert?

Hallo,

gut, ohne Nachkalibrierung gehts also nicht. Auch gut, ist kein Problem.
Hauptsache meine Settings stimmen erstmal.
Kann mir noch jemand sagen was die 1,1V Reference im ADMUXA Register zu 
bedeuten hat? Normalerweise nimmt man doch die Auswahl im ADMUXB 
Register.
Seite 144, 146.

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