Forum: Compiler & IDEs 16 bit timer als delay nutzen um lm75 auszulesen


von Gizmo (Gast)


Lesenswert?

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

von Timmo H. (masterfx)


Lesenswert?

Timer ist einfach (steht hier auch in den Tutorials: [[AVR-Tutorial: 
Timer]]).

von lm75 (Gast)


Lesenswert?

Wie wäre es mit einem Stück Programm, damit man erahnen kann, wo dein 
Problem beim Auslesen des LM75 ist...

von Gizmo (Gast)


Lesenswert?

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 */

von Timmo H. (masterfx)


Lesenswert?

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
Noch kein Account? Hier anmelden.