Geschrieben von: Malte Freitag, den 16. Juli 2010 um 21:28 Uhr - Aktualisiert Montag, den 05. Dezember 2011 um 18:09 Uhr

Ähnliche Dokumente
Vielleicht weil das Beschleunigungssensor- Modul von ELV so ein Verkaufsschlager war, hat

Der Magnetfeldsensor HMC5883L

3 Achsen Accelerometer

Die Software zum Unser kleiner Computer

Daten loggen mit der STI100-Platine

AVR-Mikrocontroller in BASCOM programmieren

'

Für schnelle und bequeme Entwicklungen wird gern Basic eingesetzt.

Deutsche Dokumentation von ihrem Elektronik-Lieferanten: Inteligentes Motorboard (12V/6A) mit I2C-Bus

Lösungen der Aufgaben

Stefan Hoffmann. Leichter Start mit BASCOM und myavr

AVR-Mikrocontroller in BASCOM programmieren, Teil 2

Miniatur Motortreiber TB6612FNG

Mikrocontroller-Einstieg

Rauschgenerator mit AVR

Nachtaktiver Blinker. Ralf Pongratz. 11. November 2012

Puls Weiten Modulation (PWM)

LCD-Ansteuerung mit MikroForth

Temperaturmessung mit dem ATmega8

Ruecklicht-V1 von Peter Krueger /

Arduino für FunkAmateure

RN-LCD-Adapter - STD. Doku vom (stets aktuelle Dokumentation verwenden)

T3 EC / EE ATTPRO. 6 Mess/SlaveStation. 6.1 Schaltung. Abb. 29. Schaltplan (Slavestation). Man Chun Ling -37-

Die Temperaturmessung mit dem Sensor LM75. Andreas Heller & Eduard Auer

PROFE 2. Lycée Technique des Arts et Métiers Projet de fin d' études 2014/2015. FELTES Jean Claude Messstation im Musée Nationale des Mines

PROFE1: SEISMOGRAF. Name: PAQUET Charel 1/42

Config Lcdpin = Pin, Db4 = Portc.0, Db5 = Portc.1, Db6 = Portc.2, Db7 = Portc.3, E = Portc.5, Rs = Portc.4 Config Lcd = 20 * 4

Arduino für FunkAmateure

TTL-GPS-Modul an Attiny2313-Platine

SIOSLAB. Technische Daten:

Arduino Kurs Das LC-Display. Stephan Laage-Witt FES Lörrach

Aufgabe 4, I2C Kommunikation mit Temperatursensor. Labor Mikrocontroller mit NUC130

RalfPongratz. Grundversion. Reaktivlichtmit7SegmentAnzeige

Mikrocontroller Einstieg ATmega 8

Lösung 8051er. Bussysteme IIC - Bus. Klasse:... Datum:...

Das Attiny-Projekt Der I 2 C-Bus 1. Der I 2 C-Bus

Sound-, Musik- oder Sprache per Controllerboard ausgeben

USB > I2C- Bus Modul. Startet den I2C-Bus. Daten einlesen NACK senden

4 Schleifen -= Entstanden unter Excel 2003 =-

NOFAT - Datei - System

U5-2 Register beim AVR-µC

Das Attiny-Projekt Registermodell 1. Das Registermodell

Übungen zu Systemnahe Programmierung in C (SPiC)

Inhalt. Übungen zu Systemnahe Programmierung in C (SPiC) Schnittstellenbeschreibung. Inhalt

Bauanleitung Öltemperaturanzeige für Mercedes W124

Physical Computing. Ralf Nolte. Bielefeld, 13. Dezember 2011

GdI2 - Systemnahe Programmierung in C Übungen Jürgen Kleinöder Universität Erlangen-Nürnberg Informatik 4, 2006 U4.fm

High-Power Motortreiber 18V15

' 'PD5 = PIN11 (T1) mit Uhrentakt (10) versorgt

Makros sind Textersetzungen, welche vom Präprozessor aufgelöst werden. Dies Passiert bevor der Compiler die Datein verarbeitet.

'

4.2 Peripherie ansprechen in C/I2C-Bus

Frei programmierbare 4-8 Digit / Bargraph LED-Anzeige für µcontrolleranwendungen

AVR-Mikrocontroller in BASCOM programmieren, Teil 3

Jan Monsch. Donnerstag, 2. Mai 13

Die Temperaturmessung

Der I²C-Bus. Vorstellung des Inter-Integrated Circuit -Bus. Aufbau und Funktionsweise. Beispiel PortExpander am Arduino

I2C-006 DATASHEET I2C-006 V1.00: 1K EEPROM MODUL MIT TWI (I 2 C) SCHNITTSTELLE. Dokument NR.: I2C-006_Datasheet

Übungen zu Systemnahe Programmierung in C (SPiC)

Das Attiny-Projekt Funken mit dem Attiny 1. Kommunizieren mit Hilfe von rfm12-funkmodulen

RN-LCD-Adapter. Doku vom (stets aktuelle Dokumentation verwenden)

Praktische Einführung in die AVR-NET-IO. Programmierung

Remote-Objekt-Überwachung. von Jan Schäfer und Matthias Merk

Sebastian Maier (Lehrstuhl Informatik 4) Übung 4. Sommersemester 2017

Arduino µcontroller. Virtuelle COMSchnittstelle

Interrupts im Handbuch des ATmega128 gründlich lesen.

C++ mit dem Arduino (Uno und Mega2560)

Aufbau eines Assembler-Programms

Arduino Kurs Bits und Bytes. Stephan Laage-Witt FES Lörrach

TM1638-Anzeige-Taster-Modul

Chip veraltet, für neue Anwendungen nicht empfehlenswert!

QSYer für den YAESU FT-897 und FT September 2018 Matthias DD1US

Forth-Vokabular. Vokabular für Attiny2313-Forth Stand: A: Assembler-Wort F: Forth-Wort C: Compiler-Wort

Steuerplatine BE-Display für das Touch-Display edip 240-7

Ansteuerung eines LCD-Screens

Excel + VBA. Ergänzungen. Kapitel 1 Einführung in VBA Sequentielle Textdateien HARALD NAHRSTEDT. Erstellt am

Inhalt. Aufgabe 4: LED-Modul Hinweise Testen des Moduls Sommersemester 2015

Das Verfahren in Hardware

Parallel-IO. Ports am ATmega128

SRF05 Datenblatt (Deutsch/Englisch)

150 ma (bei eingeschalteter Hintergrundbeleuchtung)

AVR-Mikrocontroller in BASCOM programmieren, Teil 1

V27 - Mikrocontroller

Aufgaben zur Attiny-Platine

AVR Ein/Ausgabe. Inhaltsverzeichnis

C++ mit dem Arduino (Uno und Mega2560)

1. TÜ-Zusammenfassung zum Modul Computersysteme

Zusatzanleitung. MPR-1 I²C-Protokoll. Version 1.01

Labor Mikrocontroller mit NUC130

Multiplikation. Grundlagen der Rechnerarchitektur Logik und Arithmetik 79

Der Anschluss eines seriellen 16kb EEProms an die I²C Schnittstelle ist denkbar einfach: Hier als Beispiel mit einem ST24C16:

Willkommen!

Liniensensor. Sensor 0 Sensor 8

Wiederholung: Zugriff auf AVR-Prozessor-Register. Aufgabe 3: 7seg-Modul der SPiCboard-Bibliothek

Atmega Interrupts. Rachid Abdallah Gruppe 3 Betreuer : Benjamin Bös

Starten Sie die Arduino IDE und geben Sie den folgenden Programmcode ein:

Aufgabe 2 - ADC. Labor Mikrocontroller mit NUC130. Prof. Dr.-Ing. F. Kesel Dipl.-Ing. (FH) J. Hampel Dipl.-Ing. (FH) A. Reber

Transkript:

{jcomments on} Bei ELV gibt es seit einiger Zeit ein 3-Achsen Beschleunigungssensormodul basierend auf dem BMA020 von Bosch Sensortec. Der MEMS -Sensor verfügt über drei wählbare Messbereiche von +/-2, +/-4 und +/-8 g. Die Messung erfolgt mit einer Bandbreite von bis zu 1.5 khz - ebenfalls einstellbar. Praktisch an diesem Modul ist zum einen, dass die Platine bereits bestückt ist. Der Sensor im LGA Gehäuse wäre nämlich nur schwer per Hand zu löten. Außerdem befinden sich ein 2.5V Spannungsregler und Signalpegelewandler auf der Platine, das Modul kann also an 5V betrieben und über I2C oder SPI direkt an einen Mikrocontroller mit 5V-Logik angebunden werden. Mit 5.95 ist das Modul natürlich außerdem recht günstig. Weil ich schon immer mal mit Beschleunigungssensoren experimentieren wollte, konnte ich nicht widerstehen und habe mir dieses Modul bestellt. Im folgenden möchte ich kurz beschreiben, wie die I2C-Kommunikation mit einem AVR mittels BASCOM realisiert werden kann. Beschaltung Die Beschaltung des Sensormoduls für den Betrieb am I2C-Bus stellt sich naturgemäß simpel dar. Ich habe den Sensor mit meinem miniavr-modul verbunden, auf dem ein Mega8 verbaut ist. Natürlich kann auch jeder andere µc aus der 8bit AVR Familie verwendet werden. Die folgende Abbildung zeigt den Aufbau. Die beiden Widerstände sind die Pullups, die der I2C-Standard fordert und dementsprechend 4.7k groß. 1 / 7

Kommunikation über BASCOM Das folgende Stückchen Code zeigt, wie man in BASCOM mit dem Sensor kommuniziert: {codecitation class="brush: plain; gutter: true;toolbar: false" width="509px"} kleines beispielprogramm zum auslesen des bma020 malte ahlers 2010 weitere infos auf malteahlers.de compiler steuerung $regfile = "m8def.dat" $crystal = 8000000 $framesize = 64 $swstack = 64 $hwstack = 64 $baud = 9600 $lib "i2c_twi.lbx" hardware konfigurieren - taster Config Pinb.6 = Input Portb.6 = 1 Config Pinb.7 = Input Portb.7 = 1 Config Pind.5 = Input Portd.5 = 1 Taster1 Alias Pinb.6 Taster2 Alias Pinb.7 Taster3 Alias Pind.5 2 / 7

- leds Config Portd.7 = Output Config Portd.6 = Output Config Portb.0 = Output Led_gl Alias Portd.7 Led_rt Alias Portd.6 Led_gr Alias Portb.0 - i2c Config Twi = 400000 Config Scl = Portc.5 Config Sda = Portc.4 variablen dimensionieren Dim V(6) As Byte Dim Ax As Integer At V(1) Overlay Dim Ay As Integer At V(3) Overlay Dim Az As Integer At V(5) Overlay Dim Acc_cntr As Byte Dim I As Byte Dim Acc_range As Byte Dim D2g As Single Dim S As Single konstanten Const Acc_w = &H70 Const Acc_r = &H71 subs Declare Sub Set_acc_range(byval Range As Byte) hauptprogramm Print "acc test!" Wait 1 I2cinit Call Set_acc_range(0) messbereich: Set_acc_range(0) -> +/- 2g (default) Set_acc_range(1) -> +/- 4g Set_acc_range(2) -> +/- 8g Do sensor adressieren 3 / 7

I2cwbyte Acc_w acc datenregister adressieren I2cwbyte &H02 daten lesen I2cwbyte Acc_r For I = 1 To 5 I2crbyte V(i), Ack Next I I2crbyte V(6), Nack format konvertieren Ax = Ax / 64 Ay = Ay / 64 Az = Az / 64 in beschleunigungen umrechnen & ausgeben S = Ax * D2g Print "a(x)= " ; S ; S = Ay * D2g Print " a(y)= " ; S ; S = Az * D2g Print " a(z)= " ; S Toggle Led_rt Waitms 10 Loop End Sub Set_acc_range(byval Range As Byte) sensor adressieren I2cwbyte Acc_w kontrollregister adressieren 4 / 7

I2cwbyte &H14 kontrollregister lesen I2cwbyte Acc_r I2crbyte Acc_cntr, Nack kontrollregister manipulieren Acc_cntr.3 = Range.0 Acc_cntr.4 = Range.1 kontrollregister zurückschreiben I2cwbyte Acc_w I2cwbyte &H14 I2cwbyte Acc_cntr umrechnungsfaktor neu berechnen D2g = 2 ^ Range D2g = D2g * 2 D2g = D2g / 512 End Sub{/codecitation} Code zum Download: bma020_02.bas Ich beschreibe an dieser Stelle einige Aspekte des Codes, die im engeren Sinne mit dem Sensor zu tun haben. Weil die TWI-Hardware des Mega8 für die I2C Kommunikation verwendet werden soll, ist dem Compiler die Verwendung der entsprechenden Library vorzuschreiben ($lib = "i2c_twi.lbx"). Dementsprechend muss dann definiert werden, welche Pins des Controllers SCL und SDA sind, das geschieht mittels der enstprechenden Config Befehle. Die fest eingestellte I2C-Adresse des BMA020 zum Schreiben ist &H70. Das LSB der Adresse gibt beim I2C-Standard ja an, ob gelesen oder geschrieben werden soll, der Lesezugriff erfolgt also über &H71. Diese Adressen werden als Konstanten definiert. 5 / 7

Bevor es darum gehen soll, wie man die Beschleunigungsdaten vom Sensor ausliest, noch eine kurze Erläuterung zum Datenformat und wie damit in meinem Code umgegangen wird. Betrachten wir zunächst nur den Wert der x-beschleunigung. Da die Auflösung des Sensors 10 bit beträgt, ist ein Messwert auf zwei 8 Bit Datenregister verteilt. Die Bits 0-7 des Register &H03 enthalten den höherwertigen Anteil der 10 bits, d. h. bit 7 ist das MSB der Daten. Die Bits 7-6 von &H02 enthalten den niederwertigen Anteil, Bit 6 ist also das LSB der Daten. Nun ist wichtig zu wissen, dass die Beschleunigungswerte im Zweierkomplement codiert sind, weil sie natürlich vorzeichenbehaftet sind. Um sich die Umwandlung in einen Dezimalwert per Hand zu ersparen, soll der Compiler dazu verwendet werden. Der Datentyp Integer ist wie allgemein üblich auch bei BASCOM im Zweierkomplement organisiert. Da allerdings ein Integer 16 bit groß ist, ist das MSB (das Vorzeichenbit) Bit 15 (das erste Bit einer Variablen nenne ich Bit 0, das sechzehnte eines Integers also Bit 15). Das MSB eines Beschleunigungsdatums ist aber wie wir gesehen haben dessen zehntes Bit. Wir schieben darum einfach die Beschleunigungsdaten um sechs Stellen nach links. Das kommt zwar einer Multiplikation mit 2 6 = 64 gleich, die kann ja aber im Weiteren durch Division wieder rückgängig gemacht werden. Das Entscheidende an diesem Schritt ist, dass somit das Vorzeichenbit an der richtigen Stelle ist und die Daten korrekt als Zweierkomplement interpretiert werden können. Nun machen wir es uns besonders einfach und sparen uns das explizite Schieben der Bits, indem wir einen kleinen Trick anwenden. BASCOM bietet ja die Möglichkeit, mit Dim... At... Overlay Variablen überschneidend zu definieren. Und das tun wir hier. Wir legen die Integer Variable Ax so über das Bytearray V (in dem byteweise unsere Sensordaten stehen), dass das MSB der Sensordaten dem MSB des Integers entspricht, was schlicht und einfach der Fall ist, wenn Ax bei V(1) beginnt und sich bis V(2) erstreckt. Man braucht jetzt nur noch das implizite Linksschieben durch eine Division durch 64 (was einem Schieben um sechs Bits nach rechts entspricht) rückgängig machen, schon hat man den Messwert im korrekten Format. Das Entsprechende tut man natürlich auch für die Messwerte der anderen beiden Achsen. Nun ist noch wünschenswert, den Digitalwert in physikalische Einheiten von g umzurechnen. Das geschieht über den Faktor D2g, der abhängig vom gewählten Messbereich ist. Beim default Messbereich +/- 2g ist D2g dann natürlich 4g / 2 10 Bit. Der Ablauf der I2C Lese- und Schreibvorgänge sind im Datenblatt des BMA020 auf den Seiten 34 und 35 beschrieben. Hält man sich an den Ablauf, kann garnichts schiefgehen. Für einen Lesezugriff erzeugt man eine Startbedingung und überträgt die Sensoradresse, danach die Adresse des zu lesenden Registers (bei &H02 beginnen die Daten) und erzeugt abschließend eine Stoppbedingung. Nach einer erneuten Startbedingung und dem Schreiben der Leseadresse kann man sich die sechs Datenbytes in Folge abholen. Nach dem sechsten Byte signalisiert ein Nack das Ende der Datenübertragung, danach wird mit einer Stoppbedingung terminiert. Nun kann die oben beschriebene Umrechnung der Daten erfolgen, danach werden sie in obigem Beispielprogramm per RS232 ausgegeben. 6 / 7

7 / 7