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

Magistrala I2C, WinAvr, at90s2313, wywala błędy

Łuki Płonka 14 Lut 2010 00:19 2378 2
REKLAMA
  • #1 7691025
    Łuki Płonka
    Poziom 10  
    Mam WinAvr i at90s2319, jeśli próbuje skompilować program to wyrzuca mi błędy. Dziwnym zjawiskiem jest to, że jak wybiorę ATMega to błędów nie ma.
    Błędy są też na Tiny.
    Posługuję się biblioteką Fleurego.

    
    /*************************************************************************
    * Title:    I2C master library using hardware TWI interface
    * Author:   Peter Fleury <pfleury@gmx.ch>  http://jump.to/fleury
    * File:     $Id: twimaster.c,v 1.3 2005/07/02 11:14:21 Peter Exp $
    * Software: AVR-GCC 3.4.3 / avr-libc 1.2.3
    * Target:   any AVR device with hardware TWI 
    * Usage:    API compatible with I2C Software Library i2cmaster.h
    **************************************************************************/
    #include <inttypes.h>
    #include <avr/io.h>
    #include <util/twi.h>
    
    /* define CPU frequency in Mhz here if not defined in Makefile */
    #ifndef F_CPU
    #define F_CPU 4000000UL
    #endif
    #include <util/delay.h>
    /* I2C clock in Hz */
    #define SCL_CLOCK  100000L
    #define SDA     	6		// SDA Port D, Pin 4   
    #define SCL		5		// SCL Port D, Pin 5
    #define SDA_PORT        PORTD           // SDA Port D
    #define SCL_PORT        PORTD           // SCL Port D         
    
    
    
    void i2c_init(void)
    {
      /* initialize TWI clock: 100 kHz clock, TWPS = 0 => prescaler = 1 */
      
      TWSR = 0;                         /* no prescaler */
      TWBR = ((F_CPU/SCL_CLOCK)-16)/2;  /* must be > 10 for stable operation */
    
    }/* i2c_init */
    
    unsigned char i2c_start(unsigned char address)
    {
        uint8_t   twst;
    
    	// send START condition
    	TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
    
    	// wait until transmission completed
    	while(!(TWCR & (1<<TWINT)));
    
    	// check value of TWI Status Register. Mask prescaler bits.
    	twst = TW_STATUS & 0xF8;
    	if ( (twst != TW_START) && (twst != TW_REP_START)) return 1;
    
    	// send device address
    	TWDR = address;
    	TWCR = (1<<TWINT) | (1<<TWEN);
    
    	// wail until transmission completed and ACK/NACK has been received
    	while(!(TWCR & (1<<TWINT)));
    
    	// check value of TWI Status Register. Mask prescaler bits.
    	twst = TW_STATUS & 0xF8;
    	if ( (twst != TW_MT_SLA_ACK) && (twst != TW_MR_SLA_ACK) ) return 1;
    
    	return 0;
    
    }/* i2c_start */
    
    
    /*************************************************************************
     Issues a start condition and sends address and transfer direction.
     If device is busy, use ack polling to wait until device is ready
     
     Input:   address and transfer direction of I2C device
    *************************************************************************/
    void i2c_start_wait(unsigned char address)
    {
        uint8_t   twst;
    
    
        while ( 1 )
        {
    	    // send START condition
    	    TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
        
        	// wait until transmission completed
        	while(!(TWCR & (1<<TWINT)));
        
        	// check value of TWI Status Register. Mask prescaler bits.
        	twst = TW_STATUS & 0xF8;
        	if ( (twst != TW_START) && (twst != TW_REP_START)) continue;
        
        	// send device address
        	TWDR = address;
        	TWCR = (1<<TWINT) | (1<<TWEN);
        
        	// wail until transmission completed
        	while(!(TWCR & (1<<TWINT)));
        
        	// check value of TWI Status Register. Mask prescaler bits.
        	twst = TW_STATUS & 0xF8;
        	if ( (twst == TW_MT_SLA_NACK )||(twst ==TW_MR_DATA_NACK) ) 
        	{    	    
        	    /* device busy, send stop condition to terminate write operation */
    	        TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
    	        
    	        // wait until stop condition is executed and bus released
    	        while(TWCR & (1<<TWSTO));
    	        
        	    continue;
        	}
        	//if( twst != TW_MT_SLA_ACK) return 1;
        	break;
         }
    
    }/* i2c_start_wait */
    
    
    /*************************************************************************
     Issues a repeated start condition and sends address and transfer direction 
    
     Input:   address and transfer direction of I2C device
     
     Return:  0 device accessible
              1 failed to access device
    *************************************************************************/
    unsigned char i2c_rep_start(unsigned char address)
    {
        return i2c_start( address );
    
    }/* i2c_rep_start */
    
    
    /*************************************************************************
     Terminates the data transfer and releases the I2C bus
    *************************************************************************/
    void i2c_stop(void)
    {
        /* send stop condition */
    	TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
    	
    	// wait until stop condition is executed and bus released
    	while(TWCR & (1<<TWSTO));
    
    }/* i2c_stop */
    
    
    /*************************************************************************
      Send one byte to I2C device
      
      Input:    byte to be transfered
      Return:   0 write successful 
                1 write failed
    *************************************************************************/
    unsigned char i2c_write( unsigned char data )
    {	
        uint8_t   twst;
        
    	// send data to the previously addressed device
    	TWDR = data;
    	TWCR = (1<<TWINT) | (1<<TWEN);
    
    	// wait until transmission completed
    	while(!(TWCR & (1<<TWINT)));
    
    	// check value of TWI Status Register. Mask prescaler bits
    	twst = TW_STATUS & 0xF8;
    	if( twst != TW_MT_DATA_ACK) return 1;
    	return 0;
    
    }/* i2c_write */
    
    
    /*************************************************************************
     Read one byte from the I2C device, request more data from device 
     
     Return:  byte read from I2C device
    *************************************************************************/
    unsigned char i2c_readAck(void)
    {
    	TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWEA);
    	while(!(TWCR & (1<<TWINT)));    
    
        return TWDR;
    
    }/* i2c_readAck */
    
    
    /*************************************************************************
     Read one byte from the I2C device, read is followed by a stop condition 
     
     Return:  byte read from I2C device
    *************************************************************************/
    unsigned char i2c_readNak(void)
    {
    	TWCR = (1<<TWINT) | (1<<TWEN);
    	while(!(TWCR & (1<<TWINT)));
    	
        return TWDR;
    
    }/* i2c_readNak */
    
    void wyslij(unsigned char warta, unsigned char wartb)
    {
    PORTB = warta;
    i2c_init();
    i2c_start(0b11000000);
    i2c_write(warta);
    i2c_write(wartb);
    i2c_write(0b10001110);
    i2c_write(0b00000111);
    void i2c_stop(void);
    }
    
    int main(void)
    {
        DDRB = 0xFF;
    	DDRD = 0xFF;
    	PORTB = 0x02;
    	while(1)
       {
          PORTB = 0xaa;    /* 0xaa binarnie 1010 1010 */
          /* opóźnienie 0.33 sek. */
          _delay_ms(330); 
           PORTB = 0x55;    /* 0x55 binarnie 0101 0101 */
          /* opóźnienie 0.33 sek. */
          _delay_ms(330);
       }
    
    	return 0;
    }
    


    Błędy:
    
    new.c:33: error: `TWSR' undeclared (first use in this function)
    new.c:33: error: (Each undeclared identifier is reported only once
    new.c:33: error: for each function it appears in.)
    new.c:34: error: `TWBR' undeclared (first use in this function)
    new.c: In function `i2c_start':
    new.c:43: error: `TWCR' undeclared (first use in this function)
    new.c:43: error: `TWINT' undeclared (first use in this function)
    new.c:43: error: `TWSTA' undeclared (first use in this function)
    new.c:43: error: `TWEN' undeclared (first use in this function)
    new.c:49: error: `TWSR' undeclared (first use in this function)
    new.c:49: error: `TWS7' undeclared (first use in this function)
    new.c:49: error: `TWS6' undeclared (first use in this function)
    new.c:49: error: `TWS5' undeclared (first use in this function)
    new.c:49: error: `TWS4' undeclared (first use in this function)
    new.c:49: error: `TWS3' undeclared (first use in this function)
    new.c:53: error: `TWDR' undeclared (first use in this function)
    new.c: In function `i2c_start_wait':
    new.c:82: error: `TWCR' undeclared (first use in this function)
    new.c:82: error: `TWINT' undeclared (first use in this function)
    new.c:82: error: `TWSTA' undeclared (first use in this function)
    new.c:82: error: `TWEN' undeclared (first use in this function)
    new.c:88: error: `TWSR' undeclared (first use in this function)
    new.c:88: error: `TWS7' undeclared (first use in this function)
    new.c:88: error: `TWS6' undeclared (first use in this function)
    new.c:88: error: `TWS5' undeclared (first use in this function)
    new.c:88: error: `TWS4' undeclared (first use in this function)
    new.c:88: error: `TWS3' undeclared (first use in this function)
    new.c:92: error: `TWDR' undeclared (first use in this function)
    new.c:103: error: `TWSTO' undeclared (first use in this function)
    new.c: In function `i2c_stop':
    new.c:138: error: `TWCR' undeclared (first use in this function)
    new.c:138: error: `TWINT' undeclared (first use in this function)
    new.c:138: error: `TWEN' undeclared (first use in this function)
    new.c:138: error: `TWSTO' undeclared (first use in this function)
    new.c: In function `i2c_write':
    new.c:158: error: `TWDR' undeclared (first use in this function)
    new.c:159: error: `TWCR' undeclared (first use in this function)
    new.c:159: error: `TWINT' undeclared (first use in this function)
    new.c:159: error: `TWEN' undeclared (first use in this function)
    new.c:165: error: `TWSR' undeclared (first use in this function)
    new.c:165: error: `TWS7' undeclared (first use in this function)
    new.c:165: error: `TWS6' undeclared (first use in this function)
    new.c:165: error: `TWS5' undeclared (first use in this function)
    new.c:165: error: `TWS4' undeclared (first use in this function)
    new.c:165: error: `TWS3' undeclared (first use in this function)
    new.c: In function `i2c_readAck':
    new.c:179: error: `TWCR' undeclared (first use in this function)
    new.c:179: error: `TWINT' undeclared (first use in this function)
    new.c:179: error: `TWEN' undeclared (first use in this function)
    new.c:179: error: `TWEA' undeclared (first use in this function)
    new.c:182: error: `TWDR' undeclared (first use in this function)
    new.c: In function `i2c_readNak':
    new.c:194: error: `TWCR' undeclared (first use in this function)
    new.c:194: error: `TWINT' undeclared (first use in this function)
    new.c:194: error: `TWEN' undeclared (first use in this function)
    new.c:197: error: `TWDR' undeclared (first use in this function)
    new.c:286:2: warning: no newline at end of file
    make.exe: *** [new.o] Error 1
    
  • REKLAMA
  • #3 7691301
    Łuki Płonka
    Poziom 10  
    W bascomie łatwo można było zaprogramować obsługę I2C. A jak sprawa wygląda w WinAvr? Są jakieś biblioteki. czego mam szukać?

    Dodano po 50 [minuty]:

    Sprawa rozwiązana. Okazało się, że wystarczyło dopisać plik assemblera i2cmaster.S
    do makefile. Czyli jednak ta biblioteka umożliwia zaprogramowanie magistrali I2C.
    Temat zamykam.
REKLAMA