www.mikrocontroller.net

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


Autor: Gizmo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Timmo H. (masterfx)
Datum:

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

Autor: lm75 (Gast)
Datum:

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

Autor: Gizmo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 */

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht 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?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.