Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 12 gru 2024, o 15:04


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 3 ] 
Autor Wiadomość
PostNapisane: 20 lis 2012, o 18:46 
Offline
Użytkownik

Dołączył(a): 15 lis 2012
Posty: 31
Pomógł: 0

muszę zrealizować następujące działanie: odczyt z pamięci EEPROM około 512kb danych i transfer tych danych przez UART do komputera. Teraz pytanie jak to najlepiej zrobić?
Moja koncepcja była taka:
w pętli while() uruchamiam transmisję danych z EEPROMU z pollingiem i włączam przerwanie UARTA data register empty. W obsłudze przerwania przesyłam ostatnią daną (ogon) z bufora cyklicznego, gdy koniec bufora jest równy jego początkowi to kasuję przerwanie i nic nie wysyłam.
Mam jednak kilka wątpliwości odnośnie transmisji przez TWI: chcę tę transmisję uruchomić raz i odczytać od razu całe 512kb pamięci, to znaczy wysyłam sygnał startu z żądaniem pisania do slave, wysyłam adres w jego pamięci i wysyłam powtórzony symbol startu z żądaniem czytania ze slave'a. W związku z tym, czy z transmisją przez TWI nie będzie żadnych problemów wskutek "przerw" w transmisji? Przerwa taka zaistnieje np. żeby obsłużyć przerwanie od UARTa czy żeby "zawinąć" bufor cykliczny (zrobić operację and początku (głowy) bufora z maską bufora). Czy po prostu powinienem tutaj tak dobrać prędkość transmisji przez TWI żebym zdążył wszystko obsłużyć zanim kolejna dana z pamięci zniszczy poprzednio odebraną daną.
Mam nadzieję, że stosunkowo jasno to opisałem :)

edit:
kawałek kodu dla lepszego zrozumienia problemu:
Kod:
void from_eep_mem_to_buf ( void )
{
   uint16_t i = 0;
   uint8_t tmp_head;
   
   TWI_start();
   TWI_write(0xA0);
   TWI_write(0);
   TWI_start();
   TWI_write(0xA0 + 1);
   
   for ( i = 0; i <= 65535; i++)
   {
      tmp_head = (Buf_Head) & CYCLIC_BUF_MASK;
      while (tmp_head == Buf_Tail) {}
      Cyclic_Buf [tmp_head] = TWI_read((i == 65535) ? NACK : ACK);
   }
}


i przerwanie:

Kod:
ISR ( USART_UDRE_vect )
{
   if ( Buf_Head != Buf_Tail )                        //check if indexes are different
   {
      Buf_Tail = ( Buf_Tail + 1 ) & CYCLIC_BUF_MASK;      //new index
      UDR = Cyclic_Buf [Buf_Tail];                  //transmit value from cyclic buffer
   }
   else UCSRB &= ~(1<<UDRIE);
}



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 lis 2012, o 19:34 
Offline
Użytkownik

Dołączył(a): 16 maja 2012
Posty: 349
Lokalizacja: Legnica
Zbananowany użytkownik

Pomógł: 23

A co będzie jak w środku transmisji trafi się dana == ogon?

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 lis 2012, o 20:37 
Offline
Użytkownik

Dołączył(a): 15 lis 2012
Posty: 31
Pomógł: 0

nie rozumiem Twojego pytania. "Ogon" to tylko oznaczenie końca bufora. Chodzi Ci o to, że wysyłanie będzie szybsze niż wpisywanie nowych danych do bufora? Wtedy zadziała to:
Kod:
else UCSRB &= ~(1<<UDRIE);
, czyli skasujemy zgłoszone przerwanie



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 3 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 4 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO