ATTIny25 és PWM a Timer1-en

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Válasz küldése
Avatar
nszenteczki
Újonc
Újonc
Hozzászólások: 12
Csatlakozott: 2009. szeptember 17. csütörtök, 6:00

Hozzászólás Szerző: nszenteczki »

Sziasztok!

Kb 4 órája küzdök egy hw-es PWM-el ATtiny25-nél.

Átnéztem a könyvet, példaprogramokat, fórum, stb. és az adatlapot is, csak abba egy kicsit sok volt az adat nekem..
Ha az első regfile-t használom (m168def.dat) akkor simán lefordítja a Bascom (1.12), viszont a másodikkal nem (attiny25.dat)

Feltételeztem, hogy ennek menni kellene, mert van OC1A, és OC1B kivezetése, de fordításkor Assignment error-t ír a Pwm regiszterek írására (Pwm1a = 128
Pwm1b = 128)
Szoftveresen már rég megcsináltam volna, de a kihívás nem hagy nyugodni..
Mit gondoltok mi lehet az oka? Valami regisztereket kellene beállítgatni, vagy valami triviális hiba van?

'$regfile = "m168def.dat"
$regfile = "attiny25.dat"
$crystal = 8000000

Config Timer1 = Pwm , Pwm = 8 , Prescale = 64 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Down

Enable Timer1
Enable Interrupts
Start Timer1

Pwm1a = 128
Pwm1b = 128

Do

nop
Loop

End
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Bascom 1.12 1000+1 éves....
A DEMO-t töltsd le a www.mcselec.com oldalról...
Avatar
nszenteczki
Újonc
Újonc
Hozzászólások: 12
Csatlakozott: 2009. szeptember 17. csütörtök, 6:00

Hozzászólás Szerző: nszenteczki »

Köszönöm a gyors választ..
Frissítettem 2.0.7.1 -re, és most a timer konfigra is hibát ír: Unknown CONFIG parameter (PWM)

Lehet már fáradt vagyok , holnap friss fejjel átgondolom..
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Ha jobban megnézed a két adatlapot!
ATtiny25.DAT esetén:
Regiszterek
PWM0A= $29
PWM0B= $28
: Engedélyező bitek vannak! (A Regisztereknek más a nevük!)
PWM1A = 6 ; Pulse Width Modulator Enable
PWM1B = 6 ; Pulse Width Modulator B Enable
Adatlap: Engedélyező bitek vannak! (A Regisztereknek más a nevük!)
12.3.2 GTCCR – General Timer/Counter1 Control Register
• Bit 6 – PWM1B: Pulse Width Modulator B Enable
When set (one) this bit enables PWM mode based on comparator OCR1B in Timer/Counter1
and the counter value is reset to $00 in the CPU clock cycle after a compare match with OCR1C
register value.
• Bit 2 – TOV1: Timer/Counter1 Overflow Flag
In normal mode (PWM1A=0 and PWM1B=0) the bit TOV1 is set (one) when an overflow occurs
in Timer/Counter1. The bit TOV1 is cleared by hardware when executing the corresponding
interrupt handling vector. Alternatively, TOV1 is cleared, after synchronization clock cycle, by
writing a logical one to the flag.
In PWM mode (either PWM1A=1 or PWM1B=1) the bit TOV1 is set (one) when compare match
occurs between Timer/Counter1 and data value in OCR1C - Output Compare Register 1C.
When the SREG I-bit, and TOIE1 (Timer/Counter1 Overflow Interrupt Enable), and TOV1 are set
(one), the Timer/Counter1 Overflow interrupt is executed.

M168DEF.DAT Esetén pedig csak „PWM0A, PWM0B, és PWM2A, PWM2B” regiszterek vannak!
OCR0B=$28
PWM0B=$28
COMPARE0B=$28
OCR0A=$27
PWM0A=$27
……
PWM2B=$B4 ; - TIM2 -
COMPARE2B=$B4 ; - TIM2 -
OCR2A=$B3
:?:
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Valahogy így:

Kód: Egész kijelölése

 $regfile = "attiny25.dat"
 $crystal = 8000000
 ' Mivel csak 8bites Timerek vannak!
 Config Timer1 = Pwm , Prescale = 64 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Down


 Enable Timer1
 Enable Interrupts
 Start Timer1
 'PWM engedélyezése
 Set Tccr1.pwm1a
 Set Gtccr.pwm1b
Avatar
nszenteczki
Újonc
Újonc
Hozzászólások: 12
Csatlakozott: 2009. szeptember 17. csütörtök, 6:00

Hozzászólás Szerző: nszenteczki »

azt reggel észrevettem, hogy más regiszterek vannak és egy kicsit bele is bonyolódtam, mert túl sok regisztert találtam ami a PWM-el foglalkozott, de azért elkezdtem valami ilyesmit:

Tccr1 = &B10100001
Gtccr = &B00110000

ebbe se voltam teljesen biztos, hát még abba se hogy mit hagytam ki..
többször átolvastam hozzászólásod és a configot is, de ezt a két sort nem értem:
'PWM engedélyezése
Set Tccr1.pwm1a
Set Gtccr.pwm1b

"pwm1a" hatására mi íródik a regiszterbe? És miért pont ezt kell írni a Tccr1-hez, miért nem a Gtccr-hez? Persze örülök, hogy ez a megoldás csak nem értem. A Bascom súgóba se találtam..
Akkor elvileg, ha megadom, hogy
Ocr1a = 128
Ocr1b = 128
akkor, amikor eléri a számláló a 128-at, akkor az oc1a kimenet 0-ra, az oc1b kimentet pedig 1-re vált, és amikor a számláló túlcsordul (255 után), akkor mindkettő visszaáll az ellentétére? Tehát mindkét kimeneten 50%-os kitöltés jön létre, csak ellentétes fázisban? Bocs a sok kérdésért csak próbálom átlátni..
Avatar
nszenteczki
Újonc
Újonc
Hozzászólások: 12
Csatlakozott: 2009. szeptember 17. csütörtök, 6:00

Hozzászólás Szerző: nszenteczki »

megnyitottam a ATtiny25.DAT-ot. Nem ismerem az asm kódot, de valószínűsítem, hogy a gtccr regsizter 6. bitje = PWM1B -vel, és ha például megadjuk az előbb leírtakat ( Set Gtccr.pwm1b ) akkor az megfelel Gtccr = &B00100000 -nek? Illetve avval különbséggel, hogy a Set Gtccr.pwm1b csak egy bitet állít (a 6-ost), míg a Gtccr = &B00100000 pedig mind a 8-at..?
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Először is te az 5. Bitet piszkálod itt: „Gtccr = &B00100000”
A Bitek számozása 7-0-ig van: 76543210! Helyesen a 6.: Gtccr = &B01000000

Azért „Set Tccr1.pwm1a” mert ilyenkor csak a 6. Bitet állítod be!
Mivel általában az összes Bitnek van valamilyen módosító szerepe. És nem tudjuk, hogy éppen hogyan vannak beállítva, csak ha megvizsgáljuk.
Ezért nem jó ha élesben reseteljük az összes többit az Gtccr = &B01000000 utasítással.

Meg kel nézni az adatlapot, ha kíváncsi vagy melyik Regiszter, Egyes Bitjei mit állítanak be?
http://www.atmel.com/dyn/resources/prod ... oc2586.pdf
PDF Keresőbe beírod „PWM” és szépen végig lépkedsz vele, közben minden lényeges dolgot megtanulhatsz a témáról!
Tól- 80.: oldal: 11.9.1 GTCCR – General Timer/Counter Control Register
- 92.: oldal: 12.3.1 TCCR1 – Timer/Counter1 Control Register
Ig- 93.: 12.3.2 GTCCR – General Timer/Counter1 Control Register
És ami közte van mind a PWM működését magyarázza. Eléggé bonyolult feladatat, mire mindent jól beállítasz!

Jó tanulást!

:wink:
A Bascom ezt a feladatot általában elvégzi helyetted, de tudni kel, hogy mi az éppen használ t „attiny25” jellemzői.
Mert sokban különbözik a nagyobb „m168”-tól!
8)
A hozzászólást 1 alkalommal szerkesztették, utoljára kapu48 2011. december 3. szombat, 8:43-kor.
Avatar
nszenteczki
Újonc
Újonc
Hozzászólások: 12
Csatlakozott: 2009. szeptember 17. csütörtök, 6:00

Hozzászólás Szerző: nszenteczki »

Egyébként valahogy hasonlóan működne?:
ha megadom, hogy
Ocr1a = 128
Ocr1b = 128
akkor, amikor eléri a számláló a 128-at, akkor az oc1a kimenet 0-ra, az oc1b kimentet pedig 1-re vált, és amikor a számláló túlcsordul (255 után), akkor mindkettő visszaáll az ellentétére? Tehát mindkét kimeneten 50%-os kitöltés jön létre, csak ellentétes fázisban? Bocs a sok kérdésért csak próbálom átlátni..
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Igen!

És a frekvencia = (( crystal = 8000000) / (Prescale = 64) / 256)
:wink:
A hozzászólást 2 alkalommal szerkesztették, utoljára kapu48 2011. december 5. hétfő, 21:53-kor.
Avatar
nszenteczki
Újonc
Újonc
Hozzászólások: 12
Csatlakozott: 2009. szeptember 17. csütörtök, 6:00

Hozzászólás Szerző: nszenteczki »

Szuper! Köszönöm a segítséget. A fiam kért meg, hogy csináljak a távirányítós hajójához egy DC motor fordulatszám, és irányváltó elektronikát, ahol a vevőből érkező impulzusszélességnek megfelelő fordulatszám a cél. Ez még egyenlőre csak elmélet volt. Összerakom a kis panelt, és néhány nap múlva jelentkezem az eredménnyel.
Avatar
nszenteczki
Újonc
Újonc
Hozzászólások: 12
Csatlakozott: 2009. szeptember 17. csütörtök, 6:00

Hozzászólás Szerző: nszenteczki »

Az előzőekben javasolt módon tökéletesen működik a hw-es PWM. Köszönöm a segítségeteket, így a mai nap a "mikulás" meghozta szabályzóelektronikát :D

ui.: a PWM frekivel kapcsolatban csak annyit, ha jól gondolom, akkor az előzetesen említett számítást még el kell osztani 256-al (a 8bit timer esetén), és így kapjuk meg a PWM frekit. Én egyébként 16-os előosztót használtam 8Mhz-nél, így a számolás alapján kb. 2Khz-en megy most, ha jól hallom :lol: (frekimérő híján)
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Igen javítottam a képletet!

Köszi, a visszajelzést! Így tudom, hogy az elmélet bevált a gyakorlatban is.
:lol:
Válasz küldése