• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Usypianie attiny2313
#1
BWitam! Jest jakiś mądry sposób na usypianie Attiny2313? Drugie pytanie to dlaczego delay(1000); w Attiny trwa straaaasznie długo? Zależy mi aby Attiny po przerwaniu zewnętrznym wysyłało trochę on danych przez nrf24 i szło grzecznie spać.
 
Odpowiedź
#2
Wgraj sobie bootloader do Attiny. Wgranie bootloadera ma dwie funkcje:
1. Ustawienie fuse bit, które ustawiają procek do pracy zgodnie z ustawieniami w IDE Arduino (np. na 8MHz).
2. Dogrywa program do wgrywania softu przez UART. W Attiny i małych prockach jest to opcjonalne.
Procek z fabryki przychodzi ustawiony na 1MHz, Ty zapewne wybrałeś, że chciałbyś mieć 8MHz, ale nie wgrałeś bootloadera bo używasz USBASP. I teraz delay(1000) trwa 8s?
Usypianie jest proste, dodajesz bibliotekę sleep i power, ewentualnie wdt, używasz funkcji tu dostępnych i już. A tak na prawdę to bierzesz pdf do swojego procka i czytasz. Są też tutoriale, teraz do wszystkiego są, wystarczy wpisać w google: http://www.gammon.com.au/forum/?id=11497 .
 
Odpowiedź
#3
Masz racje. Nie korzystam z bootloadera bo wole przez isp i usbasp. Wracając do problemu to samo wgranie bootloadera ma rozwiązać problem czasu ? Nie bardzo rozumiem o jakie biblioteki chodzi i jakie dane z pdfa uC chodzi. Można trochę prościej ? Wybaczcie za problem i pozdrawiam
 
Odpowiedź
#4
(07-09-2018, 23:15)Moro napisał(a): Masz racje. Nie korzystam z bootloadera bo wole przez isp i usbasp.

Używanie bootloadera na uC z 2k flash to raczej nieporozumienie. Fuses możesz ustawić przez SPI.
 
Odpowiedź
#5
Witaj! Wiem bo próbowałem ustawiać fusy w MkAvrKalkulatorze. Ale rozchodzi się które ustawić? CKDIV8 ustawić ? Ale wydaje mi się że dzielenie już jest włączone.
 
Odpowiedź
#6
Czego tu nie rozumieć. Wgranie bootloadera nie wgrywa bootloadera. Proste, nie? Big Grin
Przynajmniej nie zawsze. Przecież napisałem, że ta opcja składa się z dwóch punktów.
Czasami realizowany jest tylko p. 1.
Ustawia tylko fuse na takie jakie wybrales w ustawieniach projektu - dużo nie robi, zwykle tylko zegar.
Oczywiście zwykła funkcją "Burn Bootloader" jest również wgranie programu do komunikacji przez UART, czyli bootloadera, ale tak jest w przypadku standardowych płytek Arduino: UNO/NANO/PROMINI/itp.
W przypadku tych dodanych customowych płytek wybierasz sobie wiele opcji - zegar zew/wew/MHz, poziom napięcia odcięcia BOD, TO CZY CHCESZ UŻYWAĆ BOOTLOADERA czy programatorem jest ISP, itd. potem klikasz burn i wszystkie ustawienia są wgrywane z LUB BEZ BOOTLOADERA. W attiny13 np. nie ma w ogóle opcji wyboru odnośnie czy chcesz używać bootloadera, za mały procek. Dla attiny13 jest wgrywane tylko ustawienie fuse.
Dzięki temu trudniej coś spieprzyć ustawianiem na własną rękę, jak widać nawet MKAVR Kalkulatorem można ustawić źle. Nie powinno być ptaszka przy div8, chyba że procek zamierzasz używać z zegarem 1MHz, no ale wtedy też taki trzeba sobie wybrać w menu Arduino.
Edit:
Co do pdf, witaj na forum, witaj w Internecie.
Uruchom przeglądarkę, wejdź na google.pl , wpisz w okienko wyszukiwania Attiny2313 pdf, ściągnij plik pdf do attiny ze strony Microchipa (przejął Atmela i AVR), czytaj rozdział 7... Ustawienia procków odnośnie usypiania są podobne, jeśli nie takie same dla większości AVR, to co wyczytasz w linku z poprzedniej wiadomości tak samo zadziała z Attiny.
Oczywiście są też gotowe biblioteki do usypiania typu "ARDUINO", wejdź do managera bibliotek i wyszukaj frazę "sleep". Są przykłady. Niestety biblioteka uniwersalna może za dużo ważyć dla attiny z 2kb flash, dlatego pozostaje PDF + tutorial i jeśli jakieś rejestry są inne to trzeba je podmieniać. Zasada działania jest taka sama.
 
Odpowiedź
#7
(08-09-2018, 00:16)Moro napisał(a): Witaj! Wiem bo próbowałem ustawiać fusy w MkAvrKalkulatorze. Ale rozchodzi się które ustawić? CKDIV8 ustawić ? Ale wydaje mi się że dzielenie już jest włączone.
Zapomnij o Kardasiowym, PŁATNYM wynalazku. To samo, w dużo lepszej formie, masz w AtmelStudio/AvrStudio ZA DARMO!
Ustawienie podzielnika możesz zrobić programowo. Do tego służy rejestr CLKPRR.
Co tak naprawdę robi fuse CLKDIB8?
Po resecie wpisuje do CLKPRR podzielnik 8. Rozwiązanie z programową modyfikacją CLKPRR ma tą zaletę, że programując serię procesorów nie trzeba pamiętać o fuses. Ma też wadę. Szybsze taktowanie jest dopiero gdy program pracuje, programować przez SPI trzeba więc z CLK max 250kHz. W serii to nie wada, bo i tak "dziewicze" uC pracują z podzielnikiem. Przy pracy nad projektem też nie wada, bo uC ma 2k flash. W uC z dużą ilością flash też nie wada bo tam poważni ludzie używają JTAG.
Zrób więc to programowo i po robocie. Jak pamiętam to dwa zapisy do CLKPRR czyli całe 4 bajty, tyle ile jeden rozkaz w ARM.

Dlaczego w 99% modyfikowane sa fuses? Mnie to "wisi" bo używam odpowiednio zbudowanych plików ELF i fuses są już w nich. Nie bawię się podczas programowania w osobne zapisywanie flash, eeprom, fuses, lock. Jedno kliknięcie i po robocie. W projektach komercyjnych, w dużych uC program ustawia odpowiednio fuses (biore pod uwagę, ze jakiś "fachowiec" zaprogramuje tylko flash). Dlaczego inni bawią się w fuses? Ustawienia BOD, wektorów bootloadera, itp i pewnie nie potrafią napisac programu modyfikującego fuses ze swojej aplikacji.
 
Odpowiedź
#8
Co do odpowiedzi kolegi kaczakat: w menadżerze bibliotek Arduino nie ma nic na temat attiny2313, a w ustawianiu "ręcznie" jestem trochę zielony.
 
Odpowiedź
#9
Tak w ogóle to wybrałeś sobie procek dla zapaleńców, dla adeptów jest atmega328 w Arduino. I do tego znajdziesz wszystko w Internecie. Żeby programować takie nietypowe procki trzeba sobie doinstalować definicje płytek zrobione przez innych zapaleńców lub napisać samemu, skompilować bootloder (jeśli potrzebny).
Chcesz poznać dobrze AVR to poznaj dokładnie 1 procek, reszta jest podobna, wg mnie do tego lepiej wybrać 328 niż jego starszych kolegów attiny2313, atmega8, atmega32, itp.
Najprościej byłoby znaleźć jakieś technikum elektroniczne lub funclub przy jakieś podstawówce/gimbazie i im to podarować w prezencie, niech się męczą. I kupić sobie Atmega328 - cena podobna, ale możliwości i ilość bibliotek, które NA PEWNO zadziałają bez porównania większa, bo były już testowane przez tysiące/miliony (nawet jeśli nie są super optymalne) i bije je na głowę.
Jak już masz wgrane definicje attiny2313 (np. przez link: http://drazzy.com/package_drazzy.com_index.json ).
Ja ich nie miałem, bo takie procki prościej jest programować w Eclipse lub Atnel Studio. I tak zastosowanie Arduinowych bibliotek na 2kb flash nie ma sensu.
Wgrałem definicje, wczytałem przykładowy program do usypiania dla attiny13, wywaliło błędy, otworzyłem PDF attiny2313, porównałem nazwy rejestrów, okazało się, że różnią się jedną literką, poprawiłem, skompilowałem. I nie sprawdzę czy działa, bo nie mam takiego procka. Można kupić w cenie porównywalnej z płytką PRO MINI z atmegą 328. Także nie będę sprawdzał.
Akurat w tych definicjach płytki nie ma wyboru czy chcesz mieć bootloader. Po prostu go nie ma. Łatwo to sprawdzić - kompilujesz, na koniec jest komunikat, że szkic zajmuje 94b z dostępnych 2048, to znaczy, że nic nie jest zarezerwowane dla bootloadera. Jak skompilujesz jakiś program dla attiny25 to wyskoczy przykładowo, że program zajmuje 345b z 1536, dla UNO 456 z 32256. Brakujące 512 jest po prostu zarezerwowane dla bootloadera i jest odejmowane w tym komunikacie.
W każdym bądź razie tak wygląda program usypiający procka z wybudzaniem WDT:
Kod:
#include <avr/interrupt.h>
#include <avr/sleep.h>


ISR(WDT_vect) {
  // W przerwaniu pieska zmieniamy stan pinu led
  PORTB ^= 1<<PB2;
}

int main(void) {
  // Ustawienie B2 na wyjcie
   DDRB = 1<<DDB2;

  // Ustawienie czasu spania - preskaler WDT
 // WDTCR |= (1<<WDP3); // (1<<WDP2) | (1<<WDP0); //attiny13
 WDTCSR |= (1<<WDP3); // (1<<WDP2) | (1<<WDP0); //attiny2313

  // Wlaczenie przerwania od WDT
//  WDTCR |= (1<<WDTIE);//attiny13
WDTCSR |= (1<<WDIE); //attiny2313
  sei(); //Globalne wlaczenie przerwan

  // Ustawienie trybu spania
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);

  while(1){
     sleep_mode();   // Idzie spac i czeka na przerwanie
  }
}
Led podłączony do PB2 będzie migać zgodnie z ustawieniem WDT.
Jak wgrasz to sobie sprawdzasz zużycie prądu, oczywiście gdy led nie świeci. Jak za duże to jest parę ogólnych zasad optymalizacji dotyczących ustawienia portów, wyłączenie BOD, analoga, itp. Wszystko z wynikami jest opisane w podanym linku.
Chcesz inny czas usypiania to ustawiasz sobie jakąś zmienną w przerwaniu, a usypianie wrzucasz do jakiś funkcji i zapętlasz to aż zmienna w przerwaniu osiągnie wymaganą wartość, np. dla 5min można ustawić WDT na 4s i powtórzyć cykl 75 razy. A jak nie zależy na dokładności to na 8s i 38 cykli.

Tak wygląda IDE po dodaniu definicji i możliwe do ustawienia opcje fuse (ustawia się je wypalając bootloader):
   
Dla porównania opcja z możliwością wyboru bootloadera dla attiny25.
   
Fuse oczywiście można ustawiać nawet z palca wklepując w linii poleceń do AVRDUDE. Z Atmel Studio oczywiście nic nie ustawisz nie mając programatora z nim współpracującego, nie wiem czy w ogóle jest dzisiaj opcja uruchomić USBASP. Jak ktoś ma dużo czasu to jak go nakręcisz to może wrzuci jakiś swój profesjonalny tutorial lub może nawet kawałek niebiańskiego kodu ze swojej fabryki fantasy gdzie tyrają elfy. Ja w ogóle już nie mam tego IDE, bo aktualny nie działa w win7. Kalkulator MK jest narzędziem ułatwiającym życie, jak i tak już go kupiłeś to niech się zwraca. Jest też darmowy AVR LAB++, świetna alternatywa i można wgrywać przez bootloader arduino.
Kod zajmuje niecałe 100b. Dla attiny25 jest biblioteka do usypiania tinysnore, polecenie takie jak delay(), podajesz snore(5000) i procek śpi 5s. Ale zajmuje od razu 700b.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości