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

WinAVR C magistrala I2C. Gdzie w kodzie jest błąd?

28aug240 06 Lis 2006 23:47 1693 1
REKLAMA
  • #1 3196430
    28aug240
    Poziom 14  
    Posty: 158
    Pomógł: 3
    Ocena: 1
    Witam
    Mam procesor Atmega8535 i pamięć i2c PCF8582C (sprawna bo willem ją programuje i odczytuje)

    napisałem następujący program który ma za zadanie wpisać do 255 adresów pamięci pewną daną np 0xff i przedstawić zapis i potem odczyt tych danych na LCD
    LCD – działa jak powinien

    dana nie jest ani zapisywana ani nie da się odczytać zawartości pamięci.

    Może ktoś znajdzie błąd i mi pomoże bo męczę się z tym od 4 dni.


    
    // Plik i2c.c
    #define SDA 1
    #define SCL 0
    
    
    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"); 
    } 
    
    
    
    void i2c_start (void)
    {
    	DDRC |= 1 << SDA;	      
    	DDRC |= 1 << SCL;	
    	PORTC |= 1 << SDA;
    	PORTC |= 1 << SCL;
    	wait10();	
    						
    	PORTC &= ~1 << SDA;	
    	wait10();	
    	PORTC &= ~1 << SCL;	
    	wait10();			
    
    }
    
    void i2c_stop(void)
    {
    	DDRC |= 1 << SDA;			      
    	DDRC |= 1 << SCL;			
    	
    	PORTC &= ~1 << SDA;
    	wait10();
    	PORTC |= 1 << SCL;
    	wait10();
    	PORTC |= 1 << SDA;
    	wait10();
    
    }	
    
    
    unsigned char w_i2c (unsigned char dana)
    {
     	DDRC |= 1 << SDA;	      
    	DDRC |= 1 << SCL;
     unsigned char i;
     
     i=8;
    
     while(i)
     {
      --i;
      if (dana&0x80)
       {	
    	PORTC |= 1 << SDA;
       }
       else
       {
    	PORTC &= ~(1 << SDA);
       }
    
      wait10(); 
      PORTC |= 1 << SCL; 
      wait10(); 
      PORTC &= ~(1 << SCL);
      wait10(); 
      dana<<=1;
     }
    
     DDRC &= ~1 << SDA;
     wait10(); 
     PORTC |= 1 << SCL;
     wait10(); 
     i = (bit_is_set(PINC, PC1));
     PORTC |= 1 << SCL;
     wait10(); 
     DDRC |= 1 << SDA;
     return i;
    }
    
    
    unsigned char o_i2c (unsigned char potwierdzienie)
    {
    	
     	DDRC |= 1 << SDA;	      
    	DDRC |= 1 << SCL;
     unsigned char i, dana;
     dana = 0;
     i = 8;
     DDRC &= 1 << SDA;
    
     while(i)
     {
      --i;
      PORTC |= 1 << SCL;
      wait10(); 
      dana = dana | ((unsigned char) (bit_is_set(PINC, PC1)) << i );
      PORTC &= ~1 << SCL;
      wait10(); 
     }
    
    DDRC |= 1 << SDA;
    if (potwierdzienie==1)
     {
      PORTC |= 1 << SDA;
     }
     else
     {
      PORTC &= ~1 << SDA;
     }
    wait10(); 
    PORTC |= 1 << SCL;
    wait10(); 
    PORTC &= 1 << SCL;
    wait10(); 
    
    return dana;
    }
    



    
    #include "lcd4bit.c"
    #include "i2c.c"
    #include <avr/io.h>
    
    
    int main(void)
    {
    	int x, temp;
    	DDRB |= 1 << 0;
    	PORTB |= 1<< 0;
    	
    	lcd_int();
    	lcd_clr();
    	write_text("Zapis do pam.");
    
    	for (x=0;x<254;x++)
    	{
    		lowerline();
    		i2c_start();
    		w_i2c(0xa0);
    		w_i2c(x);
    
    		w_i2c(0xff);
    		i2c_stop();	
    		write_text("ADR ");	write_x_hex(x);write_text(" 0x00");
    		_delay_ms(20);
    	}
    	
    	lcd_clr();
    	write_text("Odczyt z pam.");
    	int dana=0;
    	for (x=0;x<254;x++)
    	{
    		lowerline();
    		i2c_start();
    		w_i2c(0xa0);
    		w_i2c(x);
    		i2c_start();
    		w_i2c(0xa1);
    		dana=o_i2c(1);
    		write_text("ADR ");write_x_hex(x);write_text(" = ");write_x_hex(dana);
    
    		i2c_stop();	
    		_delay_ms(20);
    	}
    
    	write_text("koniec");
    }
    



    Dzięki za pomoc.
  • REKLAMA
  • #2 3197974
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Przy takim zapisie nie może działać :(
    
    PORTC &= ~1 << SCL;
    

    Neguj całe wyrażenie "na wschód od =", a nie jedynkę :D
    Dotyczy większej ilości linii w Twoim kodzie :(

    Piotrek
REKLAMA