BLIT2008-Board mit i2c-tiny-usb-Firmware
Aus BraLUG-Wiki
(noch ein link) |
MaD (Diskussion | Beiträge) K (Wiki-Links statt URIs) |
||
Zeile 2: | Zeile 2: | ||
[[Kategorie:BLIT2008-Board]] | [[Kategorie:BLIT2008-Board]] | ||
− | Statt das Rad neu zu erfinden, kann man sich für I²C auf dem [ | + | Statt das Rad neu zu erfinden, kann man sich für I²C auf dem [[BLIT2008-Board]] auch die Linux-Kernel-Unterstützung für ein ähnliches Projekt zunutze machen. Die Firmware für das [http://www.harbaum.org/till/i2c_tiny_usb/ i2c-tiny-usb]-Board läuft mit minimalen Änderungen auch und man hat die Treiber- und Software-Unterstützung von Linux als Bonus. |
==Firmware== | ==Firmware== | ||
Zeile 59: | Zeile 59: | ||
===RTC auslesen=== | ===RTC auslesen=== | ||
− | In Anlehnung an Uwes Beispiele hier ein Script, um die [ | + | In Anlehnung an Uwes Beispiele hier ein Script, um die [[BLIT2008-Board#I2C-RTC|RTC-Zeit]] auszulesen. Gegebenfalls sind wieder Bus-Nummer und Adresse anzupassen. |
<code>get_rtc_time.sh</code>: | <code>get_rtc_time.sh</code>: | ||
Zeile 85: | Zeile 85: | ||
===Thermo-Board auslesen=== | ===Thermo-Board auslesen=== | ||
− | Und natürlich das entsprechende Script für das [ | + | Und natürlich das entsprechende Script für das [[BLIT2008-Board#I2C-Temperaturfühler|Thermo-Board]] darf nicht fehlen. Auch hier sind wieder Bus-Nummer und Adresse entsprechend anzupassen (bei mir war es halt der Bus 2...!). Als Shell wird bash vorausgesetzt. |
<code>get_temperature.sh</code>: | <code>get_temperature.sh</code>: |
Version vom 26. November 2008, 23:02 Uhr
Statt das Rad neu zu erfinden, kann man sich für I²C auf dem BLIT2008-Board auch die Linux-Kernel-Unterstützung für ein ähnliches Projekt zunutze machen. Die Firmware für das i2c-tiny-usb-Board läuft mit minimalen Änderungen auch und man hat die Treiber- und Software-Unterstützung von Linux als Bonus.
Inhaltsverzeichnis |
Firmware
Da die Firmware schon für den Mega8 vorgesehen ist, war die Portierung auf das Board mehr als einfach. Folgende Schritte sollten funktionieren:
- Beschaffen und Entpacken der Firmware (http://www.harbaum.org/till/i2c_tiny_usb/i2c_tiny_usb-2007-06-07.zip)
- In das Firmware-Verzeichnis wechseln: „
cd i2c_tiny_usb/firmware/
“ - Anpassen der
usbtiny.h
, Ändern des Ports aufPORT_D
und Ändern des D+-Pins auf 2 (Patch) - Bauen mit „
make -f Makefile-usbtiny.mega8
“ - Hochladen auf den Mikrocontroller z.B. mit „
avrusbboot main.hex
“
Kerneltreiber
Der benötigte Kerneltreiber namens i2c-tiny-usb
ist ungefähr seit Version 2.6.22 im Linux-Kernel. Man benötigt folgende Konfigurationsoptionen (sollte im Distributionskernel dabei sein):
CONFIG_I2C CONFIG_I2C_CHARDEV CONFIG_I2C_TINY_USB
Geladen werden müssen i2c_tiny_usb
und i2c_dev
.
i2c-tools
Zum grundlegenden Test, zum Debugging und zum Skripten eignen sich die I2C-Tools, bei Debian auch im Paket
i2c-tools
verfügbar.
Liste der verfügbaren Busse:
# i2cdetect -l i2c-5 i2c i2c-tiny-usb at bus 005 device 004 I2C adapter i2c-0 i2c radeonfb monid I2C adapter i2c-1 i2c radeonfb dvi I2C adapter i2c-2 i2c radeonfb vga I2C adapter i2c-3 i2c radeonfb crt2 I2C adapter i2c-4 smbus SMBus Via Pro adapter at e800 SMBus adapter
- Die Nummer des I²C-Busses ist die 5 in
i2c-5
, nicht die 5 in „at bus 005
“ (USB-Bus-Nummer)
Slave-Chips am Bus finden:
# i2cdetect 5 WARNING! This program can confuse your I2C bus, cause data loss and worse! I will probe file /dev/i2c-5. I will probe address range 0x03-0x77. Continue? [Y/n] 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- 51 -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- --
-
i2cdetect
verwendet eine etwas andere Darstellung für die Adressen. Im AVR-Code würde man Aread = 2 * n + 1 und Awrite = 2 * n + 0 verwenden,0x51
ist also Adresse0xA2
(schreiben) und0xA3
(lesen). - Die Warnung sollte man durchaus ernst nehmen und das Kommando nicht unreflektiert auf den anderen Bussen ausführen. Ist man sich sicher, den richtigen Bus erwischt zu haben (in diesem Fall
5
), dann kann man auchi2cdetect -y 5
benutzen, um die Nachfrage abzuschalten.
RTC auslesen
In Anlehnung an Uwes Beispiele hier ein Script, um die RTC-Zeit auszulesen. Gegebenfalls sind wieder Bus-Nummer und Adresse anzupassen.
get_rtc_time.sh
:
#!/bin/sh BUS=5 ADDR=0x51 get_part () { i2cget -y "$BUS" "$ADDR" $1 | sed -e 's/^0x//' ; } ss=`get_part 2` mm=`get_part 3` hh=`get_part 4` dd=`get_part 5` mo=`get_part 6` echo "RTC time: $dd.$mo. $hh:$mm:$ss"
# ./get_rtc_time.sh RTC time: 01.01. 03:14:11
Thermo-Board auslesen
Und natürlich das entsprechende Script für das Thermo-Board darf nicht fehlen. Auch hier sind wieder Bus-Nummer und Adresse entsprechend anzupassen (bei mir war es halt der Bus 2...!). Als Shell wird bash vorausgesetzt.
get_temperature.sh
:
#!/bin/bash # # Kodierung der Temperatur im LM75 # -------------------------------- # # High-Byte Low-Byte # 7 6 5 4 3 2 1 0 | 7 6 5 4 3 2 1 0 # x 1 1 1 1 1 1 1 x x x x x x x x # | | |...........| # | | | # | | +-- Temperatur (Vorkomma): Bit 0...6 # | +---- Vorzeichen: 1 -> Temperatur < 0°C # +---------------------- Nachkommastelle: 0 -> ,0°C; 1 -> ,5°C # BUS=2 ADDR=0x49 get_part () { i2cget -y "$BUS" "$ADDR" $1 w | sed -e 's/^0x//' ; } # lm75 auslesen und in dezimal val=$((16#`get_part 0`)) # Nachkommawert bestimmen if [ $val -ge 65280 ] then nk=5 val=`expr $val - 65280` # FF00 else nk=0 val=`expr $val - 32512` # 7F00 fi # Vorzeichen und Temperatur selbst ermitteln if [ $val -ge 128 ] then vz="-" vk= `expr $val - 128` else vz="+" vk=$val fi echo "Thermo-Board: $vz$vk,$nk °C"
# ./get_temperature.sh Thermo-Board: +23,5 °C
lm_sensors
TODO