time3r on atmega64
time3r on atmega64
Sziasztok, egy kis segítségre lenne szükségem.
a 64as ATmegán szeretném használni a 3as timert(16bit)
méghozzá a 14 es üzemmódban amelynél az ICR3H és ICR3L val lehet definiálni a számláló maximális értékét.
Az OCR3A,OCR3B,OCR3C vel akarom beállítani a komparálási értékeket,
a datasheetnek megfelelően beállítottam a TCCR3A, TCCR3B, regisztereket, + a timerhez kapcsolódó port-irányregisztert, de sem a szimulációban de sem a szimulációban sem a kontolleren nem az történik amit várok.
a kód a következő:
#include "m64def.inc"
.org 0x0000
rjmp init
init:
cli
ldi r16, LOW(RAMEND)
out SPL, r16
ldi r16, HIGH(RAMEND)
out SPH, r16
ldi r16,0x08
sts OCR3AH,r16
ldi r16,0x00
sts OCR3AL,r16
ldi r16,0x08
sts OCR3BH,r16
ldi r16,0x00
sts OCR3BL,r16
ldi r16,0x08
sts OCR3CH,r16
ldi r16,0x00
sts OCR3CL,r16
ldi r16, 0xFF
out DDRE, r16
ldi r16,0xAA
sts TCCR3A,r16
ldi r16,0x1A
sts TCCR3B,r16
ldi r16, 0xEE
sts ICR3H, r16
ldi r16,0x00
sts ICR3L,r16
sei
rjmp loop
loop:
rjmp loop
a 64as ATmegán szeretném használni a 3as timert(16bit)
méghozzá a 14 es üzemmódban amelynél az ICR3H és ICR3L val lehet definiálni a számláló maximális értékét.
Az OCR3A,OCR3B,OCR3C vel akarom beállítani a komparálási értékeket,
a datasheetnek megfelelően beállítottam a TCCR3A, TCCR3B, regisztereket, + a timerhez kapcsolódó port-irányregisztert, de sem a szimulációban de sem a szimulációban sem a kontolleren nem az történik amit várok.
a kód a következő:
#include "m64def.inc"
.org 0x0000
rjmp init
init:
cli
ldi r16, LOW(RAMEND)
out SPL, r16
ldi r16, HIGH(RAMEND)
out SPH, r16
ldi r16,0x08
sts OCR3AH,r16
ldi r16,0x00
sts OCR3AL,r16
ldi r16,0x08
sts OCR3BH,r16
ldi r16,0x00
sts OCR3BL,r16
ldi r16,0x08
sts OCR3CH,r16
ldi r16,0x00
sts OCR3CL,r16
ldi r16, 0xFF
out DDRE, r16
ldi r16,0xAA
sts TCCR3A,r16
ldi r16,0x1A
sts TCCR3B,r16
ldi r16, 0xEE
sts ICR3H, r16
ldi r16,0x00
sts ICR3L,r16
sei
rjmp loop
loop:
rjmp loop
tökéletesen jó bascomban is lefordítom ..
amugy itt nem kell enable timer mivel ugy engedélyezed h a TCCR3B ben 0 tól különböző órajel osztót állítasz be.
bár érdekelne nagyon h bascomban valaki el tudja indítani ezt a timert 14 es üzemmódban, és ha el akkor mind a három compare unit megy-e.
Az Atmeles supporterektől kérdeztem már, de nem tudták..
előre is köszi.
amugy itt nem kell enable timer mivel ugy engedélyezed h a TCCR3B ben 0 tól különböző órajel osztót állítasz be.
bár érdekelne nagyon h bascomban valaki el tudja indítani ezt a timert 14 es üzemmódban, és ha el akkor mind a három compare unit megy-e.
Az Atmeles supporterektől kérdeztem már, de nem tudták..
előre is köszi.
14-es üzemmód?
Bascomban amik vannak (lsd súgó):
A TimerCompare egymástól függetlenek. Miért ne menne?
Sajna nincsen M64/128-am panelen - még.
Bascomban amik vannak (lsd súgó):
Kód: Egész kijelölése
CONFIG TIMER0 = COUNTER , PRESCALE= 1|8|64|256|1024 ,
EDGE=RISING/FALLING , CLEAR TIMER = 1|0
CONFIG TIMER0 = TIMER , PRESCALE= 1|8|64|256|1024
CONFIG TIMER1 = COUNTER | TIMER | PWM ,
EDGE=RISING | FALLING , PRESCALE= 1|8|64|256|1024 ,
NOISE CANCEL=0 |1, CAPTURE EDGE = RISING | FALLING ,
CLEAR TIMER = 1|0,
COMPARE A = CLEAR | SET | TOGGLE I DISCONNECT ,
COMPARE B = CLEAR | SET | TOGGLE I DISCONNECT ,
PWM = 8 | 9 10 ,
COMPARE A PWM = CLEAR UP| CLEAR DOWN | DISCONNECT
COMPARE B PWM = CLEAR UP| CLEAR DOWN | DISCONNECT
Sajna nincsen M64/128-am panelen - még.
-
sanzol
codevisionnal kipróbáltam. a regisztereket ugyanúgy állítja be mint ahogy én tettem. de úgy sem megy. közben találtam egy német fórumot, ott egy srác ugyanezzel a problémával küzd, de ők sem jutottak semmire. ők ráfogták arra hogy rossz a szimuláció. pedig sztem csak valami apróság elkerüli a figyelmet.
robert: az ICR3 regiszter egy input capture regiszter arra való hogy amikor a timert input capture üzemmódban használad akkor amikor megérkezik a triggerjel(fel v lefutó él) akkor a timer értéke ezekben a regiszterekben tárolódik. DE van egy olyan pwm üzemmód a datasheet szerint a 14es amikor ezeket a regisztereket nem a valós rendeltetési céljukra használjuk hanem például beállítjuk vele hogy a 16 bites számláló ne 65535-t hanem az ICR3H,ICR3L regiszterben lévő értéket tekintse max értéknek.
arra kellene például hogy akármilyen kvarc mellett mindenféle interrupt használata nélkül tudjak előállítani akármilyen periódusidőket.
interrupt használatával megoldható máshogy is sokkal egyszerűbben , de ebben a projectben véletlenszerüen jönnek más interruptok, így volt olyan hogy a timer interruptok miatt lekéstem egy pontos kiszolgálásáról.
robert: az ICR3 regiszter egy input capture regiszter arra való hogy amikor a timert input capture üzemmódban használad akkor amikor megérkezik a triggerjel(fel v lefutó él) akkor a timer értéke ezekben a regiszterekben tárolódik. DE van egy olyan pwm üzemmód a datasheet szerint a 14es amikor ezeket a regisztereket nem a valós rendeltetési céljukra használjuk hanem például beállítjuk vele hogy a 16 bites számláló ne 65535-t hanem az ICR3H,ICR3L regiszterben lévő értéket tekintse max értéknek.
arra kellene például hogy akármilyen kvarc mellett mindenféle interrupt használata nélkül tudjak előállítani akármilyen periódusidőket.
interrupt használatával megoldható máshogy is sokkal egyszerűbben , de ebben a projectben véletlenszerüen jönnek más interruptok, így volt olyan hogy a timer interruptok miatt lekéstem egy pontos kiszolgálásáról.
Ilyet a Bascom direktben nem tud.
Erre ami lehet:
INTen belül a startértéket adod meg. Ez néhány órajel, ha nem kell SRAMból kivenni az értéket.
Az INT rutinban a be/kilépés regisztermentései 20-25 órajelet jelentenek.
Ha nagyon sűrű INT van, és nem megenegedhető az idővesztesség (20 MHz kristály esetén ez ~0.8-1 MHz INT kiszolgálást jelent, azaz ~1usec késést) akkor ide kevés a AVR chip.
De ha több INT esik be egyidőben, akkor az egyik INT rutinból visszatérve automatikusan a következő INTre ugrik. Azaz nem veszik el INT. Nézd meg az INTERRUPT fejezetet. Ott van ez a probléma kivesézve... Mármint hogyan legyen a legrövidebb az INT és mi van ha túl sokat időzik a INT alatt.
Én nem mernék nem túl gyakori/szabványos megoldást használni....
Nem lehet a prg-t átírni? vagy más megoldás esetleg?
Ha nagyon INT igényes a feladat, akkor ARM, AVR32 proci javasolt.... Ezek 66-400 MHzn járnak... de sztem ez ágyú-veréb esete....
Erre ami lehet:
INTen belül a startértéket adod meg. Ez néhány órajel, ha nem kell SRAMból kivenni az értéket.
Az INT rutinban a be/kilépés regisztermentései 20-25 órajelet jelentenek.
Ha nagyon sűrű INT van, és nem megenegedhető az idővesztesség (20 MHz kristály esetén ez ~0.8-1 MHz INT kiszolgálást jelent, azaz ~1usec késést) akkor ide kevés a AVR chip.
De ha több INT esik be egyidőben, akkor az egyik INT rutinból visszatérve automatikusan a következő INTre ugrik. Azaz nem veszik el INT. Nézd meg az INTERRUPT fejezetet. Ott van ez a probléma kivesézve... Mármint hogyan legyen a legrövidebb az INT és mi van ha túl sokat időzik a INT alatt.
Én nem mernék nem túl gyakori/szabványos megoldást használni....
Nem lehet a prg-t átírni? vagy más megoldás esetleg?
Ha nagyon INT igényes a feladat, akkor ARM, AVR32 proci javasolt.... Ezek 66-400 MHzn járnak... de sztem ez ágyú-veréb esete....
hmhh köszönöm, még gondolkozok, keresem a hibát..
azt tudom hogy a bascom sok mindent nem tud amit assamblyben simán meg lehet csinálni, ezért is nem használom. bár kommersz célokra tökéletes.
a két interrupt várakozik esetében meg az a baj hogy egyik sem várakozhat semmit, mindet ki kell szolgálni amint lehet, mert pontatlanságot okoz.
Avr32?Arm?
avr32-t nem ismerem, bár sok jót olvastam felőle
Arm memóriakezelése nem tetszik
ha bonyolultabb feladat van akkor inkább tms320.
amugy igazad lehet inkább megfogom a dolgot vmi más megközelítésben de az ágyút a nagy vadakra kell tartogatni , ide jó a puska is

azt tudom hogy a bascom sok mindent nem tud amit assamblyben simán meg lehet csinálni, ezért is nem használom. bár kommersz célokra tökéletes.
a két interrupt várakozik esetében meg az a baj hogy egyik sem várakozhat semmit, mindet ki kell szolgálni amint lehet, mert pontatlanságot okoz.
Avr32?Arm?
avr32-t nem ismerem, bár sok jót olvastam felőle
ha bonyolultabb feladat van akkor inkább tms320.
amugy igazad lehet inkább megfogom a dolgot vmi más megközelítésben de az ágyút a nagy vadakra kell tartogatni , ide jó a puska is
Bascomban ezért lehet szüksé ASM betétekre...
A C-vel ugyanez a helyzet....
Ennire INT kitikus nem lehet vmi! Ezt egyetlen chippel akkor nem tudod megoldani....
A PC-n in 10msec érzékenységgel dolgozik. Amúgy egyetlen chip sem lalmas 2 int _egyidejű_ lkezelésére, hacsak nem többmagvas... De ez már nem a kontrollerek világa...
Atomelemzések a cél?
Nálam 1-2 msec be zkott férni. Ha meg frekvenciamérés kell pl, ahhoz cél IC-t kell illeszteni a AVRre...
A C-vel ugyanez a helyzet....
Ennire INT kitikus nem lehet vmi! Ezt egyetlen chippel akkor nem tudod megoldani....
A PC-n in 10msec érzékenységgel dolgozik. Amúgy egyetlen chip sem lalmas 2 int _egyidejű_ lkezelésére, hacsak nem többmagvas... De ez már nem a kontrollerek világa...
Atomelemzések a cél?
Nálam 1-2 msec be zkott férni. Ha meg frekvenciamérés kell pl, ahhoz cél IC-t kell illeszteni a AVRre...
