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



Teraz jest 7 kwi 2026, o 15:33


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 9 ] 
Autor Wiadomość
PostNapisane: 29 paź 2015, o 13:18 
Offline
Nowy

Dołączył(a): 05 cze 2014
Posty: 14
Pomógł: 0

Witam kolegów. Pisałem ostatnio kilka małych programików do obsługi różnych rzeczy w atmega8. I doszedłem do EEPROM. Tyle że nie chciałem wykorzystywać bibliteki avr/eeprom.h. Chcę wiedzieć jak to dokładnie działa. tak więc odpaliłem DataSheet. Poczytałem, napisałem program, można nawet powiedzieć że zerżnąłem z dokumentacji. Ku mojemu zdziwieniu program nie działa.

Kluczowe okazały się dwie linie:
EECR |= (1<<EEMWE);
EECR |= (1<<EEWE);

Dokładnie w takiej kolejności jedna pod drugą. W dokumentacji wyraźnie napisane iż po ustawieniu bitu EEMWE nie może minąć więcej niż 4 cykle zegara. Ale okazuje się że między tymi komendami mija więcej czasu i trzeba korzystać ze wstawek asm. I teraz mam pytanie co się dzieje i ile cykli zegara mija po ustawieniu bitu EEMWE do ustawienia EEWE? Bo po wykorzystaniu wstawki sbi zapis do eeprom działa bez problemowo.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 paź 2015, o 13:41 
Offline
Użytkownik

Dołączył(a): 20 wrz 2013
Posty: 647
Zbananowany użytkownik

Pomógł: 101

Nie powinno być problemu ze zmieszczeniem się w 4 cyklach nawet z poziomu C. Gdy ustawiany jest jeden bit to kompilator zwykle sam tłumaczy to na instrukcję SBI, co możesz sobie podejrzeć w pliku .lss. Pewnie jakieś przerwanie się wykonuje - zablokuj je na czas wykonania tych instrukcji.

_________________
+++++[>++++<-]>[>++++++<-]>.---------.+++.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 paź 2015, o 13:45 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1988
Lokalizacja: Lipsko
Pomógł: 125

A tak z czystej ciekawości - dlaczego nie chcesz korzystać z biblioteki i jej dobrodziejstw?

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 paź 2015, o 14:13 
Offline
Użytkownik

Dołączył(a): 20 wrz 2013
Posty: 647
Zbananowany użytkownik

Pomógł: 101

Bo
elradziu napisał(a):
Chcę wiedzieć jak to dokładnie działa.
? ;-)

Robiąc własną obsługę można zaimplementować takie fajne rzeczy jak obsługa na przerwaniach czy rozdzielenie zapisu od kasowania (w nowszych µC).

_________________
+++++[>++++<-]>[>++++++<-]>.---------.+++.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 paź 2015, o 14:31 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1988
Lokalizacja: Lipsko
Pomógł: 125

Hehe, też lubię znać pewne rzeczy od środka, ale z ręcznej obsługi EEPROMU się wyleczyłem jak poznałem możliwości w połączeniu ze strukturą. Nawet nie będę się rozpisywał ile mi to czasu zaoszczędziło i jakie przy tym zyskałem korzyści. Gdybym to chciał zrobić ręcznie lub w bascom'ie to bym... siadł i zapłakał :)
Oczywiście warto znać mechanizmy jakie towarzyszą przy zapisie/odczycie/kasowaniu EEPROM, ale powiedzmy sobie szczerze - to pamięć, która raczej nie nadaje się do ciągłej wymiany danych podczas pracy programu, a jedynie do zapamiętywania konkretnych danych/ustawień/itp. Jestem pewien, że zawsze jest możliwość zrealizowania operacji tak, aby się to nie pogryzło z przerwaniami czy innymi peryferiami.

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 paź 2015, o 17:16 
Offline
Nowy

Dołączył(a): 05 cze 2014
Posty: 14
Pomógł: 0

Przerwania są wyłączone, bo ten program miał tylko zapisywać co kolwiek pod określoną komórkę, w celu poznania zapisu do eeprom. Program zawierał funkcję int w której znajduje się tylko obsługa eeprom, a zaraz za tym pusta pętla nieskończona. :/

Może problem leży w tym że wszystko jest jako symulacja w programie PROTEUS, ale raczej nie powinno mieć to znaczenia bo wykorzystując makro SBI problemu nie ma. A wykorzystując bibliotekę eeprom.h także wszystko działa picuś glancuś.

Tak działa:
Kod:
#define sbi(port, bit) __asm__ __volatile__ ("sbi %0, %1" :: "I" (_SFR_IO_ADDR(port)), "I" (bit))
#define cbi(port, bit) __asm__ __volatile__ ("cbi %0, %1" :: "I" (_SFR_IO_ADDR(port)), "I" (bit))
int main()
 {
    DDRB = 0xff;
    PORTB = 0x00;
   while(EECR & (1<<EEWE))
      ;
   EEARH =0x00;
   EEARL = 0x01;
   EEDR = 0x22;
   sbi(EECR,EEMWE);
   sbi(EECR,EEWE);
   while(EECR & (1<<EEWE))
      ;
   PORTB = 0xff;

   
   // Write your code here
   while (1)
      ;
   return 0;
 }


A tak nie działa:
Kod:
int main()
 {
    DDRB = 0xff;
    PORTB = 0x00;
   while(EECR & (1<<EEWE))
      ;
   EEARH =0x00;
   EEARL = 0x01;
   EEDR = 0x22;
   EECR |= (1<<EEMWE);
   EECR |=(1<<EEWE);
   while(EECR & (1<<EEWE))
      ;
   PORTB = 0xff;

   
   // Write your code here
   while (1)
      ;
   return 0;
 }



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 paź 2015, o 18:58 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

Jak chcesz mieć pewność, że nic Ci nie rozdzieli komend (np. żadne przerwanie) to użyj polecenia ATOMIC_BLOCK.
Opis masz w http://www.atmel.com/webdoc/AVRLibcReferenceManual/group__util__atomic.html

--
Pozdrawiam,
Robert



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 paź 2015, o 19:23 
Offline
Moderator zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 18 lip 2012
Posty: 3230
Lokalizacja: Kraków - obok FAB5 ATMEL'a
Pomógł: 91

elradziu -> topic7402.html

_________________
http://www.jaglarz.info



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 lis 2015, o 17:41 
Offline
Nowy

Dołączył(a): 05 cze 2014
Posty: 14
Pomógł: 0

A więc po dłuższym czasie dorwałem się to mojego kiedyś własnoręcznie zrobionego pożal się boże zestawu avr:p I sprawdziłem zapis do eeprom na żywym organizmie bez symulacji. I okazuje się że obie metody działają. Tak więc coś nie tak jest z Proteusem. A szkoda bo naprawdę fajny programik, stosunkowo duże możliwości. Ale mimo wszystko posiada błędy. Symulacja rzecz fajna i polecam każdemu, ale należy pamiętać że to nie to samo że plątanina kabli pod rękami :)

Także temat zamykam



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: 9 ] 

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:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO