AdSense

Sonntag, 23. März 2014

Handy - Kameraabdeckung zerkratzt, Fotos unscharf

(English version) Mein Bruder besitzt ein HTC Desire Z. Seit einiger Zeit sind alle Fotos die er macht verschwommen. Ein Blick auf die Kameraabdeckung verrät auch warum: Die Mitte ist zerkratzt, nur der Rand sieht noch gut aus.
Leicht zerkratzte Kameraabdeckung, das Bild wurde durch eine polierte Kameraabdeckung aufgenommen.
Das Problem ist, dass auf der Abdeckung ein Anti-Reflex-Coating drauf ist. Das sorgt einerseits für schönere Bilder, sobald es jedoch zerkratzt ist bringt es nichts mehr.

Die Lösung für das Problem ist nun, das Coating komplett weg zu polieren. Dazu nimmt man einfach Zahnpaste und ein Wattestäbchen und rubbelt ca. 2 Minuten lang über das Glas. Anschließend sollte es dann so aussehen:
Polierte Kameraabdeckung, das Bild wurde durch eine nicht-polierte Kameraabdeckung aufgenommen.

Es gibt einen Qualitätsunterschied zwischen den beiden Bildern. Dennoch ist die Qualität nach dem Polieren deutlich besser als vor dem Polieren, wo alle Bilder unscharf waren.

Sonntag, 2. März 2014

Register Pointer - mit Arduino bestimmte Register über I2C ansprechen

(English Version) Bei manchen Anwedungen ist es erforderlich, dass man beim lesen und schreiben über den I2C-Bus ein ganz bestimmtes Register eines I2C-Slaves ausliest oder beschreibt, z.B. wenn man bei der Real Time Clock DS1307 nur die Stunden auslesen bzw. ändern möchte.

Dazu gibt es die sogenannten Register Pointer. Mit diesen Pointern "zeigt" man auf das Register, das man lesen oder beschreiben möchte.

Mit dem Arduino funktioniert das denkbar einfach: beim Schreibzugriff wird mit dem ersten über den write()-Befehl gesendeten Byte der Register Pointer gesetzt. Ein Beispiel anhand des DS1307 soll das verdeutlichen;
  Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write(0x02); //Pointer auf Register 2 setzen
  Wire.write(decToBcd(hour)); //Wert für Stunden ins Register 2 schreiben 
  Wire.write(decToBcd(weekDay)); //Wert für Wochentag ins Register 3 schreiben    
  Wire.endTransmission();

Das erste geschriebene Byte nach dem Befehl beginTransmission() setzt hier den Pointer auf  das Register 2 (hier werden die Stunden gespeichert). Mit dem zweiten write()-Befehl wird dann der eigentlich Wert in dieses Register geschrieben. Dann wird automatisch ins nächste Register gesprungen. Der folgende write()-Befehl schreibt also ins Register 3 und so weiter.

Beim Auslesen von Daten aus einem bestimmten Register wird ähnlich vorgegangen:
  Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write(0x02); //Pointer auf Register 2 setzen
  Wire.endTransmission();

  Wire.requestFrom(DS1307_ADDRESS, 7);//Datenabfrage ab Register 2 beginnen
  int hour = bcdToDec(Wire.read()); //Stunden aus Register 2 auslesen
  int weekDay = bcdToDec(Wire.read()); //Wochentag aus Register 3 auslesen
  
Auch hier wird zuerst der Pointer durch Senden einer 2 auf das Register 2 gesetzt. Dann können mit dem Befehl requestFrom() Daten angefordert werden. Der read()-Befehl liest daraufhin Daten aus dem Register 2 aus. Dann wird wieder automatisch zum nächsten Register gesprungen, so dass der nächste read()-Befehl das Register 3 ausliest und so weiter.