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
Hallo Was heißt das erste config-word ? ich will nur die term auslesen (adr00) nichts anderes will ich.
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
P.S.: Es gibt Leute die warten für jedes Ausrufezeichen im Betreff einen Tag länger, ehe sie antworten. 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
hallo oliver beim erwärmen bekomme ich aber kein 0 - 128 sonern nur 0 oder wenn ich CLC und SEC tausche nur 255 (also alles 1).
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.