Hallo MagicWSmoke !
Im Posting 12 also genau vor Deiner Antwort ist ein Link zu dem Beispiel, das ich nutze und hier nochmals in wiederholter Form:
Nachtrag: Ich habe mir
dieses Beispiel als Vorlage genommen zum Test, ohne das Setzen der UHR (Auskommentiert) wollte nur sec,min,hr auswerten. Das RTC ist mit aktueller Zeit versorgt
Nur ist ein Unterschied, das bei mir der PortB.0 bei HR= 8 und MIN = 30 von HIGH zu LOW wechseln ...
also:
Code:
HR_D = BCD2DEC(hr); // Zeit von BCD Code in Dezimal umwandeln
MIN_D = BCD2DEC(min); // Zeit von BCD Code in Dezimal umwandeln
if ((HR_D == 0x08) && (MIN_D == 0x1E)) PORTB =0xFE
else PORTB = 0xFF;
if ((HR_D == 0x08) && (MIN_D == 0x1F)) PORTB =0xFD;
else PORTB = 0xFF;
Mein Code zur Auswertung mal angedeutet, ohne die aber vorhandenen(!!!) Funktionen BCD2DEC dargestellt, also da kann ich nix auswerten. Es sei denn ich initialisiere selber die Zeitvariablen mit dem entsprechenden wert, dann geht es.
Ich hoffe das reicht nun zur Erklärung...
Nachtrag: Um allem gerecht zu werden hier nun der komplette Code den ich verwende und der nicht geht, d.h. keine Auswertung an PortB0,PortB1 möglich...
Code:
/* ========================================================================== */
/* */
/* zeitauswertung DS1307 / ATMEGA16 an PortB Pin B0 + B1 */
/* */
/* ========================================================================== */
#define F_CPU 1600000UL
#include<avr/io.h>
#include<util/delay.h>
void rtc_init(void)
{
TWSR=0x00;
TWBR=0x98;
TWCR=0x04;
}
void rtc_start(void)
{
// sende START Bedingungen
TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
// warte bis fertig...
while(!(TWCR & (1<<TWINT)));
}
unsigned char rtc_read(void)
{
TWCR=(1<<TWINT)|(1<<TWEN);
while(!(TWCR & (1<<TWINT)));
return(TWDR);
}
void rtc_write(unsigned char data)
{
TWDR=data;// sending address
TWCR=(1<<TWINT)|(1<<TWEN);
// warte bis fertig...
while(!(TWCR & (1<<TWINT)));}
void rtc_stop()
{
TWCR=(1<<TWINT)|(TWSTO)|(1<<TWEN);
// warte bis fertig...
while(!(TWCR & (1<<TWINT)));
}
/* ========================================================================== */
/* */
/* DEZIMAL ZU BCD // Uhr Stellen */
/* */
/* ========================================================================== */
char dez_to_bcd(char num)
{
return ((num/10 * 16) + (num % 10));
}
/* ========================================================================== */
/* */
/* BCD zu DEZIMAL // UHR LESEN */
/* */
/* ========================================================================== */
char bcd_to_dez(char num)
{
return ((num/16 * 10) + (num % 16));
}
/* ========================================================================== */
/* */
/* */
/* */
/* ========================================================================== */
int main(void)
{
unsigned char sec,min,hr,HR_D,MIN_D;
DDRB=0xFF;
rtc_init();
_delay_ms(1000);
rtc_start();
/// Zeit zum Test auf 0,5 min vor Schaltvorgang setzen
rtc_write(0b11010000); // 1101000=adress of ds1307 and bit 0= write
rtc_write(0x00); // pointing address location 00 i.e seconds
rtc_write(0x1E);// set sec=30
rtc_write(0x1D);// set min=29
rtc_write(0x08);// set hr=8
rtc_stop();
while(1)
{
rtc_start();
rtc_write(0b11010001); // 1101000=adress of ds1307 and bit 1= read
rtc_write(0x00); // pointing address location 00 i.e seconds
sec=rtc_read();
rtc_stop();
_delay_ms(50); // etwas warten
rtc_start();
rtc_write(0b11010001); // 1101000=adress of ds1307 and bit 1= read
rtc_write(0x01); // pointing address location 01 i.e minute
min=rtc_read();
rtc_stop();
_delay_ms(50); // etwas warten
rtc_start();
rtc_write(0b11010001); // 1101000=adress of ds1307 and bit 1= read
rtc_write(0x02); // pointing address location 02 i.e hours
hr=rtc_read();
rtc_stop();
_delay_ms(50); // etwas warten
// Zeit decodieren und auswerten
HR_D = bcd_to_dez(hr); // Zeit von BCD Code in Dezimal umwandeln
MIN_D = bcd_to_dez(min); // Zeit von BCD Code in Dezimal umwandeln
if ((HR_D == 0x08) && (MIN_D == 0x1E)) PORTB =0xFE;
else PORTB = 0xFF;
if ((HR_D == 0x08) && (MIN_D == 0x1F)) PORTB =0xFD;
else PORTB = 0xFF;
}
}
Woher das Grundgerüst ist , findet man unter den oben erwähnten Link.
Gerhard
Lesezeichen