PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] LM75 Probleme



rauf81
29.01.2012, 15:31
21353Hallo Freunde ich bräuchte Eure Hilfe

Habe vor mir einen LM 75 und ein Atmega16.

Verbunden über I2C mit 4,7 Pullups an den leitungen.

Ich Versuche wie verzweifelt die Temperatur auszulesen und auf einem LCD wieder zu geben,
doch will dies mir nicht gelingen.

Ich poste mal meinen Code zur Kontrolle von Profis

/*
* LM75.c
*
* Created: 28.01.2012 17:11:50
* Author: Frau
*/

#include <avr/io.h>
#include <stdio.h>
#include <stdint.h>
#include <util/delay.h>
#include <avr/interrupt.h>



#include "lcd.c"
#include "lcd.h"
#include "i2cmaster.h"
#include "twimaster.c"

#define lm75 0x90

uint8_t msb_temp;
uint8_t lsb_temp;
uint16_t temp_wrd;

uint8_t ret;

char Buffer[20];



int main(void)
{

lcd_init(LCD_DISP_ON);
lcd_clrscr();

i2c_init();


void temperfassung(void)
{
ret = i2c_start(lm75 + I2C_WRITE);

if (ret == 0)
{
msb_temp = i2c_readAck();
lsb_temp = i2c_readNak();
}
i2c_stop();
}

while(1)
{

temperfassung();

temp_wrd = (msb_temp << 8 | lsb_temp);
itoa(ret ,Buffer, 10 );

lcd_clrscr();
lcd_gotoxy(0,0);
lcd_puts( "Temperatur:");
lcd_gotoxy(0,1);
lcd_puts(Buffer);

_delay_ms(500);

}
}


Ich habe den I2C-Bus überwacht und hänge noch ein Pic mit daran. Vielleicht gibt das aufschluss über den Bock den ich drin habe.

Grüße Flo

sternst
29.01.2012, 16:26
Es könnte helfen, temp_wrd auszugeben statt ret.


PS: Und man definiert keine Funktionen innerhalb von anderen Funktionen in C.

rauf81
29.01.2012, 16:39
PS: Und man definiert keine Funktionen innerhalb von anderen Funktionen in C.


Abselut richtig :-) ändere ich sofort bin schon fast blind vor lauter Computer.
Und ein abseluter Noob was "C" angeht. Ich Quäle mich so :-)

ret habe ich nur testweise ausgegeben um zu schauen ob was es ausgibt.



#include <avr/io.h>
#include <stdio.h>
#include <stdint.h>
#include <util/delay.h>
#include <avr/interrupt.h>



#include "lcd.c"
#include "lcd.h"
#include "i2cmaster.h"
#include "twimaster.c"

#define lm75 0x90
uint8_t msb_temp;
uint8_t lsb_temp;
uint16_t temp_wrd;

uint8_t ret;

char Buffer[20];


void temperfassung(void)
{
ret = i2c_start(lm75+I2C_READ);

if (ret == 0)
{
msb_temp = i2c_readAck();
lsb_temp = i2c_readNak();

lcd_clrscr();
lcd_gotoxy(5,1);
lcd_puts( "GEHT");
}
else
{
lcd_clrscr();
lcd_gotoxy(5,1);
lcd_puts( "FEHLER");
}
i2c_stop();
}



int main(void)
{

lcd_init(LCD_DISP_ON);
lcd_clrscr();

i2c_init();

while(1)
{

temperfassung();

temp_wrd = (msb_temp << 8 | lsb_temp);
itoa(temp_wrd ,Buffer, 10 );

lcd_gotoxy(0,0);
lcd_puts( "Temperatur:");
lcd_gotoxy(0,1);
lcd_puts(Buffer);

_delay_ms(500);

}
}

rauf81
29.01.2012, 16:47
Ich werde auch nicht schlau warum ich nach dem Senden der Adresse und einer 1 für READ keine 0 von dem Temperatursensor zurück bekomme. Um somit das eigentliche Auslesen zu starten.
Ich habe A0 bis A2 auf GND. Smit lautet die Adresse "0b10010000"

Hardware fehler ?!
Habe zwei dieser SMD IC's auf dem Steckbrett mit Adapter.
Leitungen auf Kurzschluss überprüft und nichts gefunden.

Er ärgert mich dieser LM75 :-)

Grüße

oberallgeier
29.01.2012, 16:59
... LM 75 ... Atmega16 ... über I2C ... die Temperatur auszulesen und auf ... LCD ...Hi Flo,

Zum Auslesen eines (Beschleunigungs-) Sensors über I²C gibts von Sternthaler (klick hier) (https://www.roboternetz.de/community/threads/47783-3-Achs-Beschleunigungssensor-sensationell-günstig-!?p=470340&viewfull=1#post470340) ein komplettes C-Schnippsel und zum gleichen Sensor weiter unten von mir noch ein bisschen etwas (klick). (https://www.roboternetz.de/community/threads/47783-3-Achs-Beschleunigungssensor-sensationell-günstig-!?p=485247&viewfull=1#post485247) Meine Master-Slave-Kommunikation hatte ich hier (klick) (https://www.roboternetz.de/community/threads/55744-I²C-Master-m328-kann-Slave-m328-nicht-lesen?p=532122&viewfull=1#post532122) mit Problemen diskutiert.

Es sollte Dir leicht möglich sein, anhand des Codes in den Links Deine Kommunikation einzurichten - Du musst (fast) nur die I2C- und die Registeradressen ändern.

Viel Erfolg.

rauf81
29.01.2012, 18:14
So ich bin nun fertig für Heute, hab die Schnautze voll.
Bekomme keine Antwort (ACK low) von dem Ic!

Danke für deinen Link Oberallgeier werd ich Morgen mal rein schauen und damit weiter pobieren.

Würde mich aber intressiern ob mein Prgramm den LM75 ausliest, könnte dann zumindest den Softwareteil ausblenden und die Hardware zum 1000 mal durchmessen.
Im Anhang noch ein Screenshot meines Osis. Mehr konnte ich ihm heut nicht entlocken.:(

Danke für die Hilfe erstmal...:p

21356


Grüße Flo

rauf81
29.01.2012, 20:00
Konnte ja doch nicht die Finger davon lassen.
Ich will euch aber noch heute Abend an meinen neusten Erkentnissen teil haben lassen :-).

Habe flott das Bascom Beispiel aufgespielt und siehe da es funktioniert!
Temperatur wird über Terminal ausgegeben.
Also Hardware ist IO hätte mich auch gewundert bei dem minimalen Aufbau.

Habe noch was feststellen können, was mich leider mehr verwirrt als sonst was.
Benutze Peter Flury's Liberys wie Ihr sicher schon feststellen kontet, wenn Ihr das Programm angeschaut habt.
An Port B hängt das Display 16x2 Zeilen standart Controler HD......
Port A und Port D ohne Anschlüsse.

Ist das Display aufgesteckt erhalte ich die gewünschte Ausgbe. Auf dem Osi ist das Pic, vom Vorpoast zu sehen.
Ist das Display abgezogen tut sich auf dem I2C Bus garnichts.

Irgendwas harmoniert bei meinem Programmcode nicht, allerdings sehe ich noch bei weitem nicht wodran dies liegen könnte.

So das mal zum besten
Grüße Flo

rauf81
01.02.2012, 18:28
Fällt Euch was auf an meinem Programm :-)


Ich VOLLDEPP habe ein 16 MHz Quarz am Atmega laufen und es nicht definiert.
Nun gehts......

Grüße der DEPP :-)