Compact Plus Blutzuckermessgerät-Hardware

Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
Wechseln zu: Navigation, Suche

Hardware

Übersicht Hardware

  • OLED Display 102×80 Pixel incl. 16 Helligkeitsstufen pro Pixel / SSD1325 /43x36 mm gesamt
  • Atmega168PA
  • DC/DC-Wandler (Regler und Drosseln)
  • IR-Sender/Empfänger
  • 3 Tasten (4 wenn man den Schließer der Klappe mitzählt)
  • 2 Elektromotoren
  • kleine Lichtschranke/Barcodescanner
  • kleines Spektrometer (2 * LEDs rot, IR(?)-LED, Fotodiode)
  • Betriebsspannung 3V (2*AAA)
  • SMD Piezo-Summer

Gerät als Ganzes

Compact plus.jpg

Das unzerlegte Gerät. Ganz links ist die Stechhilfe.

Gerät zerlegen

Das Gehäuse besteht aus drei ineinander einrastenden Teilen (keine Schrauben). Relativ schadlose Demontage durch vorsichtiges Aufhebeln möglich. Erst das Seitenteil (links) ganz oben und 2 cm von unten ausrasten. Von unten anfangen die Gehäusehälften zu lösen, bis man sie über die Oberkante aufklappen kann.

Die Platine selbst ist mit 2 Schrauben und ein paar Clipsen befestigt. Vor dem Entnehmen ist der untere Folienstecker abzuziehen.


Compact plus open.jpg

Das geöffnete Gerät ohne Platine. Gut zu erkennen (im unverkleinertem Bild) sind die zwei Motoren und die Mechanik die dafür sorgen, dass die Aufbewarungstrommel gedreht und die Messstreifen herausgefahren werden können.

Komponenten

Board

Hochauflösende Scans beider Platinenseiten. Die Bauteile sind nach bestem Wissen und Gewissen bezeichnet (für spätere Schaltpläne). Speziell bei den Widerständen und Kondensatoren ist noch eine Kontrolle notwendig. Ich habe dabei alle blauen und schwarzen Bauteile als Widerstände und alles graue und weiße als Kondensatoren gedeutet.

Änderungen bitte mir (Netzwanze) melden.

AccuCheckL1.jpgAccuCheckL6.jpg

Stromversorgung

Die zwei AAA Zellen sind in Serie geschaltet. Ein Schaltregler [IC7] erzeugt daraus 3.3 V. Ein Schaltregler [IC6] erzeugt daraus 12 V für das OLED.

Bauteilliste

Nach bestem Wissen und Gewissen bestimmt durch Kombination aus Schaltplänen und Messungen. Bei Komponenten mit "(?)" bin ich mir nicht sicher.

Bauteil Größe
R1 820 kOhm
R3 1 kOhm
R4 1 kOhm
R5 10 kOhm (Pull-Up nach Vcc für Reset)
R11 100Ω
R13 1 kOhm
R14 10 kOhm
R17 1 kOhm
R29 15Ω
R29 15Ω
R35 Temperaturfühler; NTC 10 kOhm bei 20°C (?)
R36 10 kOhm
R37 10 kOhm
R43 100 kOhm
R44 100Ω
R45 39 kOhm
R46 1 MOhm
C24 22 µF (?)
C38 4,7 µF
C39 4,7 µF
C44 100 nF
C45 470 nF (?)
C46 10 pF
L2 100 uH
IC1 ASIC
IC2 ATmega168PV-10MU
IC3 Atmel AT25640A SPI EEPROM (64k, 8192*8)
IC4 NC7NP14 ULP Triple Inverter with Schmitt Trigger Input
IC5 74LVC1G86GV (Markierung V68)
IC6 TPS61080 Step-up 12 V
IC7 AS1329, Step-up 3,3 V
IC8 BIG 01 A825MFL ????
IC9 IR (TFDU2201)
Buzzer Piezo Schallwandler
D1 BAT54W
T2 ZXTN23015CFH (NPN)
XTAL1 32 Khz
XTAL2 4 Mhz

Pinbelegung Mega168

Wie oben mittles Messungen ermittelt. Ohne Garantie auf Vollständigkeit und Richtigkeit.

Pin Port Funktionen Verwendung
1 PD3 (PCINT19/OC2B/INT1) Taste Mitte (S2)
2 PD4 (PCINT20/XCK/T0) Display SCLK (XCLK)
3 GND GND
4 VCC VCC
5 GND GND
6 VCC VCC
7 PB6 (PCINT6/XTAL1/TOSC1) an Transistor T2 (schaltet BAT+ über 2x R29 (7.5Ω) gegen GND - vermutlich um zu messen, ob die Batteriespannung unter Last stark einbricht)
8 PB7 (PCINT7/XTAL2/TOSC2) enable 3.3V step-up (über R12; High = aktiviert)
9 PD5 (PCINT21/OC0B/T1) VCC enable (12 V step-up)
10 PD6 (PCINT22/OC0A/AIN0) frei
11 PD7 (PCINT23/AIN1) direkt an Batteriespannung
12 PB0 (PCINT0/CLKO/ICP1) an Transistor T1 (schaltet 12 V über 100Ω gegen GND als Grundlast bzw. zum Entladen)
13 PB1 (PCINT1/OC1A) Display /CS
14 PB2 (PCINT2/SS/OC1B) über R17 an IC1. Anschluss des Buzzers möglich
15 PB3 (PCINT3/OC2A/MOSI) ISP MOSI
16 PB4 (PCINT4/MISO) ISP MISO
17 PB5 (SCK/PCINT5) ISP SCK
18 AVCC mit Beschaltung an VCC
19 ADC6 Batteriespannung? (3.3Volt StepUp dafür abschalten)
20 AREF mit Filterkodensator C9 an GND. Interne Referenz 1,1V verwenden (REFS1=1, REFS0=1)
21 GND GND
22 ADC7 Ausgang des 3,3V step-up über Spannungsteiler. Mit Step-Up wird 707 gemessen, ohne ca. 637.
23 PC0 (ADC0/PCINT8) Batteriespannung über Spannungsteiler (R31/C31 an Masse und über R30 an Batteriespannung), bei voller Batterie (3V) 0,68V ca. 638
24 PC1 (ADC1/PCINT9) Display D/C
25 PC2 (ADC2/PCINT10) Display RESET
26 PC3 (ADC3/PCINT11) über R4 an IC1
27 PC4 (ADC4/SDA/PCINT12) Taste Links (S1)
28 PC5 (ADC5/SCL/PCINT13) Taste rechts (S3)
29 PC6 (RESET/PCINT14) ISP Reset
30 PD0 (RXD/PCINT16) über R37 an GND und über R3 an IC1
31 PD1 (TXD/PCINT17) Display SDIN. Achtung, ist auch TxD (UART-SPI möglich)
32 PD2 (INT0/PCINT18) über R14 an GND und über R13 an IC1

Unbekanntes IC1

Hier mal der Dekodierte Barcode des noch Unbekannten IC1. Der decodierte Text ist:

25SLEATM 8R4222 084420179+2P00+PLCMC

AccuCheckDecodedMatrixCode.png

IC9 (IR)

Ist wohl ein TFDU2201 (Datenblatt).

Accu chek combo ir.png AccuCheckIRDA(TFDU2201)Pinout.png

Buzzer

Ist ein Piezo Schallwandler. Es ist möglich eine ihn mit PB2 des mega168 zu verbinden. Im Bereich "Kurzzeitwecker mit 7-Segment-Anzeige" auf adriano6's Webseite.

Display

Display.JPG

Das Display basiert auf OLED - Technologie und besitzt eine Auflösung von 102×80 Pixel, von denen jedes 16 Helligkeitsstufen darstellen kann. Displaycontroller ist SSD1325.

Detailierte Informationen zum Display gibts auf adriano6's Webseite

Inbetriebnahme auf dem Board

Es ist möglich das Display auf dem Board in Betrieb zu nehmen, wenn alle Komponenten bis auf: R1, R43, R44, R45, R46, C24, C38, C39, C44, C45, C46, L2, IC6 und D1 entfernt werden. T1 und R11 sind vermutlich als Grundlast zum Start des 12 V Step-up und zum Entladen des OLED beim Abschalten. Die folgende Tabelle enthält die Pads des Atmega168 Footprints und die entsprechenden Pins am Display.

Pad am Atmega168 Pin am Display
PD1 SDIN
PD4 SCLK
PC1 D/C
PC2 RESET
PB1 /CS
Grafikbeschleunigung mit dem SSD1325

Mit dem im SSD1325 vorhandenen Befehlen Copy, DrawRectangle und HorizontalScolling kann man ein paar nette Animationen machen, bzw. dem ATmega eine Menge Arbeit abnehmen (Details zu Controller und Display stehen im Datenblatt und hier ).

Der Displaycontroller verfügt über ein 64x80 Bytes großes RAM, von dem das Display aber nur 51x80 Bytes (102x80 Pixel) darstellt, beginnend von Spalte 7 bis Spalte 57:

Col0 ... Col6 Col7 ... Col56 Col57 Col58 ... Col63
D7-4 D3-0 ... ... D7-4 D3-0 D7-4 D3-0 ... ... D7-4 D3-0 D7-4 D3-0 D7-4 D3-0 ... ... D7-4 D3-0

Schaltet man im Controller nun Wraparound für das Scrolling- und Copy-Commando ein, hängen Ende und Anfang der jeweiligen Zeile hintereinander:

Col58 ... Col63 Col0 ... Col6

Aus Sicht des Copy- und DrawRectangle-Kommandos kann man jetzt folgendermaßen auf den nicht sichtbaren Bereich des Display-RAM zugreifen:

Col58 ... Col63 Col64 ... Col70

Um Daten in diesen Bereich zu bekommen, könnte man einen entsprechenden Bildschirmausschnitt definieren und die Daten einfach sequentiell da rein schreiben. Praktisch hat das aber nicht einwandfrei funktioniert. Besser schreibt man zuerst in den sichtbaren Bereich und kopiert dann den Block in den Bereich ab Spalte 58. Statt jetzt Grafiken byteweise über die Schnittstelle in das RAM zu schreiben braucht man sie nur noch durch den Controller vom unsichtbaren Bereich (maximal 26x80 Pixel) in den sichtbaren kopieren zu lassen.

Ich habe eine kleine Demo geschrieben, die mit dem Copy-Befehl 8 Sprites (sich drehende Bälle) fliegen läßt und bei jeder Randberührung eines Sprites einen Zähler erhöht. Im Hintergrund laufen je eine horizontale und vertikale Linie (Rechteck) durch. Das Ganze verbraucht mit Software-SPI ca. 20% Rechenzeit des ATmega, bei Hardware-SPI sind es ca. 6%.

Um auch in horizontaler Richtung eine pixelgenaue Bewegung zu erreichen, erstellt man für jedes Sprite zwei um jeweils ein Pixel verschobene Versionen, und kopiert diese nacheinander auf die selbe Spaltenposition.

Das Timing ist etwas kritisch, da vom Controller keine Rückmeldung möglich ist, man muß ggf. die Wartezeit nach einem Kommando versuchsweise ermitteln. Schickt man das nächste Kommando zu früh ab, wird das gerade laufende abgebrochen, was nicht immer schön aussieht oder sogar den Controller zum Abstürzen bringt.

Bei Ansteuerung mit Hardware-SPI muß man außerdem ca. 2µs warten, bevor das CS-Signal deaktiviert werden kann.

Spektrometer

Accu-Check CompactPlus BZ Sensor.jpg

Im Grunde genommen, handelt es sich um eine Reflexlichtschranke mit zwei roten LEDs, einer vermutlich infraroten LED, sowie einer Fotodiode.

Accu-Check CompactPlus Photometer.jpg

Software

Programmierung

AVRdude

Auslesen der Fuses

avrdude -p m168  -P /dev/ttyUSB0 -c avrispv2 -F -v
avrdude: Device signature = 0x1e940b
avrdude: Expected signature for ATMEGA168 is 1E 94 06
avrdude: safemode: lfuse reads as 42
avrdude: safemode: hfuse reads as D6
avrdude: safemode: efuse reads as 1

Flashen mit AVRdude

Da die IDs von ATmega168 und ATmega168A abweichen, muss die Option -F mit avrdude verwendet werden.

avrdude -p m168  -P /dev/ttyUSB0 -c avrispv2 -F -u -U flash:w:Oled-Demo.hex

Fuses mit AVRdude

Der ATmega168A hat die Fuse CLKDIV8 eingeschaltet. Durch Ändern der LFUSE von 0x42 auf 0xC2 (Bit7) wird der Teiler deaktiviert und der ATmega läuft mit voller Geschwindigkeit (8MHz):

avrdude -p m168  -P /dev/ttyUSB0 -c avrispv2 -F -U lfuse:w:0xC2:m

Programme

µC

PC

Links

Technische Dokumente

Websites

Diskussions Threads