Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

RTC program z Dolińskiego problem

25 Sty 2009 00:22 1107 3
  • Poziom 15  
    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
    Code:


    #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);
    }
    }
    }

  • Poziom 15  
    po namyśle i przeanalizowaniu działania zegara wydaje mi się że to musi coś w tym fragmencie nie grać
    Code:

    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);
    }
  • Użytkownik usunął konto  
  • Poziom 15  
    mianowicie konwersja jest robiona następująco
    Code:

    void piszznak(char znak)
    {
    write_char(znak);
    }
    void nalcd(unsigned char zn1, unsigned char zn2)
    {
    piszznak(zn1+0x30);
    piszznak((zn2&0x0f)+0x30);
    }


    ale sekundy działają normalnie zamiast godzin jest 3? i ??