ATTiny 45/85 PWM problem
Moderators: pedja089, stojke369, trax, InTheStillOfTheNight
ATTiny 45/85 PWM problem
Problem se ne pojavljuje na svim chipovim - na nekima radi dobro, a neki pokazuju problem koji ću sad opisati. Sve je identično isprogramirano (program i fuses) a ipak neki rade, a neki ne. Programirano u Bascom-u. Chip radi na 8 Mhz, perioda ulaznih/izlaznih impulsa oko 500 uS.
Opis rada: na ulaz dolaze serijski podaci tako da je razmak konstantan, a širina impulsa označava 0, 1 ili sync. impuls. Promjena na ulazu generira interrupt. U interrupt rutini očitava se vrijednost timera0 koji mjeri širinu ulaznog impulsa. Izlaz je OC1A, timer1 je konfiguriran kao PWM. Izlaz je sinkroniziran s ulazom tako da je serijski izlaz kasni za jedan bit u odnosu na ulaz - na osnovu pročitane vrijednosti ulaza postavlja se vrijednost registra OCR1A na preddefiniranu vrijednost (regeneracija ulaznog signala). Vrijednost se upisuje u OCR1A registar unutar iste (i jedine) interrupt rutine (promjena na ulazu).
Problem je u tome što izgleda kao da ne prihvaća upis OCR1A registra, promjena PWM-a na izlazu je nekontrolirana, random reda veličine par sekundi, odnosno promjeni se svaki put kad fizički uklonim ili vratim ulazni signal (maknem ili vratim žicu). Ulaz očitava u redu, provjereno na drugim funkcijama. Zbunjuje me to što isti program na nekim chipovima radi dobro, a na drugima pokazuje ovu grešku. Isto i na Attiny 45 i 85.
Opis rada: na ulaz dolaze serijski podaci tako da je razmak konstantan, a širina impulsa označava 0, 1 ili sync. impuls. Promjena na ulazu generira interrupt. U interrupt rutini očitava se vrijednost timera0 koji mjeri širinu ulaznog impulsa. Izlaz je OC1A, timer1 je konfiguriran kao PWM. Izlaz je sinkroniziran s ulazom tako da je serijski izlaz kasni za jedan bit u odnosu na ulaz - na osnovu pročitane vrijednosti ulaza postavlja se vrijednost registra OCR1A na preddefiniranu vrijednost (regeneracija ulaznog signala). Vrijednost se upisuje u OCR1A registar unutar iste (i jedine) interrupt rutine (promjena na ulazu).
Problem je u tome što izgleda kao da ne prihvaća upis OCR1A registra, promjena PWM-a na izlazu je nekontrolirana, random reda veličine par sekundi, odnosno promjeni se svaki put kad fizički uklonim ili vratim ulazni signal (maknem ili vratim žicu). Ulaz očitava u redu, provjereno na drugim funkcijama. Zbunjuje me to što isti program na nekim chipovima radi dobro, a na drugima pokazuje ovu grešku. Isto i na Attiny 45 i 85.
Re: ATTiny 45/85 PWM problem
Lijepi pozdrav i tebi
Teško je nešto govoriti dok ne vidim program. Ako ne možeš pokazati cijeli program, onda barem izdvoji dio na kojem se javlja greška i stavi početak da se vidi kako su definirani timeri, varijable i ostalo…
Koju imaš verziju kompajlera?
Teško je nešto govoriti dok ne vidim program. Ako ne možeš pokazati cijeli program, onda barem izdvoji dio na kojem se javlja greška i stavi početak da se vidi kako su definirani timeri, varijable i ostalo…
Koju imaš verziju kompajlera?
Re: ATTiny 45/85 PWM problem
Toliko me ovo iznerviralo da sam zaboravio pozdrav
Pozdrav svima!
Na kraju sam uspio pronaći grešku. Nije bila stvar u upisu OCR1A registra nego u resetiranju TCNT1. Ako postavim TCNT1=0 problem se javlja, ali kod postavljanja TCNT1=255 radi uredno. E sad, zašto se kod nekih primjeraka problem javlja, akod drugih ne? Otprilike 3 od 5 komada rade normalno, a ostala 2 pokazuju probleme. Taj dio izgleda ovako:
Pozdrav svima!
Na kraju sam uspio pronaći grešku. Nije bila stvar u upisu OCR1A registra nego u resetiranju TCNT1. Ako postavim TCNT1=0 problem se javlja, ali kod postavljanja TCNT1=255 radi uredno. E sad, zašto se kod nekih primjeraka problem javlja, akod drugih ne? Otprilike 3 od 5 komada rade normalno, a ostala 2 pokazuju probleme. Taj dio izgleda ovako:
Code: Select all
If Din = 1 Then
Incr Bit_count
[b]Tcnt1 = 255 [/b]
Else
If Tcnt1 > 155 Then
Ocr1a = 200
Bit_count = 0
End If
Shift Data_in , Right
If Tcnt1 < 65 Then
Ocr1a = 20
Else
Ocr1a = 110
Data_in = Data_in + 128
End If
If For_me = 1 Then
Shift Data_out , Right
If Carry = 1 Then
Ocr1a = 110
Else
Ocr1a = 20
End If
End If
End If
Re: ATTiny 45/85 PWM problem
Pitao sam te za konfiguraciju timera iz razloga što je kod tiny45 timer1 8-bitni, a ne 16-bitni kao kod većine AVR, pa bascom zna krivo postaviti registre. Imao sam sličnih problema s time. Ovo sa tcnt1=255, hm.. čudno rješenje. Probaj da prije glavnog programa staviš OCR1C=&HFF, pošto taj registar sadrži TOP value u PWM modu (dokle će timer1 brojati). Ovako ti je taj registar 0, pa se tu čudne stvari događaju.
Re: ATTiny 45/85 PWM problem
OCR1C je postavljen na FF, nema razlike.
Re: ATTiny 45/85 PWM problem
Da, vjerojatno nisu registri postavljeni kako treba. Dobro, ako kažeš da ti radi onda neka bude kako je, inače ako bi ti ovo ubuduće radilo probleme evo topic gdje ti sve lijepo piše što i kako podesiti.
Ili najbolje datasheet u ruke pa si sam napraviš kako tebi najviše odgovara.
Ili najbolje datasheet u ruke pa si sam napraviš kako tebi najviše odgovara.
Re: ATTiny 45/85 PWM problem
Interesantno.... Pada mi na pamet još kompenzacija internog oscilatora. Atmel ostavlja 1 byte tvornički upisan sa kojim se oscilator "utjera" skoro na 8Mhz.
- InTheStillOfTheNight
- Odlično uznapredovao
- Posts: 938
- Joined: 01-06-2006, 17:54
- Location: Zagreb
Re: ATTiny 45/85 PWM problem
Bitna ti je stvar kada se radi update OCR1A i OCR1B registra. Svaki tvoj upis u OCR1A ili OCR1B registar ide u "temporaly location" i biti će unesen u OCR1A ili OCR1B tek kada timer nabroji do TOP vrijednosti. U tvom programu ti se dogodi to da ti timer ne stigne nabrojati do TOP vrijednosti jer ga prevariš sa ulaznim signalom koji ti konstantno postavlja TCNT1 na nulu.
I jadnik krene brojati, kao misli si sad će napraviti update OCR1A registra, kad kao uz kurac prije nego što stigne do 0xFF ponovno ti se okine ulazna vrijednost i restarta ti TCNT1 na nulu.
I bez obzira što ti uporno upisuješ OCR1A registar ti upisuješ vrijednosti u "Temporaly location", ali timer ti nikad ne stigne do 0xFF tako da ti se u OCR1A registar nikad ne upiše ova tvoja željena vrijednosti koja se nalazi u "Temporaly Location".
Zato ti stvar radi kada upises TCNT1 = 0xFF jer si tad postavio TIMER na kraj i on očito napravi update OCR1A registra iz temporaly lokacije.
Postoji još jedna nejasna stvar i često može zbuniti. Upis OCR registara je u trenutku kada timer nabroji do 0xFF...
(TCNT1 = 0xFF) - Ovako timer nije nabrojao do 0xFF nego smo ga direktno postavili na tu vrijednost. COMPARE FLAG registri se neće okiniti ako timer ne nabroji sam do 0xFF, a sad ne znam što se dogodi sa OCR1A update-om, trebalo bi malo prouciti.
Ja bi radije postavio TCNT1 vrijednost pri restartu na 254, a u svim uvjetima uračunao taj jedan bit i onda sam siguran da sam zadovoljio timer da nabroji sam do kraja. Uostalom pojma nemam šta će bascom tu umuljati pa ti je bolje dati i njemu malo vremena da dobro upise OCR1A temporaly value prije nego li brojac dojde do 0xFF.
Nesto ovako???
If Din = 1 Then
Incr Bit_count
Tcnt1 = 254
Else
If Tcnt1 > 154 Then
I jadnik krene brojati, kao misli si sad će napraviti update OCR1A registra, kad kao uz kurac prije nego što stigne do 0xFF ponovno ti se okine ulazna vrijednost i restarta ti TCNT1 na nulu.
I bez obzira što ti uporno upisuješ OCR1A registar ti upisuješ vrijednosti u "Temporaly location", ali timer ti nikad ne stigne do 0xFF tako da ti se u OCR1A registar nikad ne upiše ova tvoja željena vrijednosti koja se nalazi u "Temporaly Location".
Zato ti stvar radi kada upises TCNT1 = 0xFF jer si tad postavio TIMER na kraj i on očito napravi update OCR1A registra iz temporaly lokacije.
Postoji još jedna nejasna stvar i često može zbuniti. Upis OCR registara je u trenutku kada timer nabroji do 0xFF...
(TCNT1 = 0xFF) - Ovako timer nije nabrojao do 0xFF nego smo ga direktno postavili na tu vrijednost. COMPARE FLAG registri se neće okiniti ako timer ne nabroji sam do 0xFF, a sad ne znam što se dogodi sa OCR1A update-om, trebalo bi malo prouciti.
Ja bi radije postavio TCNT1 vrijednost pri restartu na 254, a u svim uvjetima uračunao taj jedan bit i onda sam siguran da sam zadovoljio timer da nabroji sam do kraja. Uostalom pojma nemam šta će bascom tu umuljati pa ti je bolje dati i njemu malo vremena da dobro upise OCR1A temporaly value prije nego li brojac dojde do 0xFF.
Nesto ovako???
If Din = 1 Then
Incr Bit_count
Tcnt1 = 254
Else
If Tcnt1 > 154 Then
InTheStillOfTheNight
- InTheStillOfTheNight
- Odlično uznapredovao
- Posts: 938
- Joined: 01-06-2006, 17:54
- Location: Zagreb
Re: ATTiny 45/85 PWM problem
Samo sam htio reci da OCR1A postavlja novo stanje PWM-a tek kad timer dođe do kraja, a tvoj program sa TCNT1 = 0 ne dozvoljava timeru da dođe do kraja ako je prisutan ulazni signal jer on resetira timer. ... Malo sam to opširno rekao al nadam se da kužiš...
InTheStillOfTheNight
Re: ATTiny 45/85 PWM problem
Ima logike. Stvarno mi nije palo na pamet da bi moglo biti zato što su OCR registri "double buffered".
No ipak, na ovo pitanje je jako teško sa sigurnošću dati odgovor.
No ipak, na ovo pitanje je jako teško sa sigurnošću dati odgovor.
cubi wrote:E sad, zašto se kod nekih primjeraka problem javlja, akod drugih ne? Otprilike 3 od 5 komada rade normalno, a ostala 2 pokazuju probleme.
- InTheStillOfTheNight
- Odlično uznapredovao
- Posts: 938
- Joined: 01-06-2006, 17:54
- Location: Zagreb
Re: ATTiny 45/85 PWM problem
Nije samo logično, nego je sigurno točno objašnjenje i sigurno točan razlog njegovog duha...Kizo wrote:Ima logike. Stvarno mi nije palo na pamet da bi moglo biti zato što su OCR registri "double buffered".
No ipak, na ovo pitanje je jako teško sa sigurnošću dati odgovor.cubi wrote:E sad, zašto se kod nekih primjeraka problem javlja, akod drugih ne? Otprilike 3 od 5 komada rade normalno, a ostala 2 pokazuju probleme.
Hahahaha Kizo, znaš mene: Agresivan, u tekstovima puno više napadački nego obrambeno, pa makar izgubio glavu datu ću odgovor na to teško pitanje:
Hm... razmišljam šta bi moglo biti
Hm... Analiziram ovako: Znaci problem je kad postavi TCNT1 = 0. Pitanje je malo zjebano jer se vjerojatno radi o uzorku procesora iz iste serije proizvodnje pa ne možemo odgovor tražiti u seriji atmelovih procesora, nego se moramo osloniti na ono što nije identično na tim procesorima:
Prva i osnovna stvar koja nije identična, valjda i jedina stvar koja nije identična je "FREKVENCIJA CLOCKA". To za sobom povlači sljedeće pitanje... Jeli moguće da zbog male varijacije na frekvenciji procesora dolazimo u situaciju da nekad timer stigne do 0xFF i napravi OCR1 Update a nekad ne stigne????
Ah evo upali mi se lampica u glavi:
Aha ima uvijet za TCNTq > 155, ali izlaz PWM-a stavlja na 200.
Analiziram:
Ako izlaz stavlja na 200 znaci da je ulaz vjerojatno oko 200, ali je on uzeo manju vrijednost uvijeta zbog sigurnog ocitanja...
Analiziram dalje i pogledam u datasheet u kojem je navedeno da frekvencija internog oscilatora može varirati +-10%
Uzmem najgori slučaj frekvencije tj 20% razlike i izračunam taj postotak na vrijednosti 8 bitnog timera.
Predpostavim da ulaz može biti i više od 200 ciklusa TIMERA (To bi provjerio debugiranjem ali naravno pisem iz glave i nemam tu mogucnost)
Kizo evo pitanje:
Ako na internoj frekvenciji koristimo vrijednosti za timer oko 200 jeli moguće da neki procesori zbog tolerancije internog clocka od 20% ne mogu napraviti overflow na TCNT1 brojacu i ne rade????????
InTheStillOfTheNight
- InTheStillOfTheNight
- Odlično uznapredovao
- Posts: 938
- Joined: 01-06-2006, 17:54
- Location: Zagreb
Re: ATTiny 45/85 PWM problem
Ako kazemo kako ce najlosiji procesor biti za 20 % sporiji (prema datasheetu) onda će naša frekvencija procesora biti za 160 kHz manja tj 7,84 Mhz.
Da ubacim malo mašte u tekst. Ako kaže da su mu ulazni i izlazni impulsi oko 500 uS, frekvencija procesora oko 8 000 000Hz, a vrijednosti OCR1A registra idu do 200 to znači da je sigurno odabrao prescaler timera /16.
Dokaz:
Djelim ulaznu frekvenciju sa prescalerom 16
8000 000/16 = 500 kHz
Jedan TIMER CLOCK je perioda frekvencije 500 kHz tj ili 0.000002 S
Timer će napraviti overflow nakon 255 tih perioda:
Množim 0.000002 * 255
Overflow je svakih 510 uS !!!!!!!!
Sa sigurnošću mogu reći da je koristen ovaj prescaler jer PWM postavlja na 200 što je malo manje od 500 uS perioda.... Bilo koji drugi prescaler ne bi bio niti blizu realnim vrijednostima OCR1A registra i vremenu od 500 uS.
Nadam se da je ovo dovoljan dokaz.... Imamo 20% tolaranije internog atmelovog procesora i 10 uS vremena da timer napravi ili ne napravi overflow na signalu od 500 uS.
Ulazni Signal je 500uS a naš timer ima overflow na 510 uS.... MALO JE GUSTO???
Da ubacim malo mašte u tekst. Ako kaže da su mu ulazni i izlazni impulsi oko 500 uS, frekvencija procesora oko 8 000 000Hz, a vrijednosti OCR1A registra idu do 200 to znači da je sigurno odabrao prescaler timera /16.
Dokaz:
Djelim ulaznu frekvenciju sa prescalerom 16
8000 000/16 = 500 kHz
Jedan TIMER CLOCK je perioda frekvencije 500 kHz tj ili 0.000002 S
Timer će napraviti overflow nakon 255 tih perioda:
Množim 0.000002 * 255
Overflow je svakih 510 uS !!!!!!!!
Sa sigurnošću mogu reći da je koristen ovaj prescaler jer PWM postavlja na 200 što je malo manje od 500 uS perioda.... Bilo koji drugi prescaler ne bi bio niti blizu realnim vrijednostima OCR1A registra i vremenu od 500 uS.
Nadam se da je ovo dovoljan dokaz.... Imamo 20% tolaranije internog atmelovog procesora i 10 uS vremena da timer napravi ili ne napravi overflow na signalu od 500 uS.
Ulazni Signal je 500uS a naš timer ima overflow na 510 uS.... MALO JE GUSTO???
InTheStillOfTheNight
- InTheStillOfTheNight
- Odlično uznapredovao
- Posts: 938
- Joined: 01-06-2006, 17:54
- Location: Zagreb
Re: ATTiny 45/85 PWM problem
Ulazni Signal je 500uS a naš timer ima overflow na 510 uS.... MALO JE GUSTO???
Bem mu edit toliko serem a nisam poantu napisao:
Priljepite ovim 510 uS 20% tolerancije atmelovog internog oscilatora i evo razlog zašto neki rade a neki ne rade...
Eeeeee disi kizo????
Samo da te upitam
Jeli teško sa sigurnošću dati odgovor na ovo pitanje???
Bem mu edit toliko serem a nisam poantu napisao:
Priljepite ovim 510 uS 20% tolerancije atmelovog internog oscilatora i evo razlog zašto neki rade a neki ne rade...
Eeeeee disi kizo????
Samo da te upitam
Jeli teško sa sigurnošću dati odgovor na ovo pitanje???
InTheStillOfTheNight
Re: ATTiny 45/85 PWM problem
Je.... Samo dobar poznavalac rada timera može na ovo odgovoriti sa sirgurnošću.. btw svaka čast.Jeli teško sa sigurnošću dati odgovor na ovo pitanje???
Meni se motalo po glavi da bi frekvenicja oscilatora jedino mogla biti različita kod svih procesora. Ostatak čipa je isti komad silicija. Taman sam bio pomislio da pogledam gdje mu se uklapa tih 500us, ali sam upravo i za toliko vremena zaboravio na to. (pišem PLC rutine za Bascom AVR)
Re: ATTiny 45/85 PWM problem
Očito nisam računao na element da neko tako jako može zagristi na ovu temu, ali vidim kod tebe to ne pali, ti kad ideš onda tjeraš do kraja. Pa makar računao period timera do ponoćiJeli teško sa sigurnošću dati odgovor na ovo pitanje???
Ali svaka čast i na stilu pisanja. Uvijek precizno objašnjeno, a istovremeno duhovito. Nema baš puno takvih postova. Uglavnom, Keep up the good work
- InTheStillOfTheNight
- Odlično uznapredovao
- Posts: 938
- Joined: 01-06-2006, 17:54
- Location: Zagreb
Re: ATTiny 45/85 PWM problem
Ove gore postove sam pisao on the fly i nisam previse pazio na logiku o kojoj govorim jer puno brze razmišljam nego što pišem pa se često dogodi da zaboravim napisati ono što je bitno, a napišem recimo kako je Đuro uhvatio lisicu u kokošinjcu.. No nevažno je sad to. Zaboravio sam napisati bitnu stvar:
Njegov period ulazne frekvencije ne može biti 500uS.
Jer da je 500 uS timer ne bi nikad nabrojao do 0xFF ....Zašto???
Vec sam naveo kako je timerov period 510uS i ako uzmem onu toleranciju od +-10% to znači da će period TIMERA1 varirati između 505 uS i 515 uS. Ako on resetira TIMER na 500 uS nikad se neće dogoditi 0xFF TIMERA.
Ako njemu neki procesori rade, a neki ne znači da mu period ulaznog signala mora biti u intervalu [505 uS - 515 uS] kako bi zadovolji uvijet greške koja se događa.
Opet ću razmišljati malo... Ako se njemu greška događa jer timer ne stigne napraviti overflow onda period njegovog ulaznog signala sigurno nije širi od 515 uS jer da je širi od toga sve bi super radilo.
No također mogu utvrditi da period njegovog ulaznog signala sigurno nije uži od 505 uS, jer ne bi radio niti jedan atmelov procesor.
No bez obzira na ovaj moj tekst kolega je dobro postavio pitanje jer je napisao kako je period ulazne frekvencije "oko 500uS", pa evo kolega ja sam malo precizniji pa ću napisati kako je period tvoje ulazne frekvencije u intervalu [505uS - 515uS] a vjerujem da je tocna vrijednost negdje oko 510 uS.
Ovo je jebeno specifičan BUG ako pogledaš da imaš ulaznu frekvenciju procesora, prescaler, registre timera i sve to skupa spojeno na neki ulazni signal i kad slučajno pogodiš ulaznom frekvencijom vrijednost TIMEROVOG perioda, i još uz vraga nisi računao da OCR1A radi UPDATE na 0xFF TIMERA onda to mogu izjednačiti sa rečenicom: UPRAVO SI DOBIO NA LUTRIJI.
Hvala @mbruck i @kizo na čestitkama, sam bi sebi čestitao, ali malo me stid
Njegov period ulazne frekvencije ne može biti 500uS.
Jer da je 500 uS timer ne bi nikad nabrojao do 0xFF ....Zašto???
Vec sam naveo kako je timerov period 510uS i ako uzmem onu toleranciju od +-10% to znači da će period TIMERA1 varirati između 505 uS i 515 uS. Ako on resetira TIMER na 500 uS nikad se neće dogoditi 0xFF TIMERA.
Ako njemu neki procesori rade, a neki ne znači da mu period ulaznog signala mora biti u intervalu [505 uS - 515 uS] kako bi zadovolji uvijet greške koja se događa.
Opet ću razmišljati malo... Ako se njemu greška događa jer timer ne stigne napraviti overflow onda period njegovog ulaznog signala sigurno nije širi od 515 uS jer da je širi od toga sve bi super radilo.
No također mogu utvrditi da period njegovog ulaznog signala sigurno nije uži od 505 uS, jer ne bi radio niti jedan atmelov procesor.
No bez obzira na ovaj moj tekst kolega je dobro postavio pitanje jer je napisao kako je period ulazne frekvencije "oko 500uS", pa evo kolega ja sam malo precizniji pa ću napisati kako je period tvoje ulazne frekvencije u intervalu [505uS - 515uS] a vjerujem da je tocna vrijednost negdje oko 510 uS.
Ovo je jebeno specifičan BUG ako pogledaš da imaš ulaznu frekvenciju procesora, prescaler, registre timera i sve to skupa spojeno na neki ulazni signal i kad slučajno pogodiš ulaznom frekvencijom vrijednost TIMEROVOG perioda, i još uz vraga nisi računao da OCR1A radi UPDATE na 0xFF TIMERA onda to mogu izjednačiti sa rečenicom: UPRAVO SI DOBIO NA LUTRIJI.
Hvala @mbruck i @kizo na čestitkama, sam bi sebi čestitao, ali malo me stid
InTheStillOfTheNight