Skocz do zawartości

TWI w BASCOM programował kto na poziomie sprzętu ?


Pomocna odpowiedź

Napisano

Od jakiegoś czasu próbuję oprogramować procesor ATMega 48/168, aby działał jako Slave na I2C, ale zależy mi na wykorzystaniu sprzętowego TWI. Procesor będzie taktowany 2 i 4MHz, w zależności od tego jak się go ustawi, ale to akurat nie jest problem.

Problem w tym ze I2C chce obsługiwać na przerwaniach od TWI.

Ma może ktoś linki do polskich opisów I2C, mogą być na 8051, bo chodzi o to aby był opis kodów statusu. Ewentualnie czy ktoś już pisał procedury na sprzętowy TWI ?

W załączniku masz PDFa po polsku z opisem I2C. Kody są w C ale są obszerne komentarze, więc powinieneś się połapać (są wypisane kody statusu).

i2c.pdf

  • Lubię! 1

Dzięki pewnie się z tego wyznam, C miałem w szkole na PC, więc zakumam o co w kodzie chodzi. Ja znalazłem notę ATMELA 2565, też tam jest jakiś algorytm opisany.

EDIT.

A takie jeszcze małe pytanie po takim szybkim przeglądzie kodu w C.

Jak interpretować takie jak mniemam stale w kodzie:

if ( (twst != TW_START) && (twst != TW_REP_START)) return 1;

TW_start to będzie odpowiednik > "A START condition has been trasmited" czyli kod 0x08

a

TW_rep_start to będzie >"A repeated START condition has been transmitted" czyli kod 0x10

❓

I jeszcze takie pytanie do tego fragmentu, bo nie wiem czy dobrze pamiętam C.

twst = TW_STATUS & 0xF8;
if( twst != TW_MT_DATA_ACK)
break;
case 0xB8:

Jeżeli TWST różne od TW_MT_DATA_ACK to powrót (break), a w przeciwnym wypadku testuj następną wartość, tj. tutaj 0xB8 ?

Stałe są zdefiniowane w pliku twi.h który jest dodawany do WinAVR.

/* Master */
/** \ingroup util_twi
   \def TW
   stop or repeated start condition received while selected */
#define TW_SR_STOP		0xA0

/* Misc */
/** \ingroup util_twi
   \def TW_NO_INFO
   no state information available */
#define TW_NO_INFO		0xF8

/** \ingroup util_twi
   \def TW_BUS_ERROR
   illegal start or stop condition */
#define TW_BUS_ERROR		0x00
Jeżeli TWST różne od TW_MT_DATA_ACK to powrót (break), a w przeciwnym wypadku testuj następną wartość, tj. tutaj 0xB8 ?

O ile ja dobrze rozumiem ten kod to jest tak jak napisałeś. Jeśli warunek jest spełniony to wykonana zostanie instrukcja break, czyli zakończenie case, a jeśli warunek nie zostanie spełniony to wykona się następny case

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...