Hallo liebe Techniker, ich bin biotechnolgin und habe folgende aufgaben zu lösen.leider hab ich bisher nie c programmiert, aber ich hab am wochenende ein tutorial durchgearbeitet,
Bis auf den Programmierteil (c) hab ich alles durchgearbeitet.
Ich hoffe ihr könnt mit dort helfen.
Die Aufgabe:Abfragen eines Sensors über I^2C Bus
Die TWI-Schnittstelle des ATmega erlaubt den Zugriff auf I2C-Bus-Geräte.
Deswegen gelten im folgenden Text TWI und I2C als gleichbedeutend.
a) Machen Sie sich mit dem prinzipiellen Ablauf einer I2C-Kommunikation
vertraut (z.B. ATmega Dokumentation).
b) Laden Sie von der ITI-Page das Template-Paket zu dieser Aufgabe
herunter. Machen Sie sich mit dem TWI-Treiber (iti_twi.c, iti_twi.h)
vertraut.
c) Implementieren Sie in der Hauptdatei Uebung2.c die fehlenden
Routinen:
int twi_writeregister(uint8_t twi_addr, uint8_t reg, uint8_t data)
int twi_readregister (uint8_t twi_addr, uint8_t reg, uint8_t* data)
d) Machen Sie sich mit der Möglichkeit vertraut, den SRF02 Sensor über
I2C-Bus anzu-sprechen (siehe SRF02-Datenblatt auf der ITI-Page).
e) Führen Sie in der Hauptschleife des Programms eine Messung mit dem
SRF02 aus und stellen Sie das Ergebnis auf dem Bildschirm dar.
f) Bringen Sie in Erfahrung, an welchen Pins des ATmega16 der SRF02
angeschlossen werden sollte.
g) Testen Sie sie ausgiebig ihre Lösung
Praktische Anmerkungen zu Aufgabe 1:
Bevor Sie ihre Lösung testen können müssen folgende Einstellun-gen im
AVR-Studio vorgenommen werden: Menu->Project->Configuration
Options->General-> Optimization: -O1 Fuses: Int. Osc. 4MHz. + 64 ms
In der Abbildung rechts ist die Anschlussbox für den Ultraschall-Sensor
und ein Servo dargestellt. Für die Aufgabe 1 sollen alle Anschlüsse bis
auf PWM verbunden werden
Gegeben ist folgendes Programm, dass um read und write erweitert werden soll
| Code : |
#include "iti_twi.h"
#include "lcd.h"
#include <avr/io.h>
// Informiert den Compiler über die CPU-Taktfrequenz: 4 MHz
// Nötig für <util/delay.h>
#define F_CPU 4000000UL
#include <util/delay.h>
/*
Schreibt ein Byte in ein Register eines TWI-Gerätes.
Parameter:
uint8_t twi_addr - Addresse des TWI-Gerätes.
uint8_t reg - Nr Register des TWI-Gerätes in das geschrieben werden soll.
uint8_t data - Byte das geschrieben werden soll.
Rückgabe:
1 falls Schreiben erfolgreich, sonst 0.
Ablauf:
1. Starte die TWI-Kommunikation.
2. Schreibe die Schreib-Addresse des TWI-Gerätes auf den Bus.
3. Schreibe die Nr. des Registers auf den Bus
4. Schreibe das Byte auf den Bus.
5. Stoppe die TWI-Kommunikation.
*/
int twi_writeregister(uint8_t twi_addr, uint8_t reg, uint8_t data) {
// ...
return 1;
}
/*
Liest ein Byte aus einem Register eines TWI-Gerätes.
Parameter:
uint8_t twi_addr - Addresse des TWI-Gerätes.
uint8_t reg - Nr Register des TWI-Gerätes von dem gelesen werden soll.
uint8_t* data - Addresse einer Variable, in die das gelesene Byte
geschrieben werden soll.
Rückgabe:
1 falls Lesen erfolgreich, sonst 0.
Insbesondere soll 0 zurückgegeben werden, falls der Pointer data==0.
Ablauf:
1. Starte die TWI-Kommunikation.
2. Schreibe die Schreib-Addresse des TWI-Gerätes auf den Bus.
3. Schreibe die Nr des Registers.
4. Stoppe die Kommunikation
5. Starte die TWI-Kommunikation.
6. Schreibe die Lese-Addresse (LSB==1!!!) des TWI-Gerätes auf den Bus.
7. Lese das Byte aus dem Register, setze dabei kein ACK.
5. Stoppe die TWI-Kommunikation.
*/
int twi_readregister(uint8_t twi_addr, uint8_t reg, uint8_t* data) {
// ...
return 1;
}
int main () {
int dist = 0; // Entfernung
// ...
// Initialisiere den TWI-Bus:
// ...
// Initialisiere den Bildschirm:
// ...
while (1) {
// Sende den Befehl für "Messung in cm Starten"
// an den SRF02 Sensor:
// ...
// Warte bis das Ergebnis bereit steht:
_delay_ms (80.0);
// Lese das Ergebnis vom SRF02:
// ...
// Schreibe das Ergebnis auf dem Bildschirm:
lcd_write(VT); // erste Zeile, erste Spalte
lcd_puti(dist);// schreibe Ergebnis
// Füge Wartezeit hinzu, um nicht zu häufig zu lesen
}
return 0;
}
[\code]
|
|
Ich hab zusätzlich noch folgendes in Erfahrung bringen können:
Die TWI-Einheit des ATmega enthält die folgenden 5 Register:
Register Bezeichnung
TWBR TWI Bit Rate Register
TWCR TWI Control Register
TWSR TWI Status Register
TWDR TWI Data Register
TWAR TWI Adress Register
TWINT TWI Interrupt Flag
Dieses Bit wird immer dann gesetzt, wenn die
TWI-Einheit mit einer Aktion fertig ist. Solange
das Bit gesetzt ist, wird die TWI-Einheit angehalten.
Um das Bit wieder zu löschen muss es mit
einer logischen 1 beschrieben werden.
TWSTO TWI STOP Condition Bit Dieses Bit löst eine STOP-Condition aus.
TWWC TWI Write Collision Flag
Dieses Bit wird gesetzt, wenn auf das Datenregister
TWDR geschrieben wird, während die TWIEinheit noch beschäftigt ist.
TWIE TWI Interrupt Enable
Wenn dieses Bit gesetzt ist, wird ein Interrupt ausgelöst, sobald TWINT gesetzt wird.
TWSTA TWI START Condition Bit
Dieses Bit löst eine START-Condition aus, sobald der Bus frei ist.
Ihr seit meine letzte hoffnung
ich weiß nicht wie ich das programmieren soll.ich sitz schon seit einer woche daran
LG
Zuse1936
Ps:
Als Anhang hab ich die gesamten Dateien hinzugefügt die wir mitbekommen.