Hi ich möchte jede Sekunde einen LM75 Temperatursensor auslesen ich habe mir überlegt dazu den 16 Bit Timers des ATMEGA32 zu verwenden. Da ich noch Neuling bin, habe ich noch keine Ahnung von Timern. Habe mich hier im Forum schon umgesehen u. auch das avr gcc Tutorial angeschaut. Bin aber aus nichts so wirklich schlau geworden. hat jemand schon mal einen LM75 ausgelesen u. hat damit Erfahrung. o. kann mir jemand erklären, wie man mit dem 16 Bit Timer ein Delay von 1er Sekunde hin bekommt. Ich bekomme den Lm75 schon ausgelesen u. lasse mir die Temperatur werte im Hyper Terminal anzeigen. Das Problem ist bloß, dass der sensor immer 0 zurück liefert auch wenn ich Kälte Spray auf den Sensor sprühe. Ich wäre echt froh wenn mir jemand helfen würde. was mich am meisten ärgert ist das der LM75 immer 0 zurück gibt, meiner Vermutung nach müsste der Sensor irgend einen Müll ausspucken, aber nicht nur 0. Ich bedanke mich schon mal bei euch. Gruß Gizmo
Timer ist einfach (steht hier auch in den Tutorials: [[AVR-Tutorial: Timer]]).
Wie wäre es mit einem Stück Programm, damit man erahnen kann, wo dein Problem beim Auslesen des LM75 ist...
hier ist die auslese funktion des LM75 die Adresse des Bausteins ist 0x90 , da A0, A1 , A2 auf Masse gelegt sind. unsigned int i2cLm75(void) { char LM75_Temperatur1 = 0; char LM75_Temperatur2 = 0; unsigned int return_value = 0; //delay darf nur jede sec. aufgerufen werden da der sensor zeit brauch i2c_start_wait(LM75+I2C_READ); //Slave bereit zum lesen? // LM75_Temperatur1 = i2c_readAck(); LM75_Temperatur2 = i2c_readNak(); //letztes Byte lesen, darum kein ACK i2c_stop(); return_value = LM75_Temperatur1<<8; //LM92CIM_Temperatur in High Byte schieben return_value |= LM75_Temperatur2; return return_value/128; // Temperatur in °C Die folgende Funktion gibt des Temperatur Wert über die Serielle Schnittstelle aus. void getTemperatur(void) { unsigned int lm75_temperatur; char temperatur_buffer[100]; lm75_temperatur = i2cLm75(); sprintf(temperatur_buffer,"Temperatur:%i\n\r",lm75_temperatur); //sprintf(temperatur_buffer,"%i\n\r",lm75_temperatur); usartPuts(temperatur_buffer); } Hier ist das Hauptprogramm. #include <compat/twi.h> #include <util/delay.h> #include <stdio.h> #include <stdint.h> #include <string.h> #include <stdlib.h> #include <avr/interrupt.h> #include "USART.h" #include "USART.c" #include "i2cdevices.h" #include "i2cdevices.c" #include "i2cmaster.h" #include "twimaster.c" #include "BiT.h" #include "BiT.c" #include "Timer.h" #include "Timer.c" #include "PORT80.h" #include "PORT80.c" #include "Temperatur.h" #include "Temperatur.c" #if defined(_DOXYGEN_) #define reti() #else /* !DOXYGEN */ #define reti() _asm__ __volatile_ ("reti" ::) #endif /* DOXYGEN */ int main(void) { /*************************************************** Variabeln *********************************************************/ // unsigned char port_80_temp = 0; //In diese Variable werden die Werte aus dem Array geschrieben // unsigned char led_merker_sc = ( 1<<LED_RT_BLINK); //4 // Bit 0 rt, Bit 1 gn, Bit 2 rt-blink, , Bit 3 gn-blink // unsigned char led_merker_sp = 0x04; //---------------------------------------------------------------------- ------------------------------------------------- //************************************************** Initialisierungs Routinen ****************************************** port80Init(); initTimer1(); initInterrupt2(); // PORT80 sei(); i2c_init(); // I2C Bus initialisieren usartInit(BAUD); time_counter_[0] = 1; // Timer benutzt LM92 time_counter_[1] = 2; // Timer benutzt für LED blinken time_counter_[2] = 301; // Timer für PORT80 Time Out time_counter_[3] = 10; // Timer für SC Reset beim Start für Delay time_counter_[5] = 8; time_counter_[6] = 21; // Clr für NMEA EVT DDRC |= 0xF0; //BiT LED Green //setBitLedMezzaUc(3); while(1) { getTemperatur(); } //Endlosschleife } //Programmende /* void pb_reset(void) { if(bit_is_clear(PIND, PIND3) ) { PORTC &= ~(1<<PORTC6) ; PORTD |= (1<<PORTD1) ; PORTD &= ~(1<<PORTD1) ; } else{ PORTC |= (1<<PORTC6) ; PORTD |= (1<<PORTD1); } }//ende pb_reset */
1. Benutze bitte die c-Umgebung für Code oder lade die C-Datei selbst hoch. 2. Was willst du nun wissen? Geht deine Auslesefunktion und du willst das nur noch zyklisch abfragen?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.