Sziasztok!
Szeretnék segítséget illetve tanácsot kérni egy projekthez.
A következőt szeretném hardwaresen megvalósítani: (bascom 2.0.7.8, atmega328) Adott egy kimenet jelenesetben Portb.2( OC1B ) , amin a kimenetet tudom állítani a frekvenciát(1-100Hz) és a kitöltési tényezőt (1-99%) a mindenkori frekvencia mellett.
Hogyan lenne célszerű megvalósítani ezt a feladatot?
Üdvözlettel:
Bence
Impulzus, kitöltési tényező generátor
Re: Impulzus, kitöltési tényező generátor
A PWM esetén csak fix leosztásod van az órajelből.
- tudsz számolni 0... TOP értékig (TOP általad állatható felső érték) -> ez adja a frekvenciát
- 0... TOP ezen belül állíthatod a PWM kitöltési tényezőt - de ha a 0...TOP az mondjuk úgy van állítva hogy 0...10, akkor 10%-os lehet csak a lépésközöd!
A feladat ez alapján:
1, A frekvencia ismeretében a legnagyobb TOP értéket érdemes választani és az előosztást is ennek megfelelően beállítani
2, Az OC1B jó kimenet, mert a belső TIMER1re van drótozva, ott 10/11/12 bites direktPWM is van , meg a TIMER1 is 16 bites.
3, kitöltési tényező a 0-100 leképezése a 0...TOP tartományra.
4, Timer INDÍT
5, főprogram, egyebek....
http://ww1.microchip.com/downloads/en/D ... asheet.pdf
Bascom alól ezt csak direkt regiszterhívásokkal lehet megtenni. Las az adatlap TIMER része.
- tudsz számolni 0... TOP értékig (TOP általad állatható felső érték) -> ez adja a frekvenciát
- 0... TOP ezen belül állíthatod a PWM kitöltési tényezőt - de ha a 0...TOP az mondjuk úgy van állítva hogy 0...10, akkor 10%-os lehet csak a lépésközöd!
A feladat ez alapján:
1, A frekvencia ismeretében a legnagyobb TOP értéket érdemes választani és az előosztást is ennek megfelelően beállítani
2, Az OC1B jó kimenet, mert a belső TIMER1re van drótozva, ott 10/11/12 bites direktPWM is van , meg a TIMER1 is 16 bites.
3, kitöltési tényező a 0-100 leképezése a 0...TOP tartományra.
4, Timer INDÍT
5, főprogram, egyebek....
http://ww1.microchip.com/downloads/en/D ... asheet.pdf
Bascom alól ezt csak direkt regiszterhívásokkal lehet megtenni. Las az adatlap TIMER része.
http://www.tavir.hu - a gazda
Re: Impulzus, kitöltési tényező generátor
Köszönöm a választ!
Végre van időm ismét foglalkozni a dologgal.
Szóval... már az elején elakadok, mármint nem tudom életre kelteni magát a timert sem a regiszterek beállításával.
A 328-as datasheetjének 109. oldalán van egy táblázat ami alapján lehet állítgatni a timer funkciókat. Én 14 illetve a 15 módjával próbálkoztam, ahol a kívánt frekvenciát icr1 illetve ocr1b -vel tudnám állítani a kitöltési tényezőt pedig pwm1b értékadással ha jól gondolom. Viszont akármit írok be a regiszterekbe nem indul el a timer. Bemásolom a program részletet:
$regfile = "m328pdef.dat"
$crystal = 8000000
'Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 256' ez csak próba volt hogy ezzel megy e egyáltalán
tccr1a=&b10100010
tccr1b=&b00011100
tccr1c=&b00000000
timsk1=&b00000111
tifr1=&b00100111
icr1=40000 ' ez lenne az ami a frekit meghatározza
pwm1b=50 ' ez pedig a kitöltési tényező
enable timer1
start timer1
Config Portd.1 = input 'enkóder
config int0=FALLING,nosave 'enkóder int0
enable int0
on int0 isr0
enable interrupts
do
loop
stb...
Kérlek nézzetek már rá , hogy mit rontok el. Köszönök minden választ
Végre van időm ismét foglalkozni a dologgal.
Szóval... már az elején elakadok, mármint nem tudom életre kelteni magát a timert sem a regiszterek beállításával.
A 328-as datasheetjének 109. oldalán van egy táblázat ami alapján lehet állítgatni a timer funkciókat. Én 14 illetve a 15 módjával próbálkoztam, ahol a kívánt frekvenciát icr1 illetve ocr1b -vel tudnám állítani a kitöltési tényezőt pedig pwm1b értékadással ha jól gondolom. Viszont akármit írok be a regiszterekbe nem indul el a timer. Bemásolom a program részletet:
$regfile = "m328pdef.dat"
$crystal = 8000000
'Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 256' ez csak próba volt hogy ezzel megy e egyáltalán
tccr1a=&b10100010
tccr1b=&b00011100
tccr1c=&b00000000
timsk1=&b00000111
tifr1=&b00100111
icr1=40000 ' ez lenne az ami a frekit meghatározza
pwm1b=50 ' ez pedig a kitöltési tényező
enable timer1
start timer1
Config Portd.1 = input 'enkóder
config int0=FALLING,nosave 'enkóder int0
enable int0
on int0 isr0
enable interrupts
do
loop
stb...
Kérlek nézzetek már rá , hogy mit rontok el. Köszönök minden választ
Re: Impulzus, kitöltési tényező generátor
Tipp: bascom szimulátorban nézd meg hogy a TIMER regiszterek tényleg beállnak-e. Illetve a config TIMER1= sorral fordítva is hogy áll be...
http://www.tavir.hu - a gazda
Re: Impulzus, kitöltési tényező generátor
Köszi a tippet, ez eszembe se jutott , mármint a szimulátor.
Szóval Config timer -el a TCCr1a és TCCr1b Tifr1 Timsk1 beáll a konfigolás szerint, viszont a regiszterek közvetlen írásával a TCCr1bés a TCCr1c nem íródik beléjük semmi , mármint csak a nulla H00. Ilyenkor mit lehet tenni vagy mi lehet a baj?
Szóval Config timer -el a TCCr1a és TCCr1b Tifr1 Timsk1 beáll a konfigolás szerint, viszont a regiszterek közvetlen írásával a TCCr1bés a TCCr1c nem íródik beléjük semmi , mármint csak a nulla H00. Ilyenkor mit lehet tenni vagy mi lehet a baj?
Re: Impulzus, kitöltési tényező generátor
Sziasztok!
Megírom, mert sikerült rájönnöm, hogy miért nem indult el a timer1-em.
Ahogyan írtam korábban , hogy a TCCR1A-t sikeresen értéket tudok adni, viszont a TCCR1B-C-t ahol a prescalet, módokat, stb-t lehet beállítani 0 értéket vesznek fel.
A probléma ott volt, hogy ezek után engedélyeztem és indítottam a timert (enable timer1, start timer1), addig próbálkoztam szimulátorral, hogy végül kiderült számomra , hogy ez a két sor írja át a B és a C regisztert. Elhagytam a start és az enable timert és egyből működött.
Robi köszönöm szépen a segítséged!
config PORTD.4=input 'encoder
config int0=FALLING,nosave
enable int0
on int0 isr0
config int1=FALLING,nosave
enable int1
on int1 isr1
tccr1a=&b00100010
tccr1b=&b00011100
icr1=&h7a11
Config Portb.2 = Output ' LED
config PORTD.5=INPUT ' on/off
config PORTD.6=INPUT 'kitöltés/ frekvencia
enable interrupts
dim frequency as integer
dim duty as integer
dim enc_tact as bit 'kitöltés/ frekvencia
dim c as bit ' oled szubrutn bit
dim enable_out as bit
c=0
declare sub oled
'Call Lcd_clear(black)
'Restore Pic1
'Call Lcd_show_bgf(1 , 0)
'Call Lcd_show()
Call Lcd_box(1 , 25 , 128 , 64 , 0 , White)
Call Lcd_line(1 , 40 , 128 , 40 , 1 , White)
Call Lcd_line(64 , 40 , 64 , 64 , 1 , White)
Call Lcd_text( "Frequency" , 5 , 30 , 1)
Call Lcd_text( "DutyCycle" , 70 , 30 , 1)
Call Lcd_show()
oled
do
if c=1 then oled
Loop
isr0:
waitms 100
toggle enc_tact
return
isr1:
if enc_tact=0 then
if pind.4=1 and pind.3=0 then
incr frequency
if frequency>99 then frequency=99
else
decr frequency
if frequency<1 then frequency=1
end if
end if
if enc_tact=1 then
if pind.4=1 and pind.3=0 then
incr duty
if duty>99 then duty=99
else
decr duty
if duty<1 then duty=1
end if
end if
icr1=31249/frequency
pwm1b=icr1/100
pwm1b=pwm1b*duty
c=1
return
Megírom, mert sikerült rájönnöm, hogy miért nem indult el a timer1-em.
Ahogyan írtam korábban , hogy a TCCR1A-t sikeresen értéket tudok adni, viszont a TCCR1B-C-t ahol a prescalet, módokat, stb-t lehet beállítani 0 értéket vesznek fel.
A probléma ott volt, hogy ezek után engedélyeztem és indítottam a timert (enable timer1, start timer1), addig próbálkoztam szimulátorral, hogy végül kiderült számomra , hogy ez a két sor írja át a B és a C regisztert. Elhagytam a start és az enable timert és egyből működött.
Robi köszönöm szépen a segítséged!
config PORTD.4=input 'encoder
config int0=FALLING,nosave
enable int0
on int0 isr0
config int1=FALLING,nosave
enable int1
on int1 isr1
tccr1a=&b00100010
tccr1b=&b00011100
icr1=&h7a11
Config Portb.2 = Output ' LED
config PORTD.5=INPUT ' on/off
config PORTD.6=INPUT 'kitöltés/ frekvencia
enable interrupts
dim frequency as integer
dim duty as integer
dim enc_tact as bit 'kitöltés/ frekvencia
dim c as bit ' oled szubrutn bit
dim enable_out as bit
c=0
declare sub oled
'Call Lcd_clear(black)
'Restore Pic1
'Call Lcd_show_bgf(1 , 0)
'Call Lcd_show()
Call Lcd_box(1 , 25 , 128 , 64 , 0 , White)
Call Lcd_line(1 , 40 , 128 , 40 , 1 , White)
Call Lcd_line(64 , 40 , 64 , 64 , 1 , White)
Call Lcd_text( "Frequency" , 5 , 30 , 1)
Call Lcd_text( "DutyCycle" , 70 , 30 , 1)
Call Lcd_show()
oled
do
if c=1 then oled
Loop
isr0:
waitms 100
toggle enc_tact
return
isr1:
if enc_tact=0 then
if pind.4=1 and pind.3=0 then
incr frequency
if frequency>99 then frequency=99
else
decr frequency
if frequency<1 then frequency=1
end if
end if
if enc_tact=1 then
if pind.4=1 and pind.3=0 then
incr duty
if duty>99 then duty=99
else
decr duty
if duty<1 then duty=1
end if
end if
icr1=31249/frequency
pwm1b=icr1/100
pwm1b=pwm1b*duty
c=1
return