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!
-
kayron
- Użytkownik
- Posty: 2088
- Rejestracja: 21 wrz 2008, 12:53
- Lokalizacja: Poland
-
Kontakt:
Post
autor: kayron » 14 paź 2010, 16:53
Nie testowałem tego, ale coś takiego z wykorzystaniem timera1 (15,25 próbki/sek).
Kod: Zaznacz cały
Dim Znacznik_ruchu As Bit
Dim Napiecie As Word At $70 'Taka ciekawa sztuczka aby z worda, mozna kozystać jakby to był Byte.
Dim Lsb_nap As Byte At $70 Overlay
Dim Msb_nap As Byte At $71 Overlay
Dim Buf_pom As Byte
Dim Odchylka_plus As Byte
Dim Odchylka_minus As Byte
Const Odchylka = 10
Enable Interrupts
Enable Compare1a
On Compare1a Adc_test
Config Timer1 = Timer , Prescale = 1024 , Clear Timer = 1
Compare1a = 512
start timer1
Buf_pom = Odchylka + 5
Odchylka_plus = Buf_pom + Odchylka
Odchylka_minus = Buf_pom - Odchylka
Reset Znacznik_ruchu
Do
If Znacznik_ruchu = 1 Then
'wywołanie programu aktualizacji LCD
Reset Znacznik_ruchu
End If
Loop
Adc_test:
Napiecie = Getadc(0)
If Lsb_nap < Odchylka_minus Then
Set Znacznik_ruchu
Odchylka_minus = Lsb_nap - Odchylka
Odchylka_plus = Lsb_nap + Odchylka
End If
If Lsb_nap > Odchylka_plus Then
Set Znacznik_ruchu
Odchylka_minus = Lsb_nap - Odchylka
Odchylka_plus = Lsb_nap + Odchylka
End If
Return
Jak to działa

Timer1 15 razy na sek dokonuje pomiaru z ADC, i jeżeli wynik jest większy lub mniejszy niż zdefiniowana odchyłka, to ustawia Znacznik_ruchu. Teraz pętla główna sprawdza czy znacznik ruchu jest ustawiony na 1, jeżeli tak to wywołuje procedurę aktualizacji danych na wyświetlaczu.
PS. program to tylko ogólna idea, a nie gotowiec.
Ostatnio zmieniony 14 paź 2010, 19:17 przez
kayron, łącznie zmieniany 1 raz.
-
matrix
- Użytkownik
- Posty: 1796
- Rejestracja: 15 mar 2006, 5:21
- Lokalizacja: Sochaczew
-
Kontakt:
Post
autor: matrix » 14 paź 2010, 18:47
spoko, jestem wdzięczny. będzie się testować.
w jakiej roli użyłeś tu compare1a ?
ogólnie głównym założeniem dla mnie jest zbudowanie czegoś na wzór climatronica. chcę żeby procesor sam utrzymywał mi temperaturę w aucie na zadanym przeze mnie poziomie.
wiem że jest w ofercie avt coś w tym stylu, ale ja chcę zrobić swoje bo nie ma to jak popracować nad czymś i uda się to coś osiągnąć, a dwa chcę trochę więcej wsadzić niż tylko utrzymywanie temperatury.
samo utrzymywanie temperatury można sobie zrobić na wzmacniaczu operacyjnym.
-
kayron
- Użytkownik
- Posty: 2088
- Rejestracja: 21 wrz 2008, 12:53
- Lokalizacja: Poland
-
Kontakt:
Post
autor: kayron » 14 paź 2010, 19:05
Tzn. ja to pisałem z HELPem Bascoma w ręku więc trzeba to dokładnie jeszcze sprawdzić dla ATMEGa32. Compare1a wykorzystałem w ten sposób że jak licznik Timera1 osiągnie wartość 512 to przerwanie od komparatora powinno go zrestartować i jednocześnie zgłosić przerwanie.
Ale powtarzam to nie jest testowanie i pisane na szybciora więc mogłem nie ustrzec się jakiegoś błędu, ale skompilować się skompilowało. No i jest to jedno z kilku możliwych podejść bo mamy jeszcze przerwania od przetwornika A/C, ale akurat nie wiem czy były by tu przydatne.
Teraz tak jak chcesz tym sterować PWM to należało by jeszcze zaprzęgnąć do tego Timer2, no chyba że jakoś da się zrobić 2 in 1, i Timer1 będzie robił 2 rzeczy naraz generował PWM i odliczał czas próbek z A/C. To możliwe bo ma 2 komparatory, które mogą pracować niezależnie, ale musiał bym się wgłębić w notę katalogowa Megi32.
I nie ruszaj Timera0 w swojej aplikacji, bo dekodowanie kodu RC5 komendę GetRC5 go używa.
-
keruseykaryu
Post
autor: keruseykaryu » 14 paź 2010, 19:33
kayron pisze:Enable Interrupts
Enable Compare1a
On Compare1a Adc_test
Config Timer1 = Timer , Prescale = 1024 , Clear Timer = 1
Compare1a = 512
Ło matko i córko. Co to jest? Ty wiesz, że możesz być zasypany przerwaniami wtedy?
Zawsze: konfiguracje potem przerwania.
Ostatnio zmieniony 14 paź 2010, 19:43 przez keruseykaryu, łącznie zmieniany 1 raz.
-
kayron
- Użytkownik
- Posty: 2088
- Rejestracja: 21 wrz 2008, 12:53
- Lokalizacja: Poland
-
Kontakt:
Post
autor: kayron » 14 paź 2010, 19:38
Bo..

Masz aktywne tylko przerwanie od komparatora, który je zgłosi po 1024(preskaler)x512 czyli po 524288 cykli zegara. To niby skąd ci się weźmie ta masa przerwań ?
Chodzi mi o to że napisałeś coś, ale nie uzasadniłeś dla czego niby tak by się miało stać ?
Symulacja nie wykazała mi przynajmniej nagłej lawiny przerwań, wywołanej jakimś czynnikiem którego niby się doszukujesz w tych kilku linijkach kodu?
Linijka On comparate1a adc_test, to tylko deklaracja podprogramu dla kompilatora, a nie aktywowanie przerwań. Chyba że kompilator BASCOMa to by źle zinterpretował.
Ostatnio zmieniony 14 paź 2010, 19:47 przez
kayron, łącznie zmieniany 1 raz.
-
keruseykaryu
Post
autor: keruseykaryu » 14 paź 2010, 19:47
No problem. Włączamy przerwania. Włączamy z porównania. Licznik = 0, Compare1a = 0. Równe są? Są równe. Przerwanie już może być zgłoszone. Dochodzi do CONFIG, ale co to? Rejestry dalej są równe! Reset licznika, przerwanie. Core wykonuje LDS, a rejestry dalej równe. Pisać dalej?
[ Dodano: 2010-10-14, 20:48 ]
kayron pisze:Linijka On comparate1a adc_test, to tylko deklaracja podprogramu dla kompilatora, a nie aktywowanie przerwań.
Yezu! Przerwania są aktywne! Sam je włączyłeś przed On Compare1a. Nie widzisz tego?
-
kayron
- Użytkownik
- Posty: 2088
- Rejestracja: 21 wrz 2008, 12:53
- Lokalizacja: Poland
-
Kontakt:
Post
autor: kayron » 14 paź 2010, 19:50
Źle sobie to interpretujesz linijka On comparate1a adc_test to nie instrukcja procesora, to tylko etykieta, która jest tłumaczona przez kompilator na adres z pod którego ma się zaczynać procedura (właściwie adres skoku do procedury) ADC_test, nic więcej.
Ostatnio zmieniony 14 paź 2010, 20:03 przez
kayron, łącznie zmieniany 2 razy.
-
keruseykaryu
Post
autor: keruseykaryu » 14 paź 2010, 19:52
Kontaktujesz? On przerwanie się nie wykona. Wykonają się Enable, potem może Config jakieś parę naście rozkazów później. Ale flaga OCF1A już będzie na maszcie. Przerwanie zgłoszone!
[ Dodano: 2010-10-14, 20:53 ]
I co z tym wspólnego ma ON.GOTO, albo ON.GOSUB? Mieszasz pojęcia.
-
kayron
- Użytkownik
- Posty: 2088
- Rejestracja: 21 wrz 2008, 12:53
- Lokalizacja: Poland
-
Kontakt:
Post
autor: kayron » 14 paź 2010, 20:03
Nie chce mi się kłócić, trzeba by skompilować i wrzucić do jakiegokolwiek porcesora z podobnym Timerem1 i sprawdzić czy ocipieje. Jedyne wytłumaczenie że BASCOM jest wrażliwy na kolejność linii Config i on w kodzie, a o to sie nie będę spierać bo możliwe, BASCOM już nie raz zrobił mnie w bambuko, i pisałem kawałki kodu z not ATMELA w ASM, bo inaczej nie szło.
-
matrix
- Użytkownik
- Posty: 1796
- Rejestracja: 15 mar 2006, 5:21
- Lokalizacja: Sochaczew
-
Kontakt:
Post
autor: matrix » 14 paź 2010, 20:42
wrzuciłem do procka i przerwanie od Compare1a na pewno jest wywoływane. co dalej mam sprawdzić?
-
kayron
- Użytkownik
- Posty: 2088
- Rejestracja: 21 wrz 2008, 12:53
- Lokalizacja: Poland
-
Kontakt:
Post
autor: kayron » 15 paź 2010, 18:10
A jaką częstotliwość powinien mieć PWM, bo można by uzyskach ok 244Hz lub 1,9KHz oczywiście przy 8 bitowym PWM ?
Pytam bo nie wiem jaka częstotliwość PWM próbować dobrać do sterowania wentylatorem.
-
keruseykaryu
Post
autor: keruseykaryu » 15 paź 2010, 19:45
kayron pisze:A jaką częstotliwość powinien mieć PWM, bo można by uzyskach ok 244Hz lub 1,9KHz oczywiście przy 8 bitowym PWM ?
Jaki zegarek?
-
kayron
- Użytkownik
- Posty: 2088
- Rejestracja: 21 wrz 2008, 12:53
- Lokalizacja: Poland
-
Kontakt:
Post
autor: kayron » 15 paź 2010, 19:57
To było raczej pytanie do Matrixa bo to on buduje urządzenie, i z tego co wiem to ma tam być 8MHz, ale mnie chodzi o to jak jest zalecana częstotliwość PWM dla silnika DC na 12V (popularny wentylator). A pytam z 2 powodów, bo "kombinuję" nad tym timerem T1 pracującym jednocześnie jako generator próbkowania dla ADC i generator PWM dla silnika wentylatora. Powinno się dać, a z drugiej strony sam muszę zbudować PWMa na NE556 do sterowania dmuchawą z auta i chciałbym wiedzieć jaka jest właśnie zalecana czy ogólnie przyjęta częstotliwość ?
-
matrix
- Użytkownik
- Posty: 1796
- Rejestracja: 15 mar 2006, 5:21
- Lokalizacja: Sochaczew
-
Kontakt:
Post
autor: matrix » 15 paź 2010, 22:37
kayron pisze:A jaką częstotliwość powinien mieć PWM, bo można by uzyskach ok 244Hz lub 1,9KHz
tu mi trudno cokolwiek rzec. żeby to się nigdzie tam nie udzielało w żadnym urządzeniu typu komputer sterowania wtryskiem czy od sekwencji, czy też w najlepszym razie radio.
-
kayron
- Użytkownik
- Posty: 2088
- Rejestracja: 21 wrz 2008, 12:53
- Lokalizacja: Poland
-
Kontakt:
Post
autor: kayron » 16 paź 2010, 12:59
Tzn tak. z tego co wyczytałem to fachmany, to twierdzą że częstotliwość waha się w granicach od 500Hz do 30KHz, znalazłem nawet wzór do obliczenie Fpwm, ale trzeba znać obroty maksymalne i liczbę uzwojeń, więc nie będziemy się w to bawić.
Natomiast stwierdzili oni że im mniejsze Fpwm tym bardziej piszczy silnik (charakterystyczny pisk we wkrętarkach czy wiertarkach z regulacją obrotów). Ponieważ my nie chcemy aby w aucie piszczał nam wentylator to proponuję taki kompromis.
Preskaler na 8 x rozdzielczość PWM czyli 8b da ok 2KHz, co powinno być dobrym lekarstwem, nie najlepszym, ale do przyjęcia. Ostatecznie preskaler x1 i mamy ~16KHz.
EDIT
A bo zapomniałem. Matrix jak ma reagować ten potencjometr ? Tzn. co się ma dziać przy skrajnym położeniu na Minimum, wentylator ma się kręcić np. na 20%, czy zatrzymać całkowicie (czyli wyłączyć się ma dmuchawa). Bo nie wiem czy jest jakiś dodatkowy wyłącznik w samochodzie do niego, czy robi to potencjometr ?
Ja osobiście zrobił bym to na obydwa sposoby bo wygodniejsze.