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

Atmega8515 program w C do sprawdzania obecnosci PCF8583

mxmxmxmxmx 12 Sie 2006 12:10 938 0
REKLAMA
  • #1 2908286
    mxmxmxmxmx
    Poziom 16  
    Posty: 318
    Pomógł: 8
    Ocena: 12
    Napisałem program, który ma tylko sprawdzic czy do magistrali i2c jest podłączony PCF8583:program wysyła adres 10100000 i sprawdza czy PCF odpowiada na 9 bicie. Jeżeli PCF wyzeruje linię SDA ma zaświecić sie dioda na porcie D0, jezeli nie na porcie D1. zawsze zapala sie D1. Kwarc: wewnętrzny 1MHz. funkcja wait10 ma dać ok 10uS opóźnienia. Na końcu nie ma funkcji i2cstop ale i tak PCF powinien odpowiedziec. co jest nie tak w tym programie?
    
    #include <avr\io.h>
    void waitms(unsigned long t)//ms
    {
     unsigned long t1;
     for(;t>0;t--)
     {
     for(t1=27;t1!=0;t1--);
     }
    }
    void wait10()
    {
    asm("nop");
    asm("nop");
    asm("nop");
    asm("nop");
    asm("nop");
    asm("nop");
    }
    
    int main(void)
    {
    DDRA = 0xff;
    DDRB = 0xff;
    DDRC = 0xff;
    DDRD = 0xff;
    PORTA = 0xff;
    PORTB = 0xff;
    PORTC = 0xff;
    PORTD = 0xff;
    waitms(100);
    //start i2c
    PORTB |= 1 << 6; //SDA wysoki(1)
    wait10();
    PORTB |= 1 << 7; //SCL wysoki(1)
    wait10();
    PORTB &= ~(1 << 6); //SDA niski(0)
    wait10();
    PORTB &= ~(1 << 7); //SCL niski(0)
    wait10();
    //start i2c
    
    //wysłanie adresu 10100000
    //wyslanie 1
    PORTB |= 1 << 6; //SDA wysoki(1)
    wait10();
    PORTB |= 1 << 7; //SCL wysoki(1)
    wait10();
    PORTB &= ~(1 << 7); //SCL niski(0)
    wait10();
    
    //wyslanie 0
    PORTB &= ~(1 << 6); //SDA niski(0)
    wait10();
    PORTB |= 1 << 7; //SCL wysoki(1)
    wait10();
    PORTB &= ~(1 << 7); //SCL niski(0)
    wait10();
    
    //wyslanie 1
    PORTB |= 1 << 6; //SDA wysoki(1)
    wait10();
    PORTB |= 1 << 7; //SCL wysoki(1)
    wait10();
    PORTB &= ~(1 << 7); //SCL niski(0)
    wait10();
    
    //wyslanie 0
    PORTB &= ~(1 << 6); //SDA niski(0)
    wait10();
    PORTB |= 1 << 7; //SCL wysoki(1)
    wait10();
    PORTB &= ~(1 << 7); //SCL niski(0)
    wait10();
    //////////////////////////////////////////////
    
    //wyslanie 0
    PORTB &= ~(1 << 6); //SDA niski(0)
    wait10();
    PORTB |= 1 << 7; //SCL wysoki(1)
    wait10();
    PORTB &= ~(1 << 7); //SCL niski(0)
    wait10();
    
    //wyslanie 0
    PORTB &= ~(1 << 6); //SDA niski(0)
    wait10();
    PORTB |= 1 << 7; //SCL wysoki(1)
    wait10();
    PORTB &= ~(1 << 7); //SCL niski(0)
    wait10();
    
    //wyslanie 0
    PORTB &= ~(1 << 6); //SDA niski(0)
    wait10();
    PORTB |= 1 << 7; //SCL wysoki(1)
    wait10();
    PORTB &= ~(1 << 7); //SCL niski(0)
    wait10();
    
    //wyslanie 0
    PORTB &= ~(1 << 6); //SDA niski(0)
    wait10();
    PORTB |= 1 << 7; //SCL wysoki(1)
    wait10();
    PORTB &= ~(1 << 7); //SCL niski(0)
    wait10();
    
    ////////////////////////////////////////////////
    
    PORTB |= 1 << 6; //SDA wysoki(1)zwolnienie dla slave'a
    wait10();
    PORTB |= 1 << 7; //SCL wysoki(1)
    wait10();
    if(bit_is_clear(PINB,PB6))	//czytaj clear(0)
    {
    PORTD &= ~(1 << 0);//jezeli jest odp zaswiec PD0
    }
    else
    {
    PORTD &= ~(1 << 1);//jezeli nie ma zaswiec PD1
    }
    
    PORTB &= ~(1 << 7); //SCL niski(0)
    wait10();
    
    for(;;)
    {
    }
    return 0;
    }
  • REKLAMA
REKLAMA