|
|
Elektronika.lt portalo forumas
Jūs esate neprisijungęs lankytojas. Norint dalyvauti diskusijose, būtina užsiregistruoti ir prisijungti prie forumo.
Prisijungę galėsite kurti naujas temas, atsakyti į kitų užduotus klausimus, balsuoti forumo apklausose.
Administracija pasilieka teisę pašalinti pasisakymus bei dalyvius,
kurie nesilaiko forumo taisyklių.
Pastebėjus nusižengimus, prašome pranešti.
Dabar yra 2024 12 24, 22:17. Visos datos yra GMT + 2 valandos.
|
|
|
|
Forumas » Mikrovaldikliai » ATMEGA8 PWM:)
|
Jūs negalite rašyti naujų pranešimų į šį forumą Jūs negalite atsakinėti į pranešimus šiame forume Jūs negalite redaguoti savo pranešimų šiame forume Jūs negalite ištrinti savo pranešimų šiame forume Jūs negalite dalyvauti apklausose šiame forume
|
|
|
Puslapis 1 iš 2 Pereiti prie 1, 2 Toliau |
|
|
ATMEGA8 PWM:) |
Parašytas: 2006 07 15, 20:58 |
|
|
|
Kodas: |
#include <avr/io.h>
#include <avr/iom8.h>
#include <avr/delay.h>
char pwm;
int i;
int main()
{
TCCR1A = 0xFF;
OCR1A = 127;
while(1)
{
pwm++;
for(i=0;i<10000;i++);
OCR1A = pwm;
}
return 0;
} |
niekaip nepavyksta paleist Timer1 PWM'o ką reikia rašyt į tą TCCR1A = ???; Ar galima tą PWM paleist ant betkurios kojos ar tik ant 15PIN'o - OC1A? |
|
|
|
|
|
ATMEGA8 PWM:) |
Parašytas: 2006 07 15, 21:13 |
|
|
|
Gal datasheet'ą paskaityk
TCCR1A = (1 << WGM10)|(1 << WGM12)|(1 << COM1A1)|(1 << COM1A0)|(1 << COM1B1)|(1 << COM1B0);
Turėtų veikt.
Citata: |
Ar galima tą PWM paleist ant betkurios kojos ar tik ant 15PIN'o - OC1A? |
Tik ant 15. Nebent darysi Softwarinš PWM. |
|
_________________ Teorija - kai viską žinai, bet niekas neveikia,
Praktika - kai viskas veikia, bet nežinai kodėl.
Skype : VytautasRX |
|
|
|
|
|
ATMEGA8 PWM:) |
Parašytas: 2006 07 15, 21:31 |
|
|
|
Kodas: |
#include <avr/io.h>
#include <avr/iom8.h>
#include <avr/delay.h>
char pwm;
int i;
int main()
{
DDRB = 0b00000110;
PORTB = 0b00000110;
TCCR1A = (1<<WGM10)|(1<<COM1A1)|(1<<COM1B1);
TCCR1B = 0x03; // prescaler 1/64
OCR1A = 0;
OCR1B = 255;
while(1)
{
pwm++;
for(i=0;i<10000;i++);
OCR1A = pwm;
OCR1B = 255-pwm;
}
return 0;
} |
valio gavosi kažkas
pasinaudojau tavo patarimu paskaityt datasheet'ą ir visai beveik turbut supratau kame čia kampas
tik vat pagal ką dabar PWM dažnį suskaičiuot?
f=16000000/2*64*TOP
kas tas top? |
|
|
|
|
|
ATMEGA8 PWM:) |
Parašytas: 2006 07 15, 21:50 |
|
|
|
TOP tai taspats kas PWM plotis, pvz. 8bitų pwm top yra 256, 9 bitų top 512, 10 bitų 1024. |
|
_________________ Teorija - kai viską žinai, bet niekas neveikia,
Praktika - kai viskas veikia, bet nežinai kodėl.
Skype : VytautasRX |
|
|
|
|
ATMEGA8 PWM:) |
Parašytas: 2006 07 15, 21:52 |
|
|
|
Citata: |
f=16000000/2*64*TOP |
Teisingiau būtų: f=16000000/(2*64*TOP) arba f=16000000/2/64/TOP |
|
_________________ Teorija - kai viską žinai, bet niekas neveikia,
Praktika - kai viskas veikia, bet nežinai kodėl.
Skype : VytautasRX |
|
|
|
|
|
ATMEGA8 PWM:) |
Parašytas: 2006 07 15, 22:25 |
|
|
|
A dabar supratau, radau lentelę datasheet'e ten surašyti PWM nustatymai ir top reikšmės...
tai čia gaunas 8bitų PWM top bus 255 o dažnis 488Hz
488=16000000/(2*64*255)
blin bet tam hardwarinem pwm'e labai jau mažas pasirinkimas dažnių
negalima pvz 66666Hz
čia nelabai į temą bet idomu ar AVR'ai turi tokį daiktą kaip thread's(kaip normaliuose PC)?
nu vnz kad kelias funkcijas vykdyti vienu metu?
skaičiau, kad kažką ten su interuptais reik daryt, bet interuptai pertraukia pagrindinį procesą.. ir vistiek gaunasi, kad vykdomos funkcijos tik esančios interupte...
ir dar vienas klausimas dėl char tipo kintamųjų..
Kodas: |
cahr pwm;
...
while(1)
{
while(pwm < 255)
{
pwm++;
for(i=0;i<10000;i++);
OCR1A = pwm;
OCR1B = 255-pwm;
}
while(pwm > 0)
{
pwm--;
for(i=0;i<10000;i++);
OCR1A = pwm;
OCR1B = 127-pwm;
}
} |
kompiliatorius prisikabino, kad while(pwm < 255)
visada true, nesupratau kame čia kampas, parašiau 127 viskas ok..
tai avr'uose char tipo kintamieji 7 bitų ar čia nuo kompiliatoriaus(WinAVR+AvrStudio4) priklauso? |
|
|
|
|
|
|
ATMEGA8 PWM:) |
Parašytas: 2006 07 15, 22:48 |
|
|
|
Citata: |
A dabar supratau, radau lentelę datasheet'e ten surašyti PWM nustatymai ir top reikšmės...
tai čia gaunas 8bitų PWM top bus 255 o dažnis 488Hz
488=16000000/(2*64*255)
blin bet tam hardwarinem pwm'e labai jau mažas pasirinkimas dažnių
negalima pvz 66666Hz |
Taip pasirinkimas mažas, iš bėdos galima kombinuotis su išorinio kvarco dažniu, dalikliu, PWM pločiu.
Citata: |
čia nelabai į temą bet idomu ar AVR'ai turi tokį daiktą kaip thread's(kaip normaliuose PC)?
nu vnz kad kelias funkcijas vykdyti vienu metu?
skaičiau, kad kažką ten su interuptais reik daryt, bet interuptai pertraukia pagrindinį procesą.. ir vistiek gaunasi, kad vykdomos funkcijos tik esančios interupte... |
Šituo klausimu dėja nepadėsiu
Citata: |
kompiliatorius prisikabino, kad while(pwm < 255)
visada true, nesupratau kame čia kampas, parašiau 127 viskas ok..
tai avr'uose char tipo kintamieji 7 bitų ar čia nuo kompiliatoriaus(WinAVR+AvrStudio4) priklauso? |
Aš pats tik su IAR programuoju, tai nzn, o jei char'ą pakeisi int'u vistiek taspats? |
|
_________________ Teorija - kai viską žinai, bet niekas neveikia,
Praktika - kai viskas veikia, bet nežinai kodėl.
Skype : VytautasRX |
|
|
|
|
|
ATMEGA8 PWM:) |
Parašytas: 2006 07 15, 23:38 |
|
|
|
su int viskas gerai, bet char mažiau vietos užima
ir šiaip gera char savybė, kad jeigu viršija 127 vėl skaičiuojasi nuo 0...
o integer'is nugrybauja kažkur į minuso pusę jeigu viršija MAX_INT ribą.. |
|
|
|
|
|
ATMEGA8 PWM:) |
Parašytas: 2006 07 16, 00:48 |
|
|
|
del keliiu programu vienu metu vienintelis budas ta padaryti sudeti kelis procesorius, PC negali sito daryti geriau nei atmega.
windows naudoja taimeri ir pertraukimus programu perjunginejimui. vienu metu programos nevykdomos.
pertaukimai labai neblogai leidzia padaryti viska ko tokiais atvejais reikia,
tiesiog padaryk interupto funkcija trumpa, kad nerukdytu likusiai programai.
arka pasinaudok kokia nors RTOS sistema, yra paruostu C moduliu kurie ledzia vykdyti kelias programas beveik vienu metu.
del int jei nenori nesamoniu, naudok unsigned int ir unsigned char o tai pasitaiko nesuprantamu kvailysciu su programa |
|
|
|
|
|
ATMEGA8 PWM:) |
Parašytas: 2006 07 16, 09:42 |
|
|
|
nu aišku tada, bet niekur nerandu kaip padaryt interrupt on port change? kad paspaudus mygtuką būtų vykdomas interrupt'as...
ar atmega neturi tokios funkcijos? |
|
|
|
|
|
ATMEGA8 PWM:) |
Parašytas: 2006 07 16, 10:07 |
|
|
|
Citata: |
nu aišku tada, bet niekur nerandu kaip padaryt interrupt on port change? kad paspaudus mygtuką būtų vykdomas interrupt'as...
ar atmega neturi tokios funkcijos? |
Turi. Žiūrėk išorinius interruptus int0 ir int1. Aišku mygtukai turės būti ant atitinkamų kojų.. |
|
|
|
|
|
|
ATMEGA8 PWM:) |
Parašytas: 2006 07 17, 16:58 |
|
|
|
Kodas: |
#include <avr/io.h>
#include <avr/iom8.h>
#include <avr/delay.h> //f=16000000/(N*(1+TOP)) 31250Hz
int pwm = 0;
int main()
{
DDRB = 0b00001110;
DDRD = 0b00000011;
///Fast PWM TOP=ICR1///
TCCR1A = 0xA2;//COM1A1; COM1B1; WGM11;
TCCR1B = 0x1A;//WGM13; WGM12; CS12; CS10;
/////////////////////// N = 0x1D-1024; 0x1C-256; 0x1B-64; 0x1A-8; 0x19-1;
ICR1 = 63;
OCR1A = 12;
OCR1B = 64;
while(1)
{
OCR1A = pwm;
OCR1B = ICR1-pwm;
if((PORTD & 0b00000001) == 0b00000001) pwm++;
if((PORTD & 0b00000010) == 0b00000010) pwm--;
}
return 0;
} |
kilo keli kalusimai dėl pwm
ar aš teisingai suskaičiavau dažnį 31250Hz?
ką daro tas prescaleris, jeigu top reikšmė priklauso nuo ICR1?
tarkim top bus 16, OCR1A bus 8 tai tada gausis 50% pwm'as, ar ne?
kam dar tas prescaleris?
ir kodėl blin man mygtukai neveikia?
ačiū |
|
|
|
|
|
|
ATMEGA8 PWM:) |
Parašytas: 2006 07 17, 20:12 |
|
|
|
pwm taip skaiciuojamas
clk / prescalerio/ pwm taimerio maksimumo
aisku prescaler reikia daryti minimalu kad gauti didziausia greti,
jei taimerio top paimsi 16 tada turesi 1/16 tiksluma jei ocr 8 tada bus 8/16
mygtukai su interuptais gali buti problema, on change tau neveiks, reikes kazko protingesnio. sakykim padarom interupta on low, tada kai mygtukas paspaustas pakeiciame i on high.
as tai taip nip peles ta optini atstumo matuokli jungau, isejo kaip potenciometras. tik skaitmeneinis |
|
|
|
|
|
ATMEGA8 PWM:) |
Parašytas: 2006 07 17, 21:57 |
|
|
|
Digix rašo: |
as tai taip nip peles ta optini atstumo matuokli jungau, isejo kaip potenciometras. tik skaitmeneinis |
biski sunkiai suprast eina - is peles padarei atstumo matuokli? ar kaip cia? |
|
|
|
|
|
|
ATMEGA8 PWM:) |
Parašytas: 2006 07 17, 22:09 |
|
|
|
kažką ne taip supratai, potenciometras - liaudiškai tariant reguliatorius
skaitmeninis reguliatorius
bet nelabai suprantu ką tas prescaleris veikia?
TOP - 16, OCR - pulso plotis, prescaleris žingsnių skaičius ar kaip?
ta formulė iš datsheet'o f=clk/(N*(1+TOP)) tai iš čia man atrodo, kad prescaleris yra tai kiek kartų timeris turi prasisukti nuo 0 iki TOP? teisingai supratau?
tarkim TOP yra 2 preskaleris 32 tai PWM'as turės 64 žingsnius...?
bet čia kažkas nelogiška
Kad žiūriu atmega8 interuptus turi tik ant 4 ir 5 kojos
nu bet tas variantas kur parašiau tai be interuptų tiesiog kai sujungtas pinas su GND turi būti 1 if((PORTD & 0b00000001) == 0b00000001) pwm++; bet kažkodėl tas if'as nelabai veikia |
|
|
|
|
|
|
Google paieška forume |
|
|
Naujos temos forume |
|
|
FS25 Tractors
Farming Simulator 25 Mods,
FS25 Maps,
FS25 Trucks |
|
ETS2 Mods
ETS2 Trucks,
ETS2 Bus,
Euro Truck Simulator 2 Mods
|
|
FS22 Tractors
Farming Simulator 22 Mods,
FS22 Maps,
FS25 Mods |
|
VAT calculator
VAT number check,
What is VAT,
How much is VAT |
|
LEGO
Mänguköök,
mudelautod,
nukuvanker |
|
Thermal monocular
Thermal vision camera,
Night vision ar scope,
Night vision spotting scope |
|
FS25 Mods
FS25 Harvesters,
FS25 Tractors Mods,
FS25 Maps Mods |
|
Dantų protezavimas
All on 4 implantai,
Endodontija mikroskopu,
Dantų implantacija |
|
FS25 Mods
FS25 Maps,
FS25 Cheats,
FS25 Install Mods |
|
GTA 6 Weapons
GTA 6 Characters,
GTA 6 Map,
GTA 6 Vehicles |
|
FS25 Mods
Farming Simulator 25 Mods,
FS25 Maps |
|
ATS Trailers
American Truck Simulator Mods,
ATS Trucks,
ATS Maps |
|
|
|