Programowanie mikrokontrolerów AVR w języku Bascom

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
keruseykaryu

Post autor: keruseykaryu » 31 lip 2010, 17:12

Może $eepromhex Ci pomoże. A morze jest przepastne jak ściągawka do Bascom, i by wypłynąć na szerokie wody trzeba morze poznać.

Awatar użytkownika
c4v2
Użytkownik
Posty: 426
Rejestracja: 22 lis 2005, 15:14
Lokalizacja: z przed monitora

Post autor: c4v2 » 25 sie 2010, 22:30

Dzień dobry lub dobry wieczór.

W trakcie programowania mikrokontrolerów AVR często zachodzi potrzeba odmierzania odcinków czasu.
Zwykle do tego celu wykorzystywany jest jeden z zawartych w strukturze
sprzętowych TIMER'ów pracujący w trybie TMER, czyli generujący przerwanie od jego przepełnienia.
Aby uprościć sobie obliczenie wartości którą należy podstawić do Timer'a aby ten
przepełnianiał co zadany interwał czasu napisałem prosty "kalkulator" a może "arkusz".
Program został napisany w Delphi7PE.
Do obliczenia wartości jaką podstawianej do Timer należy podać dwie wartości:
  • 1) częstotliwość zegara systemowego (Hz);
    2) czas co jaki TIMER ma generować przerwanie (s).
Po wprowadzeniu danych program obliczy możliwe wartości zarówno dla
timer'ów ośmio jak i szesnasto bitowych we wszystkich możliwych konfiguracjach preskalera.
Wartości niemieszczące się w "zakresie liczenia timera w danej konfiguracji preskalera" nie zostaną wyświetlone w komórkach.
Wyniki prezentowane kolorem zielonym (pierwsza kolumna dla ośmio i szesnasto bitowego timer'a)
są przeznaczone do użycia jako parametr procedury "Load TimerX" w języku Bascom.
Do bezpośredniego podstawienia zawartości Timer'a przeznaczone są wartości z kolumn w których wyniki prezentowane kolorem białym.
Funkcję kropki dziesiętnej w zadawanej wartości interwału pełni przecinek.
Podziały preskalera przez dwa oraz sto dwadzieścia osiem występują tylko w niektórych mikrokontrolerach AVR, dlatego wiersze dla tych ustawień zostały wyróżnione kolorem granatowym.
Jeżeli są Osoby którym ta prosta aplikacja może okazać się pomocna to udostępniam ją w załączniku.

Z poważaniem c4v2.
Załączniki
AvrTimer.zip
(200.44 KiB) Pobrany 1168 razy

Wojtek
Moderator
Posty: 2606
Rejestracja: 04 sie 2002, 19:00
Lokalizacja: --
Kontakt:

Post autor: Wojtek » 26 sie 2010, 5:30

Dla 8 bitów nie pokazuje kalkiulatorek zadnych wyników.

Wojtek
Moderator
Posty: 2606
Rejestracja: 04 sie 2002, 19:00
Lokalizacja: --
Kontakt:

Post autor: Wojtek » 26 sie 2010, 5:30

Dla 8 bitów nie pokazuje kalkulatorek zadnych wyników.

Awatar użytkownika
c4v2
Użytkownik
Posty: 426
Rejestracja: 22 lis 2005, 15:14
Lokalizacja: z przed monitora

Post autor: c4v2 » 26 sie 2010, 10:55

Na moim komputerze wyświetla oto zrzuty okna aplikacji:

[ Dodano: 2010-08-26, 12:10 ]
Jeżeli dla wartości oscylatora i interwału takich jak na zrzutach okna aplikacji dla timaer'a ośmio bitowego nie wyświetla żadnych wartości to znaczy że na Pana platformie sprzętowej program nie działa poprawnie.
Jest to prawdopodobnie wina użycia zmiennych typu Extended w parametrze funkcji. Program w pierwotnej wersji rzeczywiście wyświetlał wyniki "jak chciał". Po "rozbiciu" funkcji wielokrotnie wywoływanej na kod bardziej strukturalny problem znikł, przynajmniej na moim PC. Proszę o sprawdzenie czy dla podanych
wartości oscylatora i interwału takich jak na zrzutach okna aplikacji dla timaer'a ośmio bitowego aplikacja
wyświetla wyniki. Program nie wyświetla wyniku jeżeli interwał podany przez urzytkownika jest dłuższy niż czas zliczenia przez licznik swojej pojemności przy określonym preskalerze i częstotliwości taktowania.
Załączniki
AvrTimer_scr01.jpg
AvrTimer_scr01.jpg (19.2 KiB) Przejrzano 25109 razy
AvrTimer_scr02.jpg
AvrTimer_scr02.jpg (17.71 KiB) Przejrzano 25109 razy

Wojtek
Moderator
Posty: 2606
Rejestracja: 04 sie 2002, 19:00
Lokalizacja: --
Kontakt:

Post autor: Wojtek » 26 sie 2010, 12:23

Dzieki - jest ok, po prostu za duzy interwał dałem dla zegara 8MHz dałem 0,0005, zamiast pomysleć. Czy da sie jakoś powiększyć wyświetlane okienko bo dla moich oczu jest troche za małe :) (rozdzielczość ekranu mam 1680x1050 prz 14" w moim laptopie), a okienka nie da sie rozciągnąć.

Awatar użytkownika
c4v2
Użytkownik
Posty: 426
Rejestracja: 22 lis 2005, 15:14
Lokalizacja: z przed monitora

Post autor: c4v2 » 26 sie 2010, 17:50

Podana przez Pana wartość interwału nie jest za duża.
Q=800000 Hz
Prescale=64
T=0,0005 s
(8000000/64)*0,0005=62,5 wynik jest liczbą niecałkowitą więc odjęcie wyniku od
maksymalnej zawartości licznika również wynik rzeczywisty 256-62,5=193,5.
Wynik jako niepoprawny nie zostanie on wyświetlony.
Zwykle zależy na precyzyjnym odmierzaniu odcinka czasu, więc zaokrąglenie
rzeczywistego wyniku czy to poprzez zwykłe zaokrąglenie lub obcięcie części
ułamkowej nie wchodzi w grę. Rozwiązaniem tego problemu jest wpisanie takiej
wartości interwału aby spełniała warunki:
  • 1) Czas_do_odmierzania jest całkowitą wielokrotnością wpisanego interwału;
    2) Wynik działania "(Oscylator/Prescaler)*wartość" jest całkowity i mniejszy od pojemności licznika.
Mniejszy od pojemności licznika ponieważ:
Q=800000 Hz
Prescale=1
T=0,0005 s
(8000000/1)*0,0005=4000 Wynik większy od pojemności licznika.
Wynik nieprzydatny ponieważ:
256-4000=(-3744)

Wartość 0,0005 nie jest możliwa do bezpośredniego odmierzania ośmio bitowym timerem z oscylatorem 8Mhz.
Natomiast wartość 0,0001 przy preskalerze ustawionym na osiem przy tej samej częstotliwości taktowania da wynik poprawny
dla preskalera z podziałem przez osiem.
Wystarczy teraz inkrementować jakąś zmienną "do pięciu" (0.0005/0.0001=5) w przerwaniu timer'a i zadany czas zostanie odmierzony.

Co do możliwości skalowania okna to pewnie się tym zajmę, lecz będzie to trochę karkołomne gdyż komórki są klasy TLabel i trochę nieefektywne może okazać się ich skalowanie. Zmiana wielkości okna o jakiś zadany procent jest do rozważenia. Może prościej jednak będzie napisać komponent na bazie klasy TGraphic (TGraphicControl?) do prezentacji wyników. Fajna była by możliwość zaznaczania i kopiowania do schowka zawartości komórki. A jeszcze lepszym pomysłem byłoby użycie takiego kompilatora abym mógł kalkulator dodać sobie do zakładki Tools w Bascomie.

Wojtek
Moderator
Posty: 2606
Rejestracja: 04 sie 2002, 19:00
Lokalizacja: --
Kontakt:

Post autor: Wojtek » 26 sie 2010, 18:32

Dziękuję za wyczerpujące wyjasnienie :)

Awatar użytkownika
c4v2
Użytkownik
Posty: 426
Rejestracja: 22 lis 2005, 15:14
Lokalizacja: z przed monitora

Post autor: c4v2 » 29 sie 2010, 2:09

Dzień dobry lub dobry wieczór.

Dodałem możliwość zmiany wymiarów okna aplikacji.
Wydaje mi się że problem za małej czcionki został rozwiązany.
Na mojej platformie sprzętowej działa...
Kopiowanie do schowka systemowego wyniku nie zostało zaimplementowane...
Kalkulator w XP też nie ma tej funkcji... :smile:

Z poważaniem c4v2.
Załączniki
AvrTimer.zip
(231.26 KiB) Pobrany 1055 razy

Wojtek
Moderator
Posty: 2606
Rejestracja: 04 sie 2002, 19:00
Lokalizacja: --
Kontakt:

Post autor: Wojtek » 29 sie 2010, 7:12

Dziekuję, u mnie na Win7 Pro (32) też działa.

ODPOWIEDZ