*staubwisch* *durchsaug*
Da bin ich wieder ^^
Das Thema hier ist noch nicht tot. Ich hatte in den vergangenen Wochen nur unendlich viel privaten Stress der mich von allem abgehalten hat.
Ich habe zwischendurch ein paar wenige freie Minuten gehabt um mich der Matrix zu beschäftigen und darauf ein paar Motive und Animationen (soweit möglich mit einer 5x5-Matrix) laufen gelassen.
Jetzt haben sich Arbeit und Probleme wieder beruhigt und ich habe wieder etwas mehr Zeit für die Uhr. In den letzten zwei Tagen habe ich versucht, das DS1307 via I2C anzusprechen. Ich setzte im Moment meine Hoffnung in die Bibo von Peter Fleury. Damit steuer ich seid ein paar Monaten meine LCD-Displays an und bin recht zufrieden damit. Ich hoffe dass die I2C-Lib ähnlich gute Dienste leisten wird. Doch soweit bin ich bisher nicht gekommen:
Ich habe den/die/das DS1307 auf einem Breakoutboard von Watterott zur Verfügung. Daran habe ich eine Stiftleiste angelötet und auf mein Breadboard gestöpselt. Verbunden habe ich DS1307 und Atmega8 wie folgt:
SDA(DS1307) -> PC4(Atmega
SCL(DS1307) -> PC5(Atmega
SQW(DS1307) -> PC3(Atmega
Alle drei Leitungen mit einem 4,7kOhm-Pullup auf 5V (Wie in der Doku von Peter beschrieben)
Atmega läuft mit 8MHz(intern)
In der i2cmaster.S habe ich die Ports angepasst
Code:
;***** Adapt these SCA and SCL port and pin definition to your target !!
;
#define SDA 4 // SDA Port C, Pin 4
#define SCL 5 // SCL Port C, Pin 5
#define SDA_PORT PORTC // SDA Port C
#define SCL_PORT PORTC // SCL Port C
;******
Mein Code soll einmal das CH-Bit löschen, den SQW-Ausgang auf 1Mhz setzen und diesen anschließend an PC6 auswerten um damit eine LED an PD0 ein- bzw. abschalten.
Code:
#include <avr/io.h>
#include <util/delay.h>
#include "i2cmaster/i2cmaster.h"
#define DS1307 0x68
#define LED_AN PORTD = (1<<PD0)
#define LED_AUS PORTD = (0<<PD0)
#define WAVE (PINC & (1<<PC3))
int main (void)
{
DDRD = (1<<PD0); // PD0 als Ausgang
DDRC = ~(1<<PC3); // PC3 als Eingang
i2c_init(); // I2C initialisieren
i2c_start_wait(DS1307+I2C_WRITE); // I2CAdresse+Schreiben
i2c_write(0x00); // Adresse
i2c_write(0x00); // Wert (hier zum CH-Bit löschen)
i2c_stop(); // Stop
i2c_start_wait(DS1307+I2C_WRITE); // I2CAdresse+Schreiben
i2c_write(0x07); // Adresse
i2c_write(0b10010000); // Wert (hier um SQW auf 1MHz zu stellen)
i2c_stop(); // Stop
while (1)
{
if (WAVE)
{
LED_AN;
}
else
{
LED_AUS;
}
}
}
return 0;
}
Leider kommt der µC nicht über das erste i2c_start_wait hinweg (getestet indem ich LED_AN; zwischen die Befehle geschoben hab).
Könnte von euch mal jemand mit den Zaunpfahl winken?
*müllrausbring*
Lesezeichen