logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

I2C, transmisja, zegar czasu rzeczywistego pcf8583.

wartal10 29 Gru 2009 19:32 2533 6
REKLAMA
  • #1 7454283
    wartal10
    Poziom 10  
    
    
    #include <avr/io.h>
    #include <avr/signal.h>
    #include <util/delay.h>
    #include <LCD.h>// wyswietlacz dział bez zarzutu
    
    
    //******************** Definicja stałych **********************
    #define F_CPU 16000000
    
    //adres ukladu PCF8583P
    #define Adres_W 0xa0
    #define Adres_R 0xa1
    
    unsigned char sekunda;
    
    //******************** Funkcje ********************************
    
    void I2C_Start()
    {
    TWCR=(1<<TWEN)|(1<<TWINT)|(1<<TWSTA);
    while(!(TWCR)&(1<<TWINT));
    }
    
    
    
    void I2C_Stop()
    {
    TWCR=(1<<TWEN)|(1<<TWINT)|(1<<TWSTO);
    }
    
    
    
    void I2C_Z(unsigned char dane)
    {
    TWDR=dane;
    TWCR=(1<<TWINT)|(TWEN);
    while(!(TWCR)&(1<<TWINT));
    }
    
    
    unsigned char I2C_C(unsigned char koniec)
    {
    TWCR=(koniec<<TWEA)|(1<<TWINT)|(1<<TWEN);
    while(!(TWCR&(1<<TWINT)));
    
    return TWDR;
    }
    
    
    void I2C_Config()
    {
    TWBR=18;
    }
    
    
    //odczyt od podanego adresu
    unsigned char I2C_Odczyt_Adres(unsigned char adres_slowa)
    {
    unsigned char dana;
    
    //start
    I2C_Start();
    //adres slave odczyt RW=0
    I2C_Z(Adres_W);
    
    //adres slowa
    I2C_Z(adres_slowa);
    
    //start
    I2C_Start();
    
    //adres slave odczyt RW=1
    I2C_Z(Adres_R);
    // funkcja odbioru danych kolejnych inkrementowanych autoamtycznie
    
    dana=I2C_C(0);
    
    //stop
    I2C_Stop();
    
    return dana;
    
    
    }
    
    //odczyt od bierzacego odresu
    unsigned char I2C_Odczyt_AdresB()
    {
    //start
    I2C_Start();
    
    //adres slave odczyt RW=1
    I2C_Z(Adres_R);
    // funkcja odbioru danych kolejnych inkrementowanych autoamtycznie
    
    
    //stop
    I2C_Stop();
    
    
    }
    
    void I2C_ZapisB(unsigned char adres_slowa,unsigned char dane)
    {
    //start
    I2C_Start();
    
    //adres slave odczyt RW=0
    I2C_Z(Adres_W);
    
    //adres slowa
    I2C_Z(adres_slowa);
    
    I2C_Z(dane);
    
    //stop
    I2C_Stop();
    
    }
    
    
    
    
    void main(void)
    {
    
    PORTC=0xff;
    DDRC=0x00;
    PORTD|=_BV(2);
    
    DDRB=0xff;
    Config_LCD();
    I2C_Config();
    
    instrukcja_LCD(0x0c);
    I2C_ZapisB(0,0b00000100);
    
    while(1)
    {
    
    xy_LCD(0,1);
    liczba_LCD(sekunda);
    
    // _delay_ms(20);
    sekunda=I2C_Odczyt_Adres(2);
    
    
    
    
    
    }
    }
    

    Ia takie małe pytanko ? Czy ten kod jest zły czy moj układ. I jeszcze jedno pytanie jak sie startuje ten zegar czasu rzeczywistego pcf8583. Czy ustwienie 4 bitu w zerowym rejestrze jest jednoznaczne z uruchomieniem tiomera. Pozdrawaim i czekam na pomoc ?
  • REKLAMA
  • REKLAMA
  • #3 7455533
    wartal10
    Poziom 10  
    gothye napisał:
    w I2C_config dorzuć :


    po za tym napisz z jakim układem na i2c komunikujesz się ? lub starasza ...



    uklad :pcf8583 (RTC)

    a i atmega 32 zegar 16Mhz
  • #4 7455694
    gothye
    Poziom 33  
    więc adres jego to 160 (zakładając ze A0 podłączone do masy) a nie 2 jak u Ciebie w kodzie ;)
  • REKLAMA
  • #5 7455855
    wartal10
    Poziom 10  
    gothye napisał:
    więc adres jego to 160 (zakładając ze A0 podłączone do masy) a nie 2 jak u Ciebie w kodzie ;)



    A0 podłaczone do masy ale w kodzie mam

    
    #define Adres_W 0xa0  //160
    #define Adres_R 0xa1  //161
    



    " a nie 2 jak u ciebei w kodzie " gdzie ja mam w kodzie to 2
  • REKLAMA
  • Pomocny post
    #6 7457141
    gothye
    Poziom 33  
    Przepraszam moje nie dopatrzenie ,
    co do Twojego kodu ,wkleje swoj do obsługi TWi działający ponieważ widzę pewne róznice w kodach :

    void TWI_INIT(void)
    {
    	TWSR = 0;                         		/* no prescaler */ 
        TWBR = ((16000000/F_TWI)-16)/2;  		/* must be > 10 for stable operation */
    }
    
    // procedura transmisji sygnału START
    void twistart(void)
    {
    	TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
    	while (!(TWCR & (1<<TWINT)));
    }
    
    // procedura transmisji sygnału STOP
    void twistop(void)
    {
    	TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
    	while ((TWCR & (1<<TWSTO)));
    }
    
    // procedura transmisji bajtu danych
    void twiwrite(char data)
    {
    	TWDR = data;
    	TWCR = (1<<TWINT) | (1<<TWEN);
    	while (!(TWCR & (1<<TWINT)));
    }
    
    //procedura odczytu bajtu danych
    char twiread(char ack)
    {
    	TWCR = ack
    	? ((1 << TWINT) | (1 << TWEN) | (1 << TWEA))
    	: ((1 << TWINT) | (1 << TWEN)) ;
    	
    	while (!(TWCR & (1<<TWINT)));
    		return TWDR;
    }
  • #7 7457359
    wartal10
    Poziom 10  
    kOLEGO DZIĘKI ............znalzlem bład patrz i sie smiej i nie tylko Ty :

    
    void I2C_Z(unsigned char dane)
    {
    TWDR=dane;
    TWCR=(1<<TWINT)|(TWEN);  bład tutaj powinno byc (1<<TWEN)
    while(!(TWCR)&(1<<TWINT));
    } 
    
    


    god save the queen
REKLAMA