38kHz u Bascomu

Rasprava o AVR mikrokontrolerima, AVR projekti i drugo vezano za AVR...

Moderators: pedja089, stojke369, trax, InTheStillOfTheNight

manac5800
Napredujem
Napredujem
Posts: 103
Joined: 03-01-2011, 19:24

38kHz u Bascomu

Post by manac5800 »

Dakle trebam generirati signal od 38 kHz pomoću Atmega8 MCU-a..ako je puno lakše s nekim drugim (32 npr) nabavim njega, samo 8 imam sad... Ali naravno nisam htio sa wait naredbama, preko PWM ako se ne varam ne mogu sa Atmega8...
Može li tko pomoći?

Tih 38kHz spajam na IR LED (odn. više njih) kako bih napravio ovo: http://pcbheaven.com/circuitpages/Long_ ... _Detector/ ali sa MCU...
Ako netko zna kako to ostvariti i voljan je pomoći zahvaljujem se unaprijed!
User avatar
InTheStillOfTheNight
Odlično uznapredovao
Odlično uznapredovao
Posts: 938
Joined: 01-06-2006, 17:54
Location: Zagreb

Re: 38kHz u Bascomu

Post by InTheStillOfTheNight »

Varaš se da ne može... Teže bi bilo pronaći AVR MCU koji to ne može.
Trebaš samo podesiti jedan od 3 TIMER-a. U bascomu je implementirano nesto sto se zove config TIMER, pa prouči malo kako se to radi u bascomu.
InTheStillOfTheNight
User avatar
Kukinjos
Pravi forumaš
Pravi forumaš
Posts: 1724
Joined: 28-03-2012, 18:01
Location: Split

Re: 38kHz u Bascomu

Post by Kukinjos »

Evo ti dio koda za interupt, koristiš 16 bitni timer2, prescale=1 i kristal za 4MHz

Code: Select all

$regfile = "m8def.dat"
$Crystal=4000000
$hwstack=40
$swstack=16
$framesize=32


Const Timer1_reload = 105                                   ' reload vrijednost timera 1
                                                            ' za dobit 26,3 uS (38,022KHz)
Config Timer1 = Timer , Prescale = 1                        ' svaki impuls je 250 nS
                                                            ' za 4MHz kristal
Load Timer1 , Timer1_reload                                 ' to upišeš u timer
On Ovf1 Timer1_isr                                          ' adresa interrupt rutine
Enable Timer1                                               ' dopustiš interrupt timera1
Start Timer1                                                ' i startaš ga
Enable Interrupts                                           ' dopustiš int. globalno

' *******************************************
' *   Ovdje ide tvoja glavna petlja     *
' *******************************************
Main:

  Do


  Loop



' *******************************************
' *        Interrupt rutina timera1        *
' *******************************************
Timer1_ISR:

   load timer1, Timer1_Reload

' Ovdje ide tvoj kod interrupt rutine, npr uključi ili isključi port

  return



Cezare, star sam i nemoćan, ali poslušaj moj savjet ....
User avatar
InTheStillOfTheNight
Odlično uznapredovao
Odlično uznapredovao
Posts: 938
Joined: 01-06-2006, 17:54
Location: Zagreb

Re: 38kHz u Bascomu

Post by InTheStillOfTheNight »

To se ne radi korištenjem interrupta. Freq je prevelika i trebao bi ulaziti u ISR svakih 26 uS. Ne treba ti ISR niti interrupt da bi ti TIMER generirao PWM na hardware OC linijama. Dakle treba podesiti samo TIMER za ovo, ali ne i njegov ISR. Svi bitovi vezani za ovo su sljedeci:
CSx u TCCR1x registru
WGMx u TCCR1x registru
COMx u TCCR1x registru
OCR1A registar
OCR1B registar
i DDRx registar na kojemu se izbacuje ovaj PWM

Iz BASCOM-a je moguće i ručno upisati u ove registre sve što je potrebno, tako da se sigurno i sa config TIMER u gotovo jednoj liniji programa sve ovo moze napraviti...

Mozes to napraviti i na gore prikazan nacin, no to je klanje mikrokontrolera sa ISR-om koje je nepotrebno.
InTheStillOfTheNight
User avatar
Kukinjos
Pravi forumaš
Pravi forumaš
Posts: 1724
Joined: 28-03-2012, 18:01
Location: Split

Re: 38kHz u Bascomu

Post by Kukinjos »

U pravu si Still...., ovo je bila špranca, pa je samo zalijepio. Ali setiranje timera može uzet iz ovog.
Cezare, star sam i nemoćan, ali poslušaj moj savjet ....
manac5800
Napredujem
Napredujem
Posts: 103
Joined: 03-01-2011, 19:24

Re: 38kHz u Bascomu

Post by manac5800 »

Mislio sam na 8MHz clock, timer1, prescale 1 i TOP vrijednost 210..
još se patim oko postavaljanja TOP... :/
User avatar
Kukinjos
Pravi forumaš
Pravi forumaš
Posts: 1724
Joined: 28-03-2012, 18:01
Location: Split

Re: 38kHz u Bascomu

Post by Kukinjos »

Točno, 210 za 26,5 uS ili 37,736 KHz.
Cezare, star sam i nemoćan, ali poslušaj moj savjet ....
User avatar
InTheStillOfTheNight
Odlično uznapredovao
Odlično uznapredovao
Posts: 938
Joined: 01-06-2006, 17:54
Location: Zagreb

Re: 38kHz u Bascomu

Post by InTheStillOfTheNight »

Prvo moraš podesiti timer u CTC način rada u kojemu ti gornju ili TOP vrijednost TIMER-a određuje OCR1A registar... Traži u datasheetu tablicu sa CTC načinom rada i top vrijednosti OCR1A... Radi o o WGM bitovima u TCCR1x registrima.

Nakon toga u OCR1A upisuješ TOP vrijednost, dakle 210 i TIMER će sigurno brojati do 210, te se resetirati na 0. Naime, točna vrijednost koju ćeš dobiti za period je:
T = (1/8000000)*(210+1) S

Ako TIMER-u postaviš TOP vrijednost 210, on će brojati od 0 do 210, tj ukupno 211 Impulsa mora ući u TIMER da bi dobio jedan period TIMER-a. Zato u formuli i stoji +1.
Period po calc-u je 26,375 uS, a frekvencija je 37914,692 Hz

Kad ovo podesis onda ti ostaje samo OCR1B registar staviti na 50% PWM-a, podesiti COM bitove za OC1B izlaz, podesiti izlaz za OC1B u DDRx registru i to je to...

Obrati pozornost da ti u bascomu ne moras koristiti "Config Timer". Jednostavno mozes napisati i ovo:
OCR1A = 210 ' poresavam top vrijednost
OCR1B = 105 ' podesavam duty 50% za OC1B

Najbolje ti je datasheet i po redu :)
InTheStillOfTheNight
manac5800
Napredujem
Napredujem
Posts: 103
Joined: 03-01-2011, 19:24

Re: 38kHz u Bascomu

Post by manac5800 »

Zašto CTC? ja sam gledao po Fast PWM dosad.. nije da sam uspio napraviti, ali po onome što sam iz opisa shvatio činilo mi se kao optimalno rješenje...
manac5800
Napredujem
Napredujem
Posts: 103
Joined: 03-01-2011, 19:24

Re: 38kHz u Bascomu

Post by manac5800 »

ovako:
Config Portb.1 = Output
Config Portb.2 = Output
Tccr1a = 01010000
Tccr1b = 00001001
Ocr1a = 209
Ocr1b = 104

?
User avatar
InTheStillOfTheNight
Odlično uznapredovao
Odlično uznapredovao
Posts: 938
Joined: 01-06-2006, 17:54
Location: Zagreb

Re: 38kHz u Bascomu

Post by InTheStillOfTheNight »

Fast PWM i CTC za ono što ti trebaš rade identično... 38 khz možeš izbaciti u svim modovima TIMER-a koji dozvoljavaju novu TOP vrijednost TIMER-a. Ako se ne varam TIMER1 na ATMEGA8 bi trebao imati ICR registar, a ako ima mozes i njega postaviti da bude TOP vrijednost i onda za generiranje PWM-a koristiti oba OCR1A i OCR1B registra... Nisam ni gledao datasheet pa mi je ovaj nacin sa CTC-om prvi pao na pamet...

E sad radi li ovo tvoje spada u kategoriju onih pitanja za koje treba otvoriti datasheet i sve provjeriti ili jednostavno isprogramirati i zakvačiti osciloskop... Tek je 5 ujutro, sutra ti to mogu prekontrolirati kad se probudim oko navečer...
InTheStillOfTheNight
User avatar
InTheStillOfTheNight
Odlično uznapredovao
Odlično uznapredovao
Posts: 938
Joined: 01-06-2006, 17:54
Location: Zagreb

Re: 38kHz u Bascomu

Post by InTheStillOfTheNight »

Prvo mi nije jasno kako ce BASCOM znati koji je broj BIN a koji DEC? Ne znam kako se u bascomu pise bin zapis, ali se ovako ne pise sigurno:
Tccr1b = 00001001

Samo DEC brojevi nemaju nikakve hijeroglife prije broja.
InTheStillOfTheNight
User avatar
Kukinjos
Pravi forumaš
Pravi forumaš
Posts: 1724
Joined: 28-03-2012, 18:01
Location: Split

Re: 38kHz u Bascomu

Post by Kukinjos »

Evo, testirano s kristalom od 8MHz, iako mislim da bi mogao koristit i interni oscilator, manje je elemenata a pomak frekvencije neće biti značajan.

Code: Select all

$regfile = "m8def.dat"
$crystal = 8000000
$hwstack=40
$swstack=16
$framesize=32

Config Portb.1 = Output
Tccr1a = &B01010000
Tccr1b = &B00001001
Ocr1a = 104
Ocr1b = 52

Do

Loop
Cezare, star sam i nemoćan, ali poslušaj moj savjet ....
User avatar
InTheStillOfTheNight
Odlično uznapredovao
Odlično uznapredovao
Posts: 938
Joined: 01-06-2006, 17:54
Location: Zagreb

Re: 38kHz u Bascomu

Post by InTheStillOfTheNight »

Cek malo. Onako na pogled ovo ne moze biti taj CTC o kojem sam ja pisao...
T = 1/8 Mhz = 125 ns

Ako si ga ubacio u CTC sa TOP vrijednosti OCR1A onda je overflow nakon:
125 ns * (104+1) = 13,125 us

A frekvencija bi bila:
1/13,125us = 76190 Hz

Provjerio sam samo WGM bitove i vidim da je TIMER u CTC modu sa TOP vrijednosti OCR1A.
Mod je dobar, ali matematicki frekvencija je duplo veca, što me vodi prema postavkama COM-a za OC1B izlaz.
COM bitovi su 4 lijeva u TCCR1A registu, a u gornjem programu oni su:
TCCR1A = &B0101xxxx

Također nešto ne štima. Postavke COM-a (&B01) raditi će TOGGLE na linijama OCR1x, ali suludo su podešene za oba OC1A i OC1B izlaza.

Aha, dakle radiš toggle OCR1A na duplo većoj frekvenciji, i kad postaviš TOGGLE na TOP vrijednosti dobiti ćeš duplo manju frekvenciju sa 50% duty. Timer će za jedan krug uključiti izlaz, a sljedeći krug isključiti. Ovo već ima logike zašto radi, ali onda je OCR1B kao registar i njegove postavke COM-a nepotrebno podešavati...

Ja to inače radim da za COM odaberem &B10 ili &B11 i onda mi TIMER na BOTTOM-u setira OC izlaz a na COMPARE MATCH sa OCR1B registrom resetira. Onda TOP vrijednost u OCR1A registru mora odgovarati mojoj željenoj periodi.
InTheStillOfTheNight
User avatar
InTheStillOfTheNight
Odlično uznapredovao
Odlično uznapredovao
Posts: 938
Joined: 01-06-2006, 17:54
Location: Zagreb

Re: 38kHz u Bascomu

Post by InTheStillOfTheNight »

Po tome, ako sam dobro shvatio moralo bi raditi i ovo za OC1A izlaz:

Code: Select all

$regfile = "m8def.dat"
$crystal = 8000000
$hwstack=40
$swstack=16
$framesize=32

Config Portb.1 = Output
Tccr1a = &B01000000
Tccr1b = &B00001001
Ocr1a = 104

Do
Loop
InTheStillOfTheNight
User avatar
Kukinjos
Pravi forumaš
Pravi forumaš
Posts: 1724
Joined: 28-03-2012, 18:01
Location: Split

Re: 38kHz u Bascomu

Post by Kukinjos »

Radi, baš probao :)
Cezare, star sam i nemoćan, ali poslušaj moj savjet ....
User avatar
InTheStillOfTheNight
Odlično uznapredovao
Odlično uznapredovao
Posts: 938
Joined: 01-06-2006, 17:54
Location: Zagreb

Re: 38kHz u Bascomu

Post by InTheStillOfTheNight »

Ako sam dobro skuzio kolegu je prevarilo to sto je stavio COM postavke na TOGGLE izlaza i odmah dobio duplo manju frekvenciju na OC1A izlazu posto TIMER mora napraviti 2 kruga da izbaci jedan period, pa si ti samo povecao frekvenciju duplo :)

Ideja je bila drugacija, ali i ovo nije lose... Barem ima manje linija programa jer ne mora podesavati OCR1B :D
InTheStillOfTheNight
User avatar
Kukinjos
Pravi forumaš
Pravi forumaš
Posts: 1724
Joined: 28-03-2012, 18:01
Location: Split

Re: 38kHz u Bascomu

Post by Kukinjos »

Izgleda tako, uvijek u brzini zezneš periodu i poluperiodu. Toggle frekvenciju dijeli s 2 i poluperiode su simetrične, ako treba PWM s pomakom širine onda ide tvoje razmišljanje.
Cezare, star sam i nemoćan, ali poslušaj moj savjet ....
User avatar
InTheStillOfTheNight
Odlično uznapredovao
Odlično uznapredovao
Posts: 938
Joined: 01-06-2006, 17:54
Location: Zagreb

Re: 38kHz u Bascomu

Post by InTheStillOfTheNight »

Stvar je identična jer i druga metoda dijeli periodu na 2 identične poluperiode (ako dobro postavis TOP i OCR1B). Sloboda programiranja... Ako cemo tako gledati onda se ovo moze napraviti na barem 10 načina s TIMER-om... Najbolji je onaj koji radi :)
InTheStillOfTheNight
manac5800
Napredujem
Napredujem
Posts: 103
Joined: 03-01-2011, 19:24

Re: 38kHz u Bascomu

Post by manac5800 »

Hvala puno, ako vi kažete da radi onda valjda radi... ja nemam osciloskop da testiram, a TSOP 1738 mi ne detektira ovaj signal sa IR LED.. :S sad mi se samo nameće pitanje zašto...? ako je vjerovati OVOME ova se frekvencija treba "pojavljivati" u frekvenciji od 32Hz.. odn. 32 puta u sekundi se na detektoru treba pojaviti 38kHz... može li se to potpuno softverski ili da na drugom portu generiram 32Hz i pomoću tranzistora puštam 38kHz?
Post Reply