Spitfire
15.02.2013, 20:13
Hallo zusammen !!!!
Ich möchte das Luftdruckmodul HP03 (http://www.pollin.de/shop/dt/MDg4OTgxOTk-/Bausaetze_Module/Module/Luftdruck_Modul_HP03S.html) von Hope RF (bei Pollin bestellt) auslesen. Es werden die Temperatur, der Luftdruck und weitere 11 Koeffizienten ausgelesen. Temperatur, Luftdruck, und 7 Koeffizienten sind 16 bit Wörter. Die restlichen Koeffizienten sind 8 bit Wörter. Die Koeffizienten sind, mit Ausnahme von den beiden C4 und C7 im Rahmen der Vorgaben lt. Datenblatt. Bei der Temperatur bekomme ich überhaupt nur `0` als ergebnis. Wenn ich nun mit den Werten die Temperatur, bzw. den Luftdruck berechne (Zur Probe in einem Excel-Formular) kommt alles andere als nur annäherd ein richtiges Ergebnis heraus. Ich vermute, dass die ergebnisse zwar im Rahmen sind, aber vielleich noch nicht die richtigen. Da dieser Baustein neben dem SCK, und dem SDA noch einen seperaten Tackt (MCLK) mit 32 kHz benötigt, habe ich diesen an den PB1 angeschlossen, und einen Tackt mit einen Timer generiert. Leider habe ich keine Möglichkeit diesen mit einem Messgerät zu kontrollieren. Vieleich kann einer von euch meine Rechnung und die Einstellungen des Timer kontrollieren, ob ich da wirklich einen Tackt von ca. 32 kHz erhalte.
An meinem Prozessor ist ein Quarzoszillator mit 4Mhz angeschlossen. Bei 32kHz soll der Ausgang (PB1) 32 000 mal High, und 32 000 mal Low geschalten werden. Als 64 000 mal den Zustand ändern. Der Quarzoszillator gibt 4 000 000 Tackte in der Sekunde vor. Benötigt werden aber nur 64 000. Deshalb habe ich die 4 000 000 mit 64 000 dividiert, und bin auf ein Ergebniss von 62 gekommen. Deshalb lasse ich den Timer alle 62 Tackte (0x3E) den Zustand des PB1 (High oder LOW) ändern. Liege ich mit dieser Rechnung richtig ?? Erhalte ich wirklich einen Tackt von ca 32 kHz.
Zur Kontrolle auch noch der Programmteil für den Timer:
ldi temp1,HIGH(RAMEND) ;Stackpointer Initialisieren
out SPH,temp1
ldi temp1, LOW(RAMEND)
out SPL,temp1
main:
ldi temp1,(1<<COM1A0) |(1<<FOC1A) ;csoo setzen:Teiler 1;
out TCCR1A,temp1
ldi temp1, 1<<WGM12 | 1<<CS10 ;CS10--> Vorteiler 1 für den Timer 1
out TCCR1B,temp1
ldi temp1, 0x6f
out icr1h,temp1
ldi temp1,0xff
out icr1l, temp1
ldi temp1, 0x00
out ocr1ah,temp1
ldi temp1,0x3E ;Den Timer nur bis 3E (62) Zählen lassen
out ocr1al, temp1
Für den Teil mit icr... und ocr.. habe ich leider keine Erklätung. Ohne diese Einstellungen wird der Ausgang nicht geschalten. Das habe ich zwar nach einigem Probieren gefunden, kann aber leider nicht sagen Warum.
Danke vorerst für die Hilfe.
Spitfire
Ich möchte das Luftdruckmodul HP03 (http://www.pollin.de/shop/dt/MDg4OTgxOTk-/Bausaetze_Module/Module/Luftdruck_Modul_HP03S.html) von Hope RF (bei Pollin bestellt) auslesen. Es werden die Temperatur, der Luftdruck und weitere 11 Koeffizienten ausgelesen. Temperatur, Luftdruck, und 7 Koeffizienten sind 16 bit Wörter. Die restlichen Koeffizienten sind 8 bit Wörter. Die Koeffizienten sind, mit Ausnahme von den beiden C4 und C7 im Rahmen der Vorgaben lt. Datenblatt. Bei der Temperatur bekomme ich überhaupt nur `0` als ergebnis. Wenn ich nun mit den Werten die Temperatur, bzw. den Luftdruck berechne (Zur Probe in einem Excel-Formular) kommt alles andere als nur annäherd ein richtiges Ergebnis heraus. Ich vermute, dass die ergebnisse zwar im Rahmen sind, aber vielleich noch nicht die richtigen. Da dieser Baustein neben dem SCK, und dem SDA noch einen seperaten Tackt (MCLK) mit 32 kHz benötigt, habe ich diesen an den PB1 angeschlossen, und einen Tackt mit einen Timer generiert. Leider habe ich keine Möglichkeit diesen mit einem Messgerät zu kontrollieren. Vieleich kann einer von euch meine Rechnung und die Einstellungen des Timer kontrollieren, ob ich da wirklich einen Tackt von ca. 32 kHz erhalte.
An meinem Prozessor ist ein Quarzoszillator mit 4Mhz angeschlossen. Bei 32kHz soll der Ausgang (PB1) 32 000 mal High, und 32 000 mal Low geschalten werden. Als 64 000 mal den Zustand ändern. Der Quarzoszillator gibt 4 000 000 Tackte in der Sekunde vor. Benötigt werden aber nur 64 000. Deshalb habe ich die 4 000 000 mit 64 000 dividiert, und bin auf ein Ergebniss von 62 gekommen. Deshalb lasse ich den Timer alle 62 Tackte (0x3E) den Zustand des PB1 (High oder LOW) ändern. Liege ich mit dieser Rechnung richtig ?? Erhalte ich wirklich einen Tackt von ca 32 kHz.
Zur Kontrolle auch noch der Programmteil für den Timer:
ldi temp1,HIGH(RAMEND) ;Stackpointer Initialisieren
out SPH,temp1
ldi temp1, LOW(RAMEND)
out SPL,temp1
main:
ldi temp1,(1<<COM1A0) |(1<<FOC1A) ;csoo setzen:Teiler 1;
out TCCR1A,temp1
ldi temp1, 1<<WGM12 | 1<<CS10 ;CS10--> Vorteiler 1 für den Timer 1
out TCCR1B,temp1
ldi temp1, 0x6f
out icr1h,temp1
ldi temp1,0xff
out icr1l, temp1
ldi temp1, 0x00
out ocr1ah,temp1
ldi temp1,0x3E ;Den Timer nur bis 3E (62) Zählen lassen
out ocr1al, temp1
Für den Teil mit icr... und ocr.. habe ich leider keine Erklätung. Ohne diese Einstellungen wird der Ausgang nicht geschalten. Das habe ich zwar nach einigem Probieren gefunden, kann aber leider nicht sagen Warum.
Danke vorerst für die Hilfe.
Spitfire