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.
Błędy:
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