Hallo
Ich möchte einen LM75 Auswerten und Temperatur über terminal ausgeben
nur scheiter das ein wenig.
2 pullup widerstände 10K von SDA, SCL jeweils auf +5V. Die, A0, A1, A2
jeweils direkt auf GND
und einen 100nF an VCC und GND. Ein gesetzt Wirt ein ATmega644 mit 8MHz
auf einem STK500
Das Programm.:
MAIN
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <stdlib.h>
4
#include <util/delay.h>
5
#include "uart.h"
6
#include "i2c.h"
7
8
int main (void) {
9
10
USART_Init( UBRR_VAL ) ;
11
12
13
uart_puts ("\033[2J");
14
15
uart_puts ("\033[32m");
16
17
18
uart_puts ("Hallo Welt\r\n") ;
19
20
uart_putc ( 0x01);
21
22
uart_puts ("\r\nHallo Welt 2 ") ;
23
24
_delay_ms(10000);
25
26
27
28
29
TWI_init(FAKTOR, TEILER);
30
unsigned int temperatur;
31
char s[7];
32
33
while(1)
34
{
35
36
uart_puts ("\033[2J");
37
38
temperatur = TWI_empf(ADRESSE_R);
39
40
uart_puts ("\r\nTemperatur ") ;
41
uart_puts( utoa( temperatur, s, 10 ) );
42
//uart_putc ( temperatur);
43
uart_puts (" C \r\n") ;
44
45
_delay_ms(1000);
46
47
}
48
49
}
uart.h
1
/*
2
UART-Init:
3
Berechnung des Wertes für das Baudratenregister
4
aus Taktrate und gewünschter Baudrate
5
*/
6
7
#ifndef F_CPU
8
9
#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 8000000"
10
#define F_CPU 8000000UL // Systemtakt in Hz - Definition als unsigned long beachten
11
// Ohne ergeben sich unten Fehler in der Berechnung
Das Problem war das mein terminal Ales in ascii interpretiert hat also
auch die werte die von dem LM75 kommen man muste diesen wert erst um
Rechnen so das Er dem ascii Code entspricht und ich auch mein
gewünschten dezimal werte bekomme.
Das geht so auf http://www.torsten-horn.de/techdocs/ascii.htm kan man
erkennen das Stele 48 mit 0 beginnt und stelle 57 mit 9 endet, also
musste ich meinen wert erst mal unterteilen um die einer zu erhalten
teilt man durch 10 und merkt sich den Rest das geht mit "%10" Dan
verschiebt man den wert um 48 stellen nach hinten also +48 und erhält
das gewünschte ascii Zeichen, um die zehner zu erhalten, teilt man das
ganze durch /10 und verschiebt das Ergebnis um 48 stellen also wider +48
jetzt nur noch nacheinander ausgeben und fertig.
THX
by Ferdinand
Ferdinand schrieb:> Das Problem war das mein terminal Ales in ascii interpretiert hat> also auch die werte die von dem LM75 kommen man muste diesen wert erst> um Rechnen so das Er dem ascii Code entspricht und ich auch mein> gewünschten dezimal werte bekomme.
Das ergibt keinen Sinn.
In dem Programm, das du gepostet hast, hast du utoa benutzt. utoa macht
genau diese Konvertierung eines Zahlenwertes in einen String.
> erkennen das Stele 48 mit 0 beginnt und stelle 57 mit 9 endet, also> musste ich meinen wert erst mal unterteilen um die einer zu erhalten> teilt man durch 10 und merkt sich den Rest das geht mit "%10" Dan> verschiebt man den wert um 48 stellen nach hinten also +48 und erhält> das gewünschte ascii Zeichen, um die zehner zu erhalten, teilt man das> ganze durch /10 und verschiebt das Ergebnis um 48 stellen also wider +48> jetzt nur noch nacheinander ausgeben und fertig.
Das ist alles prinzipiell richtig. Nur macht man das nicht so. Genau
dafür gibt es die Konvertierfunktionen, itoa, utoa, und wie sie noch
alle heißen.
Deine
unsigned int TWI_empf(unsigned char adres)
sieht jetzt anders aus und dort ist der Schlüssel zur Lösung zu suchen.
Ja schön zu sehen das es Menschen gibt die so hilfsbereit sind ich danke
dir das wenigstens du den Mut hast mir zu antworten dein Beitrag hilft
mir zwar nicht, zu mindestens bekomme ich ein wenig Aufmerksamkeit der
Wille zählt (-;
Wenn ich dich trotzdem bitten, dürfte mir deine Idee oder Empfehlung
etwas genauer zu erläutern würdest Dan bekomme ich mein Programm noch
effizienter hin, den ich hatte das mit den beschriebenen Funktionen
versucht und nicht hin bekommen
P.S.: Da man einem Text keine Emotionen ansieht möchte ich noch mal
betonen, dass ich mich wirklich freue (-:
THX
by
Ferdinand