Hi und hallo zusammen,
Ich bastle gerade mit einem AVR 644P rum. Ich lese per SPI einen
einfachen Temperatursensor TMP122 aus.
Datenblatt : http://www.ti.com/lit/ds/symlink/tmp122.pdf
Das funktioniert auch prima. Das Ding liefert mir laufend Daten.
Jetzt das Problem. Ich resete den µC, die Daten werden per SPI
ausgelesen. WEnn ich mir dann den Inhalt der Variablen ansehe, stimmt
auch alles. Das ist der einmalige Datenabruf.
Wenn ich das Ganze in eine Schleife packe wie:
1 | while(1)
|
2 | {
|
3 | _delay_ms(2000);
|
4 | PORTD &= ~(1<<PD7);
|
5 | _delay_us(10);
|
6 | while(!(UCSR1A & (1<<UDRE1)));
|
7 | UDR1= 0x00;
|
8 | while(!(UCSR1A & (1<<RXC1)));
|
9 | daten= (UDR1<<8);
|
10 | while(!(UCSR1A & (1<<UDRE1)));
|
11 | UDR1= 0x00;
|
12 | while(!(UCSR1A & (1<<RXC1)));
|
13 | daten+= UDR1;
|
14 | PORTD |= (1<<PD7);
|
15 | }
|
...stimmt dann der erste Wert und alle weiteren stimmen nicht mehr. Der
erste ist z.B. 19 Grad. Alle weitern Werte sind dann 9, die Daten Vom
Sensor entsprechend umgerechnet.
Nach einem Reset des Controllers, wird als erster Wert wieder 19
ausgelesen und alle weiteren Werte sind dann wieder 9.
Als Beispiel:
ALs erstes wird 0x09DF ausgelesen, dezimal sind das 2527.
Die nächsten Werte, die ausgelesen werden sind:
0x04F7 dezimal sind das 1271.
Die 19 stimmen. Also es sind ca. 19 Grad, somit ist der Wert mal
richtig. Nur warum liefert er beim zweiten Lesen, bzw. Ab dem zweiten
Lesen falsche Werte?
Ich habe auch schon SPI vor jedem Abruf neu initialisieren lassen, aber
das brachte auch keine Änderung.
Hat jemand eine Idee, wo da der Wurm drin sein könnte?
Stefan