RTV forum PL | NewsGroups PL

I2C Slave na Atmega8: Jak skonfigurować przerwania i reagować na dane z Atmega16?

I2C slave na Atmega?

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - I2C Slave na Atmega8: Jak skonfigurować przerwania i reagować na dane z Atmega16?

nuclear
Guest

Mon Apr 02, 2007 4:31 pm   



Witam, łaczę sobie 2 procesorki (atmega 16 jako master i atmega8 slave) na
I2C. master ma dobrze zdefiniowane funkcje (dogaduje się z DS1307) .
próbuję uruchomić tego slave, wpisałem taki fragment kodu
TWAR = 0b00011000; (0x18)
TWBR = 0b00000000;
TWCR = 0b01000101;

i gdy w masterze wykonam taką kombinację:

twi_start();
twi_wr(0x18);
twi_stop();
to układ odpowiada ack, ale w tym momencie transmisja się psuje, i master
przestaje sie dogadywać z ds1307. rozumiem że slave trzymał bedize to ack w
nieskonczonosć.. czyli muszę w tym momencie ustawic odpowiedni rejestr (TWEA
w TWCR?) i wtedy master bedzie mogł wysyłać nastepne dane? tylko jak to
zrobić - przerwaniem? własnie ,jak w winavr nazywa się to przerwanie?
(wiem tylko ze int0 to jest
SIGNAL(SIG_INTERRUPT0)
{
kod...
}
)
a jaką składnie na TWI ?
i co, wtedy mam wziasc przychodzące dane z TWDR, po czym ustawić TWEA?
dobrze to rozumiem?

nuclear
Guest

Mon Apr 02, 2007 6:33 pm   



dobra, problem sie znmienił Wink
znalazłem w sieci taki kod:



SIGNAL (SIG_2WIRE_SERIAL)
{
Status_I2C = TWSR&0xFC;
switch(Status_I2C)
{
//TRANSMITTER
case 0xA8: //odebrano bit startu i bajt adresu do odczytu
n=0;
TWDR=Buf[n];
break;
case 0xB0: //odebrano bit startu i bajt adresu do odczytu
n=0;
TWDR=Buf[n];
break;
case 0xB8: //odebrano wyslanie znaku z ACK
n++;
TWDR=Buf[n];
break;
case 0xC0: //odebrano wyslanie znaku bez ACK
break;
case 0xC8: //odebrano wyslanie znaku bez ACK
break;
// RECEIVER:
case 0x60: //odebrano bit startu i bajt adresu do zapisu
m=0;
break;
case 0x80: // odebrano bajt
Buf2[m]=TWDR;
m++;
break;
case 0xA0: // odebrano bit STOP lub kolejny START
TWCR = TWCR & ~0x44;
TWDR=0;
TWCR = TWCR | 0x44;
m=0;
break;
default:
break;
}
TWCR = TWCR | 0x80;
}




oprócz tego przy właczaniu procka wykonywany jest kod:

TWBR=0x00;
TWAR=0x18;
TWCR=0x45;
TWSR=0x00;

i teraz wysyłając z mastera coś takiego

twi_start();
twi_wr(0x18);
twi_wr(0x55);
twi_wr(0x33);
twi_stop();

spodziewałem się wyniku
Buf2[0]=0x55;
Buf2[1]=0x33;

a tu lipa, oba maja wartość 0x00, jakkolwiek wydaje się ze transmisja
przebiegła poprawnie, master dostaje w odpowiedzi 3xACK, i działa sobie
dalej... gdzie tu coś przeoczyłem?

nuclear
Guest

Tue Apr 03, 2007 2:09 am   



dobra, problem się skurczył i to znacznie - gdzie robię błąd?
spraw wygląda tak - dane są odbierane poprawnie, jeszcze w obrębie funkcji
przerwania wartość jest zachowana, natomiast w funkcji głównej wartosc
zmiennej Buff1[n] jest równa 0. dlaczego? zmienna jest zdeklarowana na
początku, poza jakakolwiek funkcją... niby powinno działać...

Pawel K
Guest

Tue Apr 03, 2007 9:49 am   



nuclear napisał(a):
Quote:
dobra, problem się skurczył i to znacznie - gdzie robię błąd?
spraw wygląda tak - dane są odbierane poprawnie, jeszcze w obrębie funkcji
przerwania wartość jest zachowana, natomiast w funkcji głównej wartosc
zmiennej Buff1[n] jest równa 0. dlaczego? zmienna jest zdeklarowana na
początku, poza jakakolwiek funkcją... niby powinno działać...


Jak zadeklarowales Buff1[n] ?


pozdrawiam
Pawel K

BartekK
Guest

Tue Apr 03, 2007 12:41 pm   



nuclear napisał(a):
Quote:
dobra, problem się skurczył i to znacznie - gdzie robię błąd?
spraw wygląda tak - dane są odbierane poprawnie, jeszcze w obrębie funkcji
przerwania wartość jest zachowana, natomiast w funkcji głównej wartosc
zmiennej Buff1[n] jest równa 0. dlaczego? zmienna jest zdeklarowana na
początku, poza jakakolwiek funkcją... niby powinno działać...
Zdefiniuj ja jako volatile static char buff1[]


--
| Bartlomiej Kuzniewski
| sibi@drut.org GG:23319 tel +48 696455098 http://drut.org/
| http://www.allegro.pl/show_user_auctions.php?uid=338173

nuclear
Guest

Tue Apr 03, 2007 5:15 pm   



Quote:
Zdefiniuj ja jako volatile static char buff1[]
dzięki Wink pomogło


teraz jeszcze rozgryze czemu sie wiesza w trybie slave transmiter i bedzie
ok;D

nuclear
Guest

Tue Apr 03, 2007 5:42 pm   



Jest taka sprawa, ze obsługę slave-receiver juz mam w pełni sprawną
natomiast problem jest w slave-transmiter

czy dobrze rozumiem, patrząc na ponizszy kod, ze zeby przesłać dane ze salve
do master (slave ma adres 0x1A) wystarczy wysłać coś takiego z mastera:

twi_start();
twi_wr(0x1B);
datatrans[0]=twi_rd(1);
datatrans[1]=twi_rd(1);
twi_stop();

i w odpowiedzi dostanę to co akurat slave ma odpowiednio w Buf[0] i Buf[1] ?
myslałem ze tak to ma wygladać, ale coś przeoczyłem... tylko co? master się
wiesza w oczekiwaniu na dane... czyli slave nic nie wysyła chyba.. czemu?


Quote:

SIGNAL (SIG_2WIRE_SERIAL)
{
Status_I2C = TWSR&0xFC;
switch(Status_I2C)
{
//TRANSMITTER
case 0xA8: //odebrano bit startu i bajt adresu do odczytu
n=0;
TWDR=Buf[n];
break;
case 0xB0: //odebrano bit startu i bajt adresu do odczytu
n=0;
TWDR=Buf[n];
break;
case 0xB8: //odebrano wyslanie znaku z ACK
n++;
TWDR=Buf[n];
break;
case 0xC0: //odebrano wyslanie znaku bez ACK
break;
case 0xC8: //odebrano wyslanie znaku bez ACK
break;
// RECEIVER:
case 0x60: //odebrano bit startu i bajt adresu do zapisu
m=0;
break;
case 0x80: // odebrano bajt
Buf2[m]=TWDR;
m++;
break;
case 0xA0: // odebrano bit STOP lub kolejny START
TWCR = TWCR & ~0x44;
TWDR=0;
TWCR = TWCR | 0x44;
m=0;
break;
default:
break;
}
TWCR = TWCR | 0x80;
}




oprócz tego przy właczaniu procka wykonywany jest kod:

TWBR=0x00;
TWAR=0x18;
TWCR=0x45;
TWSR=0x00;

i teraz wysyłając z mastera coś takiego

twi_start();
twi_wr(0x18);
twi_wr(0x55);
twi_wr(0x33);
twi_stop();

spodziewałem się wyniku
Buf2[0]=0x55;
Buf2[1]=0x33;


elektroda NewsGroups Forum Index - Elektronika Polska - I2C Slave na Atmega8: Jak skonfigurować przerwania i reagować na dane z Atmega16?

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map