Hallo
ich wollte mit dem 90s1200 über i2c einen LM75 auslesen.
ich habe das AVR300.asm genommen und diesen aufruf gemacht
ldi i2cadr,$90+i2cwr ; Set device address and write
rcall i2c_start ; Send start condition and address
ldi i2cdata,$00 ; Write word address
rcall i2c_do_transfer ; Execute transfer
ldi i2cadr,$90+i2crd ; Set device address and read
rcall i2c_rep_start ; Send repeated start condition and address
clc
rcall i2c_read ; Execute transfer (read)
mov temp5,i2cdata
sec
rcall i2c_read ; Execute transfer (read)
mov zahl3,i2cdata
rcall i2c_stop ; Send stop condition - releases bus
der 1. read befehl bringt mir wie gewünscht die temperatur
beim 2. read befehl solte das bit 7 0,5 grad anzeigen - ich bekomme
aber immer nur eine 0.
was mach ich beim 2. aufruf falsch? - wird der ack falsch gesendet ?
Moin Condor,
bei mir gehts, aber verwende Bascom und ein eigenes Test-Board.
Wichtig ist das erste Config-Word, steht aber im Manual drin ..
mfg
Oliver
Also wenn Du nur auslesen möchtest, reicht es, die
Adresse zu senden, und die 2! Datenpakete zu empfangen.
Das erste ist high, dass andere low (,0 oder ,5°C).
Hast Du deinem Compiler auch gesagt, dass 2 Pakete vom LM75
gesendet werden ? Bei Bascom sieht das so aus:
I2cstart
I2cwbyte Lm75read
I2crbyte Lm75high , Ack
I2crbyte Lm75low , Nack
I2cstop
Das ack sagt dem compiler, dass noch ein Word zu lesen ist, bei
Nack kommt anschl. nix mehr. Wie man das nun in assembler sagt, weiß
ich leider nicht.
Hallo
bei der AVR300.asm(org. Atmel) steht in der beschreibung das es über
das
cary flag geht (CLC oder SEC) nur leder bekomme ich halt nur das
1.byte
richtig übertragen.
Hat den noch keiner die AVR300.asm mit dem LM75 getestet ?
"Wo sind jetzt die LM75 Profis ?"
Ich bin kein "LM75 Profi", darf ich also nicht antworten ?
Schon mal an Murphies Gesetze gedacht, z.B. "Der Fehler ist
grundsätzlich nie da, wo man ihn sucht".
Werden z.B. temp3 und zahl5 richtig ausgegeben ?
Trag da einfach mal feste Werte ein und teste, ob sie richtig angezeigt
werden.
Debuggen ist ganz einfach:
Man teilt den Code in Stücke und testet diese.
Den Code, den man gerade nicht testet, muß natürlich drin bleiben, er
könnte ja Seiteneffekte haben.
Bloß machen muß man es selber, da hilft kein Schreien nach Profis.
Ich nehme lieber den DS18B20, den kann man bequem einschrumpfen, für
den LM75 braucht man ja ne extra Platine.
Peter
Hallo peter
es ist so das temp5 die Ganzzahlige temp. bringt z.b. 24 grad das
bekomme ich auch.
nur zahl3 bringt mir keinen wert.
die variable zahl3 habe ich extra aus testgründen gemacht - weil es die
im programm nicht gibt.
die zahl3 lase ich auch direckt auf LED´s ausgeben ohne damit irgend
was
zu rechnen oder so....
pull up habe ich extern 5,2K - ansonsten wenn ich CLC und SEC tausche
bekomme ich immer FF auf zahl3 .......
ich bin echt verzweifelt
Es gibt für das Low-Byte auch nur 127 und 255 als Wert,
oder war´s 0 und 127 ?
Dazwischen gibt es nix.
Daraus bastel ich mir dann die ,0°C oder ,5°C.
mfg
Oliver
Ich bin mir recht sicher das der Fehler in der APPLICATION NOTE AVR300
liegt.
In der Funktion i2c_put_ack wird SDA nicht mehr frei gegeben!!!
Wird darauf i2c_do_transfer aufgerufen wird, dann das letzte ACK (müßte
ja 0 sein, da sonst ein STOP folgt) gelesen.
Abhilfe: den code umschreiben, oder i2c_rep_start verwenden.
i2c_rep_start