siro hat geschrieben:Ja ich meinte die Konstanten..
const
ads1115wr = %10010001;
ads1115rd = %10010000;
Ähm, ja, die sind vertauscht. Write ist 0 und Read ist 1. Man sollte doch in den Code schauen und nicht einfach aus dem Gedächtnis.
siro hat geschrieben:Ja ich meinte die Konstanten..
const
ads1115wr = %10010001;
ads1115rd = %10010000;
Zieht jetzt irgendwas den SCL dauerhaft auf low, z.B. ein Kurzschluss, dann bleibt der Controller in der Read-Routine hängen.
Code: Alles auswählen
while (TWCR and (1 shl TWINT)) = 0 do begin
end;
Diese Gedanke hatte ich auch mal kurz, als es gestern noch hängte. Wen der Wert ungültig ist, könnte man zB eine LED aufleuchten lassen. Dann wüsste der Benutzer das etwas mit der Hardware nicht stimmt.Du solltest da ein Timeout einbauen, sowas wie: Wenn die while-Schleife nach xx Durchläufen nicht beendet ist, dann beende sie mit einem ungültigen Wert.
Code: Alles auswählen
uint8_t TWIGetStatus(void) {
uint8_t status;
//mask status
status = TWSR & 0xF8;
return status;
}
Code: Alles auswählen
procedure TWIInit;
const
Prescaler = 4;
TWBR_val = ((((CPU_Clock div F_SCL) div Prescaler) - 16) div 2);
begin
TWSR := 0;
TWBR := byte(TWBR_val);
TWCR := (1 shl TWEN);
end;