Witam,
"na prosbe Mirka wstawiam rozmowe na forum"jestem posiadaczem twojej książki i mam pytanie odnośnie projektu odbiornik rc5.
Mianowicie posiadam w domu plytke testowa kursu Bascom AVT 3500, i chciałem przetestować odbior rc5 z pilota. Korzystam dokladnie z tego kodu co jest w ksiazce i dołączonej płycie DVD. Uzywam srodowiska Eclipsce + avrdude + winavr. Zmieniłem w programie procesor na ATtiny 2313 i czestotliwosc na 4 Mhz tak jak mam ustawione na płytce testowej. Zmienilem takze numery pinow podpięcia impulsu DATA z odbiornika (przerwania ICP u mnie to PD6), oraz mam inaczej podpiety LCD. (pliki: ir_decode.h i ir_decode.h) Jednak mam błąd kompilatora typu:
Kod:
avr-gcc -Wall -Os -fpack-struct -fshort-enums -std=gnu99 -funsigned-char -funsigned-bitfields -mmcu=attiny2313 -DF_CPU=4000000UL -MMD -MP -MF"IR_DECODE/ir_decode.d" -MT"IR_DECODE/ir_decode.d" -c -o"IR_DECODE/ir_decode.o" "../IR_DECODE/ir_decode.c"
../IR_DECODE/ir_decode.c: In function 'ir_init':
../IR_DECODE/ir_decode.c:42: error: 'TICIE1' undeclared (first use in this function)
../IR_DECODE/ir_decode.c:42: error: (Each undeclared identifier is reported only once
../IR_DECODE/ir_decode.c:42: error: for each function it appears in.)
'TICIE1' - rozumiem ze jest to etykieta timera w ATmega 16
Czy u mnie timer ten ma inną etykietę ? nie mogę jej nigdzie znalezc ?
Nie bardzo wiem o co chodzi, szukałem przerawiania ICP na moim ATtiny 2313 i myslalem ze mogę tak to zrobić. Pytanie brzmi co musze zmienić? Czy da się w ogolę uruchomić twoj program na mojej konfiguracji? i czy kwarc jest dobry? (czy nie muszę inaczej przeskalowac)?
Kod:
Witam,
Oczywiście że można odpalić to i to na dowlnym procku AVR.
Najbardziej mnie dziwi to uporczywe korzystanie z taktowania 4MHz zewn. kwarca, przecież ATtiny2313 ma możliwość taktowania wewn. oscylatorem 8MHz (no ale to inna para kaloszy)
ATtiny2313 posiada przerwanie ICP , ale pewnie, że trzeba prawdopodobnie zmienić nazwy niektórych rejestrów ale nie tylko rejestrów ale i nazw bitów jak widać po komunikatach błędów.
Jak sprawdzić ????? ..... eeeej halo halo - a o czym pisałem w książce?
Najpierw to trzeba postarać się dokładnie zrozumieć działanie tego programu
Potem już łatwiej przyjdzie jak zmienić nazwy rejestrów i ew bitów
Bierzesz sobie notę PDF od ATmega32 i notę od ATtiny2313
zaglądasz pan do noty ATmega32 i patrzysz na rozdział odnośnie Timera1 (ostatni podrozdział) odnośnie nazw kolejnych rejestrów i nazw bitów.
No i po kolei sprawdzasz sobie to co miałeś w ATmega32 czy jest tak samo w ATtiny2313 Wink .... jeśli jest inaczej to po prostu zamieniasz.
Np może się okazać że bit o nazwie TICIE1 w m32 może mieć nazwę OCIE1 w tiny2313. (zgaduję tylko tak bez zaglądania teraz do noty - ty musisz to dokładnie posprawdzać, zmienić i odpalić)
a zobaczysz, że wszystko ruszy bez problemu
Pozdr Mirek
Tak jak mowiłeś, miałeś rację, podmieniłem bit 5 TICIE1 na OCIE1B i program się skompilował, niestety nie chce wyświetlać kodów.(po odpaleniu widnieje napis: "Kody pilota rc5:" Czy to może być wina złego oscylatora? czy może wina odbiornika ? zbudowałem go według schematu z twojej ksiązki: (str.309, odbiornik TSOP2238), zmierzyłem napięcie na odbiorniku pomiędzy (GND a DATA) w chwili włączania przycisku napięcie spada z 0,71 na 0,69 ? czy się myle czy odbiornik dobrze reaguję na impulsy? więc jaką wartość mnoznika podać w programie?
rozumiem ze zmiana musi byc w tym miejscu, moj oscylator to 4Mhz.
Kod:
/ stałe i zmienne potrzebne na wewnętrzne cele procedury obsługi RC5
#define TIMER1_PRESCALER 8
// przeliczanie tyknięć Timera1 przy danym preskalerze na mikrosekundy
#define ir_micro_s(num) ((num)*(F_CPU/1000000)/TIMER1_PRESCALER)
Kod:
Witam,
A skąd wzięło ci się OCIE1B - chodzi mi o tą literkę B na końcu ? Wink dlaczego np nie z literką A ?
A jaki masz wektor przerwania ? ! ? ! ? ---- tu podejrzewam że masz babola
Częstotliwość taktowania sama się dobiera bo masz F_CPU
no chyba, że nie działasz w Eclipse (bo nie pamiętam poprzedniego maila)
Tak więc w tej linijce którą pokazałeś to w zasadzie nic nie trzeba zmieniać - ona jest po to żeby się automatycznie dopasowywać do częstotliwości. Chyba że damy kwarca 20MHz to wtedy można preskaler dopiero zwiększać Wink
Pozdr Mirek
Sciągnąłem note ATmegi32L i tam znalazłem rejestr TIMSK który ma 8 bitów
Kod:
OCIE2 TOIE2 TICIE1 OCIE1A OCIE1B TOIE1 OCIE0 TOIE0
porównałem to z notą katalogową ATtiny 2313 i tam równiez odnalazłem rejestr TIMSK
która ma odpowiednio bity:
Kod:
TOIE1 OCIE1A OCIE1B ----- ICIE1 OCIE0B TOIE0 OCIE0A
zrozumiałem to tak, że jeśli zmieniam bit5 to także na bit5?
więc podmieniałem na OCIE1B ??
nie mogę znaleźć wektora przerwań zeby go porownac. Moglbys mi pomoc?
Kod:
Witam,
Nie nie panie kolego. To, że dokonujesz podmiany bitu nr.5 z tego rejestru m32 na bit nr.5 rejestru w tiny2313 to tragiczna droga Sad
Tu nie chodzi o dokonywanie podmian drogą mechaniczną że tak powiem. Trzeba do tego podchodzić tak:
1. hmmm do czego służy bit TICIE1 w m32 ????
2. sprawdzam, czytam - staram się zrozumieć do końca i nagle hmm eureka, w tym akurat przypadku bit TICIE1 to zezwolenie na obsługę przerwania od ICP, przecież w nocie m32 masz napisane:
Cytat:
Bit 5 – TICIE1: Timer/Counter1, Input Capture Interrupt Enable
When this bit is written to one, and the I-flag in the Status Register is set (interrupts globally
enabled), the Timer/Counter1 Input Capture Interrupt is enabled. The
corresponding Interrupt Vector (See “Interrupts” on page 42.) is executed when the
ICF1 Flag, located in TIFR, is set.
tymczasem ty podmieniłeś go na bit, którego opis w tiny2313 wygląda tak:
Cytat:
Bit 5 – OCIE1B: Timer/Counter1, Output Compare B Match Interrupt Enable
When this bit is written to one, and the I-flag in the Status Register is set (interrupts globally
enabled), the Timer/Counter1 Output Compare B Match interrupt is enabled. The
corresponding Interrupt Vector (See “Interrupts” on page 47.) is executed when the
OCF1B flag, located in TIFR, is set.
a co on ma wspólnego z wyżej wymienionym ???????? NIC - on służy do zezwolenia na przerwanie ale całkiem inne - te od porównania w kanale B (Compare Match B) ..... więc to gigantyczne nieporozumienie.
No ale program się kompiluje bo przecież sama nazwa jest OK - prawda ?
A gdzie w tym rejestrze jest bit odpowiedzialny za zezwolenie na przerwanie ICP ????
3. czyta, czytam i widzę taki opis bitu:
Cytat:
Bit 3 – ICIE1: Timer/Counter1, Input Capture Interrupt Enable
When this bit is written to one, and the I-flag in the Status Register is set (interrupts globally
enabled), the Timer/Counter1 Input Capture interrupt is enabled. The
corresponding Interrupt Vector (See “Interrupts” on page 47.) is executed when the
ICF1 flag, located in TIFR, is set.
4. czyli Eureka !!! więc w tuny2313 to jest bit nr.3 o nazwie ICIE1 !!!
Wink
Mam nadzieję, że taki opis pomoże ci zrozumieć na przyszłość jak należy podchodzić do podmian nazw rejestrów w innych prockach dla różnych programów. Po pierwsze to dobrze jest w 100% rozumieć co program robi. Ale po drugie - to bity podmieniamy wg tego za co one są odpowiedzialne a nie po numerze bitu w bajcie. Bo w innych przypadkach okazać się może, że nawet nazwa samego rejestru będzie całkiem inna - i co wtedy byś zrobił ?
Jak podejdziesz tą drogą to program ci ruszy na twoim ATtiny2313 bo teraz gdy zezwoliłeś w programie na OCIE1B a przecież nawet nie masz procedury obsługi tego przerwania. To po włączeniu preskalera dla Timera1 i po wystąpieniu porównania z rejestrem OCR1B, który domyślnie jest = 0, zawsze porównanie następuje praktycznie w pierwszym kroku, i procesor chce zrealizować to przerwanie, którego nie ma. A język C wstawia takie coś, że jeśli wykona się "DUMMY IRQ" to nastąpi programowy reset procka. Zatem procek ci się wciąż restartuje i dlatego tobie wydaje się że on nie odbiera kodów Wink no bo nie może tego robić jak sam widzisz
Pozdr Mirek
Mam jeszcze pytanie odnośnie nadajnika. Posiadam pilot Philips o numerach ID
rc19414005/01
http://www.afstandsbediening-online.nl/ ... index.htmlchciałem jeszcze sprawdzić kody do poszczególnych przycisków, ale niestety nie ma ich nigdzie zdefiniowanych, nawet na
http://lirc.sourceforge.net/remotes/philips/.
Czy kody które udostępniasz w swoim kodzie są uniwersalne ? dla pilotw rc5? czy musze szukać indywidualnych dla swojego pilota ?
Kod:
Witam,
kody do każdego pilota RC5 - są Z A W S Z E T A K I E S A M E
to akurat jest najstarszy standard i nie ma innej możliwości. Tzn owszem jeśli weźmiesz pilot zamiast np do TV to address u ciebie może nie być = 0 co chyba oczywiste, ale już np kody na klawiaturce numerycznej jeśli jest na pilocie zawsze będą tak jak w RC5, ładnie po kolei, czyli dla klawisza 1 = 1, dla 2 = 2 itd
Niestety z tymi pilotami szczególnie kupowanymi w necie to bywa różnie. Jak myślisz dlaczego wprowadziłem do sprzedaży pilot RC5 u nas ?
http://sklep.atnel.pl/pl/p/Pilot-RC5/18
ano właśnie dlatego, że było mi szkoda ludzi, którzy kupowali wciąż na kocim allegro pilota sobie np RC5 i to nawet w takiej samej obudowie jak ten mój a potem im się okazywało że po tygodniach sprawdzania i rwania włosów z głowy, że on jednak nie nadaje w RC5 bo to jakaś tam chińska obrzydliwa podróba czy coś podobnego. A teraz gdy ktoś kupi pilota ode mnie to ma gwarancję, że na 100% jest RC5 - no a i cena jest fajna bo pilot od razu z bateriami przecież.
Nie mniej jednak nie martw się, że ty masz może od razu złego pilota. Jak widzisz po poprzednim mailu masz jeszcze mocno skopany program w procku i dlatego nie mógł on nawet sprawdzić dobrze czy nadlatują kody RC5
Gdy to poprawisz a pilot będzie OK to na 100% ci zadziała - bo nawet jeśli piloty RC5 różnią się pomiędzy sobą nieznacznie czasami trwania połówek bitów, to w programie, który masz uwzględniona jest tolerancja Wink dzięki której każdy będzie działał OK Wink
Pozdr Mirek
zy
Niestety, dalej mam problem, zmieniłem ICIE1, najpierw wyskoczyl bład przy programowaniu aby sprawdzic hardware z błędem rc=-1 ?
anulowalem, zaprogramowalem jeszcze raz i poszlo, jednak nie ma reakcji na pilota.
Czy to moze byc spowodowane tym ze na plytce testowej mam zwarta z masa nozke rw na lcd ? jednak zaznaczylem to w kodzie:
// tu ustalamy za pomocą zera lub jedynki czy sterujemy pinem RW
// 0 - pin RW podłączony na stałe do GND
// 1 - pin RW podłączony do mikrokontrolera
#define USE_RW 0
wrzucam schemat mojej plytki testowej, i podmienionych kodow od mirka, proszę o sprawdzenie: