K
kaze
Guest
Beste allemaal, Ik heb een probleem.Ik wil interface ATMEGA8535 met cmps03 behulp I2C.Ik heb de interface ATMEGA8535 met DS1624 voor en het werkt goed, maar toen ik interface met cmps03, het probleem dat ik heb is dat ik de gegevens doorgegeven aan de haven altijd veranderen als ik mijn AVR, zogenaamd de gegevens is statisch (don ' niet veranderen) want ik heb geen invloed op de kompas richting wijst manier.
Hier is mijn broncode (met gebruik van ICC-AVR):
#
include <iom8535v.h>
#
include <macros.h>
/ / functie op initiële AVR haven
void init_port (void)
(
PORTA = 0x00;
DDRA = 0xFF;
PORTB = 0x00;
DDRB = 0xFF;
PORTC = 0x00;
DDRC = 0xFF;
PORTD = 0xFF;
DDRD = 0xFF;
)
/ / functie op initiële TWI
void init_TWI (void)
(
TWCR = 0x00; / / uitschakelen TWI
TWBR = 0x0c / / bitsnelheid = 12 | om de SCL kloksnelheid
TWSR = 0x00; / / prescaler = 1 | 100 KHz
TWAR = 0xAA; / / toewijzen AAH voor AVR te worden slave-modus
TWCR = 0x04; / /
enable TWI
)
/ / functie op initiële AVR
void aanvankelijke (void)
(
CLI (); / / uitschakelen ext onderbreken
MCUCR = 0x00; / / slaapstand uit & interrupt-modus uitschakelen
init_port (); / / initiliaze AVR Havens
init_TWI (); / / Initialiseer TWI
SEI (); / /
enable interrupt ext
)
/ / functie om uitstel voor een korte tijd
void vertraging (int dly)
(
int str;
voor (str = 0; str <= dly; str );
)
/ / functie om te wachten op TWI_Int
void Wait_TWI_int (void)
(
while (! (TWCR & (1 <<TWINT)))
;
)
/ / functie voor het verzenden van start voorwaarde
void start (void)
(
vertraging (15);
TWCR = ((1 <<TWSTA) (1 <<twintig) (1 <<TWINT));
Wait_TWI_int ();
)
/ / functie voor het verzenden en ontvangen van gegevens byte ACK
void send (unsigned char data)
(
vertraging (5);
Wait_TWI_int ();
TWDR = gegevens;
TWCR = ((1 <<twintig) (1 <<TWINT));
Wait_TWI_int ();
)
/ / functie om gegevens byte en stuur ACK
unsigned char receive1 (void)
(
unsigned char gegevens;
vertraging (5);
Wait_TWI_int ();
TWCR = ((1 <<TWINT) (1 <<TWEA) (1 <<twintig));
Wait_TWI_int ();
return data = TWDR;
)
/ / functie om gegevens byte en stuur NACK
unsigned char receive2 (void)
(
unsigned char gegevens;
vertraging (5);
Wait_TWI_int ();
TWCR = ((1 <<TWINT) (1 <<twintig));
Wait_TWI_int ();
return data = TWDR;
)
/ / functie te sturen stoppen voorwaarde
void stop (void)
(
vertraging (5);
TWCR = ((1 <<twintig) (1 <<TWSTO) (1 <<TWINT));
)
/ /
main functie die termijn bij het programma van start
void main (void)
(
unsigned char lezen, schrijven, gegevens;
int vlag;
lees = 0xC1;
schrijven = 0xC0;
flag = 1;
oorspronkelijke ();
while (1)
(
vertraging (5000) / / vertraging te maken kompas klaar
data = 0xFF; / / oorspronkelijke gegevens
/ / om de richting van de CMPS03
doen
(
vertraging (1000) / / vertraging voordat I2C start
start (); / / verzenden starten
send (schrijven), / / stuurt adres schrijven
send (waarde 0x01); / / stuurt commando krijgen richting 1 byte
start (); / / herhaalde start
sturen (lees); / / verzenden adres lezen
data = receive1 (); / /
Verkrijg de eerste byte ack
PORTB = gegevens; / / stuurt de gegevens byte te PORTB
stop (); / / verzenden stoppen
if (data! = 0xFF) flag = 0;
anders
(
vertraging (5000);
flag = 1;
)
) while (flag == 1);
while (flag == 0); / / looping eeuwig te maken stationair
)
)Heb ik wat fout in mijn broncode of heeft een andere fout Ik wist niet op de hardware? Is er een simulatie programma voor foutopsporing mijn code?
Bedankt voor uw hulp
Met vriendelijke groetKaze
Hier is mijn broncode (met gebruik van ICC-AVR):
#
include <iom8535v.h>
#
include <macros.h>
/ / functie op initiële AVR haven
void init_port (void)
(
PORTA = 0x00;
DDRA = 0xFF;
PORTB = 0x00;
DDRB = 0xFF;
PORTC = 0x00;
DDRC = 0xFF;
PORTD = 0xFF;
DDRD = 0xFF;
)
/ / functie op initiële TWI
void init_TWI (void)
(
TWCR = 0x00; / / uitschakelen TWI
TWBR = 0x0c / / bitsnelheid = 12 | om de SCL kloksnelheid
TWSR = 0x00; / / prescaler = 1 | 100 KHz
TWAR = 0xAA; / / toewijzen AAH voor AVR te worden slave-modus
TWCR = 0x04; / /
enable TWI
)
/ / functie op initiële AVR
void aanvankelijke (void)
(
CLI (); / / uitschakelen ext onderbreken
MCUCR = 0x00; / / slaapstand uit & interrupt-modus uitschakelen
init_port (); / / initiliaze AVR Havens
init_TWI (); / / Initialiseer TWI
SEI (); / /
enable interrupt ext
)
/ / functie om uitstel voor een korte tijd
void vertraging (int dly)
(
int str;
voor (str = 0; str <= dly; str );
)
/ / functie om te wachten op TWI_Int
void Wait_TWI_int (void)
(
while (! (TWCR & (1 <<TWINT)))
;
)
/ / functie voor het verzenden van start voorwaarde
void start (void)
(
vertraging (15);
TWCR = ((1 <<TWSTA) (1 <<twintig) (1 <<TWINT));
Wait_TWI_int ();
)
/ / functie voor het verzenden en ontvangen van gegevens byte ACK
void send (unsigned char data)
(
vertraging (5);
Wait_TWI_int ();
TWDR = gegevens;
TWCR = ((1 <<twintig) (1 <<TWINT));
Wait_TWI_int ();
)
/ / functie om gegevens byte en stuur ACK
unsigned char receive1 (void)
(
unsigned char gegevens;
vertraging (5);
Wait_TWI_int ();
TWCR = ((1 <<TWINT) (1 <<TWEA) (1 <<twintig));
Wait_TWI_int ();
return data = TWDR;
)
/ / functie om gegevens byte en stuur NACK
unsigned char receive2 (void)
(
unsigned char gegevens;
vertraging (5);
Wait_TWI_int ();
TWCR = ((1 <<TWINT) (1 <<twintig));
Wait_TWI_int ();
return data = TWDR;
)
/ / functie te sturen stoppen voorwaarde
void stop (void)
(
vertraging (5);
TWCR = ((1 <<twintig) (1 <<TWSTO) (1 <<TWINT));
)
/ /
main functie die termijn bij het programma van start
void main (void)
(
unsigned char lezen, schrijven, gegevens;
int vlag;
lees = 0xC1;
schrijven = 0xC0;
flag = 1;
oorspronkelijke ();
while (1)
(
vertraging (5000) / / vertraging te maken kompas klaar
data = 0xFF; / / oorspronkelijke gegevens
/ / om de richting van de CMPS03
doen
(
vertraging (1000) / / vertraging voordat I2C start
start (); / / verzenden starten
send (schrijven), / / stuurt adres schrijven
send (waarde 0x01); / / stuurt commando krijgen richting 1 byte
start (); / / herhaalde start
sturen (lees); / / verzenden adres lezen
data = receive1 (); / /
Verkrijg de eerste byte ack
PORTB = gegevens; / / stuurt de gegevens byte te PORTB
stop (); / / verzenden stoppen
if (data! = 0xFF) flag = 0;
anders
(
vertraging (5000);
flag = 1;
)
) while (flag == 1);
while (flag == 0); / / looping eeuwig te maken stationair
)
)Heb ik wat fout in mijn broncode of heeft een andere fout Ik wist niet op de hardware? Is er een simulatie programma voor foutopsporing mijn code?
Bedankt voor uw hulp
Met vriendelijke groetKaze