Forum: Mikrocontroller und Digitale Elektronik TWI Umsetzung in reiner Software


von Christof Krampe (Gast)


Lesenswert?

Hallo

ich nutzte derzeit noch aus der Arduino Zeit einen Arduino Uno (ohne auf 
die Software zurückzugreifen) sowie ein paar Attiny85(DIP). Ich 
programmiere dieses mit einem ISP Adapter in Atmel Studio.

Nun würde ich gerne mal ein paar andere MCUs von Atmel ausprobieren. Das 
sind vorallem die Atmegas. Jedoch sind auch ab und zu die ATtiny nicht 
uninteressant.

Ich möchte in nächster Zeit eine kleine Uhr für mich basteln. Habe da 
auch bereits mit dem Attiny85 ein kleines Programm geschrieben.

Für den Atmega328P (Uno) habe ich damals eine sehr gute Libary für den 
DS1307 gefunden. Die Libary soll aber auch mit den DS3231 funktionieren. 
Die DS3231 scheinen doch einiges genauer zu sein.

Beim Attiny85 hatte ich das Problem, dass ich die RTC nicht auslesen 
kann. Habe daraufhin mit einem 32kHz Quarz gearbeitet und am Timer die 
Pulse gezählt. Genauigkeit war ganz in Ordnung. Geht besser, aber für 
einen Test okay.

Nur ist das doofe wenn die Spannung kurz weg ist, läuft die Uhr nicht 
weiter und gespeichert wird diese auch nicht. Hatte mir überlegt, die 
Zeit immer im Eeprom abzulegen, aber dann hab ich auch nur die Zeit wenn 
die Spannung einbricht. Für die Zeit wo keine Spannung anliegt, läuft 
die Uhr nicht weiter.

So nun zu meiner Frage,

gibt es eine Software I2C Lösung, die keinen I2C Slave/Master als MCU 
braucht?
Bislang hab ich diese DS3231 Lib genutzt
https://github.com/akafugu/ds_rtc_lib
Diese enthält alles für die Hardware I2C Lösung (twi.h/c, 
twi-lowlevel.h/c)
Die Prototypen für den Hardware I2C sind...
1
void twi_init_master(void);
2
void twi_init_slave(uint8_t);
3
void twi_begin_transmission(uint8_t);
4
uint8_t twi_end_transmission(void);
5
uint8_t twi_request_from(uint8_t, uint8_t);
6
void twi_send_byte(uint8_t);
7
void twi_send(uint8_t*, uint8_t);
8
void twi_send_char(char*);
9
uint8_t twi_available(void);
10
uint8_t twi_receive(void);
11
void twi_set_on_receive( void (*)(int) );
12
void twi_set_on_request( void (*)(void) );

Bislang habe ich im Netz noch keine passende Lösung gefunden, die diese 
Funktionen als Softwarelösung unterstützt.

Das einzige was ich gefunden habe ist
i2c_soft_master.c
Autor:  Artur Funk               |
Last Change   16.11.2007
1
void       i2c_master_init(void);
2
void      i2c_master_clk_toggle(void);
3
void        i2c_master_start(void);
4
void       i2c_master_stop(void);
5
6
unsigned char     i2c_try_scl(unsigned char start_trials);
7
unsigned char      i2c_master_write(unsigned char b);
8
unsigned char     i2c_master_read(unsigned char a);

Die Prototypen sind leider nicht kompatibel.

Schöne wäre es wenn ich später mit einem einfachen #ifdef abfragen kann, 
ob es TWI Master Register gibt. Wenn ja, soll die twi.c/h + 
twi-lowlevel.c/h geladen werden. Andernfalls twi_soft.c/h + 
twi_soft_lowlevel.c/h(Beispiel)


Google habe ich bereits bemüht. Aber das richtige war da noch nicht bei.
Beitrag "I2C / TWI als reine Softwarelösung?"
Beitrag "Software I2C MSP430"
http://extremeelectronics.co.in/avr-tutorials/software-i2c-library-for-avr-mcus/
Beitrag "I2C-Master [ohne TWI (Softwarelösung) für die ATMEGAs"

Das waren auch schon mehr oder weniger die einzigen Sachen, die 
Ansatzweise in die Richtung gingen.

Danke schon mal

Chris

von Rainer U. (r-u)


Lesenswert?

Christof Krampe schrieb:
> Die Prototypen sind leider nicht kompatibel.

Nur mit copy&paste wirst Du wohl nicht weiterkommen. Beschäftige Dich 
halt inhaltlich mit I2C, dann verstehst Du, was diese Funktionen tun, 
und kannst sie inhaltlich anpassen.

von Jürgen S. (jurs)


Lesenswert?

Christof Krampe schrieb:
> Google habe ich bereits bemüht. Aber das richtige war da noch nicht bei.

Für Arduino-Programmierer gibt es diverse I2C Libraries für die Attiny 
Controller, die alle auf diesem USI-Treiber aufbauen, der wohl für Atmel 
Studio vorgesehen ist:

USI TWI Slave driver.
Created by Donald R. Blake
Header: 
http://codalyze.googlecode.com/svn-history/r294/cyz_rgb/trunk/usiTwi/usiTwiSlave.h
C-File: 
http://codalyze.googlecode.com/svn-history/r294/cyz_rgb/trunk/usiTwi/usiTwiSlave.c

Wenn Du I2C erstmal über das USI Interface des Attiny am Laufen hast, 
ist I2C mit einer RTC wie DS1307 oder DS3231 dann keine 
Raketenwissenschaft mehr, denn zum Stellen oder Auslesen einer RTC mußt 
Du ja kaum mehr als eine handvoll Bytes über den I2C-Bus schicken bzw. 
auslesen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.