Witam
Mam problem z uruchomieniem I2C na atmega8. To znaczy program zawiesza się po wysłaniu pierwszej komendy na magistralę. Program się kompiluje ale nie działa w Proteusu
main:
TWI.c
TWI.h
Bardzo proszę o pomoc
Mam problem z uruchomieniem I2C na atmega8. To znaczy program zawiesza się po wysłaniu pierwszej komendy na magistralę. Program się kompiluje ale nie działa w Proteusu
main:
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
#include "TWI.h"
void MCP(unsigned char devAddr, unsigned char regAddr, unsigned char regVal)
{
twistart();
twiwrite(0x40 | (devAddr << 1));
twiwrite(regAddr);
twiwrite(regVal);
twistop();
}
int main (void)
{
MCP(0x01,0x06,0x0f);
_delay_ms(3);
MCP(0x00,0x00,0x00);
MCP(0x00,0x06,0x0f);
MCP(0x00,0x09,0xff);
}TWI.c
#include "TWI.h"
// 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;
}TWI.h
#include <avr/io.h>
#define ACK 1
#define NOACK 0
// procedura transmisji sygnału START
void twistart(void);
// procedura transmisji sygnału STOP
void twistop(void);
// procedura transmisji bajtu danych
void twiwrite(char data);
//procedura odczytu bajtu danych
char twiread(char ack);Bardzo proszę o pomoc