Witam chciałem się pobawić rtc tzn PCF8583P przepisałem z ksiażki Dolińskiego program i co
na wyświetlaczu sekundy idą dobrze ale zamiast godzin i minut jest takie coś np"3?:??:12" jaka jest przyczyna takiego zachowania? Podaje niżej kod
#include <progmem.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <avr/io.h>
#include <stdlib.h>
#include <util/delay.h>
#define F_CPU 8000000UL
#include "lcd.c"
typedef struct _bit_struct
{
unsigned char bit0: 1;
unsigned char bit1: 1;
unsigned char bit2: 1;
unsigned char bit3: 1;
unsigned char bit4: 1;
unsigned char bit5: 1;
unsigned char bit6: 1;
unsigned char bit7: 1;
}pole_bitowe;
#define DAJ_BIT(adr) (*((volatile pole_bitowe*) (adr)))
#define _PORTD 0x32
#define _DDRD 0x31
#define _PIND 0x30
#define sda_we DAJ_BIT(_PIND).bit5
#define sda_wy DAJ_BIT(_DDRD).bit5
#define scl_we DAJ_BIT(_PIND).bit6
#define scl_wy DAJ_BIT(_DDRD).bit6
#define sw4 DAJ_BIT(_PIND).bit1
#define sw1 DAJ_BIT(_PIND).bit0
#define stan_0 1
#define stan_1 0
#define rtc 0xa0
char buflcd[4];
char *pbuflcd;
unsigned char bufI2C[9];
unsigned char *pbufI2C;
unsigned char godz=0,min=0,sek=0,dzien=1,mies=1;
unsigned char fzegar;
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>i2c<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
void czekaj_I2C(unsigned char tauI2C)
{
do
{
asm("nop");
}
while(--tauI2C!=0);
}
void bitstartu(void)
{
sda_wy=stan_1;
czekaj_I2C(10);
scl_wy=stan_1;
czekaj_I2C(10);
sda_wy=stan_0;
czekaj_I2C(10);
scl_wy=stan_0;
czekaj_I2C(10);
}
void bitstopu(void)
{
sda_wy=stan_0;
czekaj_I2C(10);
scl_wy=stan_1;
czekaj_I2C(10);
sda_wy=stan_1;
czekaj_I2C(10);
}
unsigned char zapiszB_I2C(unsigned char dana)
{
unsigned char i;
for(i=0;i<8;i++)
{
if(dana&0x80)
{
sda_wy=stan_1;
}
else
{
sda_wy=stan_0;
}
czekaj_I2C(10);
scl_wy=stan_1;
czekaj_I2C(10);
scl_wy=stan_0;
czekaj_I2C(10);
dana<<=1;
}
sda_wy=stan_1;
czekaj_I2C(10);
scl_wy=stan_1;
while(!scl_we);
czekaj_I2C(10);
i=sda_we;
scl_wy=stan_0;
czekaj_I2C(10);
return i;
}
unsigned char czytajB_I2C(unsigned char ack)
{
unsigned char dana=0,i;
for(i=0;i<8;i++)
{
scl_wy=stan_0;
czekaj_I2C(10);
scl_wy=stan_1;
czekaj_I2C(10);
dana<<=1;
dana|=sda_we==1?1:0;
}
scl_wy=stan_0;
if(ack)
{
sda_wy=stan_0;
}
else
{
sda_wy=stan_1;
}
czekaj_I2C(10);
scl_wy=stan_1;
while(!scl_we);
czekaj_I2C(10);
sda_wy=stan_1;
scl_wy=stan_0;
return dana;
}
void BladI2C(void)
{
lcd_xy(0,0);
write_text("Blad I2C");
_delay_ms(1000);
lcd_xy(0,0);
write_text(" ");
}
void doI2C(unsigned char adrI2C, unsigned char adrdane, unsigned char lz)
{
pbufI2C=&bufI2C;
bitstartu();
if(zapiszB_I2C(adrI2C))
{
BladI2C();
}
if(zapiszB_I2C(adrdane))
{
BladI2C();
}
for(;lz!=0;lz--)
{
if(zapiszB_I2C(*pbufI2C++))
{
BladI2C();
}
}
bitstopu();
}
void odI2C(unsigned char adrI2C, unsigned char adrdane, unsigned char lz)
{
bitstartu();
if(zapiszB_I2C(adrI2C))
{
BladI2C();
}
if(zapiszB_I2C(adrdane))
{
BladI2C();
}
bitstartu();
if(zapiszB_I2C(adrI2C+1))
{
BladI2C();
}
pbufI2C=&bufI2C;
for(;lz>1;lz--)
{
*pbufI2C++=czytajB_I2C(1);
}
*pbufI2C++=czytajB_I2C(0);
bitstopu();
}
SIGNAL(SIG_INTERRUPT0)
{
odI2C(rtc,0x02,3);
fzegar=1;
}
void wyswietlczas(void)
{
unsigned char zp;
lcd_xy(0,0);
pbufI2C=&bufI2C[2];
zp=*pbufI2C--;
nalcd((zp&0x30)>>4,zp);
write_text(":");
zp=*pbufI2C--;
nalcd((zp&0xf0)>>4,zp);
write_text(":");
zp=*pbufI2C;
nalcd((zp&0xf0)>>4,zp);
}
void zwolnijklaw(void)
{
_delay_ms(200);
while((PIND&0x03)==0x03);
}
void ustawzegar(void)
{
{
cli();
write_command(0x0d);
odI2C(rtc,0x02,3);
wyswietlczas();
pbufI2C=&bufI2C[1];
bufI2C[0]=0;
min=*pbufI2C++;
godz=*pbufI2C;
lcd_xy(1,1);
zwolnijklaw();
while(sw4)
{
godz++;
if((godz&0x0f)>9)
{
godz+=0x06;
}
if((godz&0x3F)>0x23)
{
godz&=0xc0;
}
bufI2C[2]=(bufI2C[2]&0xc0)|godz;
wyswietlczas();
_delay_ms(150);
}
}
lcd_xy(1,4);
zwolnijklaw();
while(sw4)
{
lcd_xy(1,4);
if(!sw1)
{
min++;
if((min&0x0f)>9)
{
min+=0x06;
}
if(min>0x59)
{
min=0;
}
bufI2C[1]=min;
wyswietlczas();
_delay_ms(150);
}
}
write_command(0x0c);
lcd_xy(1,8);
write_text("STARTn/t");
zwolnijklaw();
while(sw1&sw4);
if(!sw4)
{
doI2C(rtc,2,3);
bufI2C[0]=0;
doI2C(rtc,0,1);
lcd_clr();
write_text("zapisuje");
_delay_ms(500);
}
sei();
}
int main (void)//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
{
lcd_init();
lcd_clr();
unsigned char i, zp, fzerag;
DDRB=0xff;
PORTB|=0x02;
DDRD=0x00;
PORTD=0x07;
scl_wy=stan_0;
fzerag=0;
GICR = _BV(INT0);//|_BV(INT1); //GIMSK
//włącz obsługę przerwań Int0 i Int1
MCUCR = _BV(ISC01);//|_BV(ISC11);
// włącz generowanie przerwań przez
// opadające zbocze na Int0 i Int1
write_text("rtc");
sei();
while(1)
{
if(fzegar)
{
fzegar=0;
lcd_xy(1,0);
wyswietlczas();
_delay_ms(100);
}
if(!sw4)
{
_delay_ms(150);
lcd_xy(0,0);
write_text("ustaw zegar");
_delay_ms(500);
lcd_clr();
ustawzegar();
lcd_clr();
write_text("rtc pcf");
_delay_ms(500);
}
}
}