Elektronika.lt
 2025 m. gruodžio 19 d. Projektas | Reklama | Žinokite | Klausimai | Prisidėkite | Atsiliepimai | Kontaktai
Paieška portale
EN Facebook RSS

 Kas naujo  Katalogas  Parduotuvės  Forumas  Tinklaraščiai
 Pirmas puslapisSąrašas
 Forumas / + pokalbiai
 - Paieška forume
 - D.U.K. / Forumo taisyklės
 - Narių sąrašas
 - Registruotis
 - Prisijungti

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 2025 12 19, 08:19. Visos datos yra GMT + 2 valandos.
 Forumas » Mikrovaldikliai » Pulse Width Modulation - C kalba...
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 23
Pereiti prie Atgal  1, 2, 3  Toliau
Pradėti naują temą  Atsakyti į pranešimą Rodyti ankstesnį pranešimą :: Rodyti kitą pranešimą 
 Pulse Width Modulation - C kalba...
PranešimasParašytas: 2006 07 08, 15:10 Pranešti apie taisyklių pažeidimą Atsakyti su citata
edvintas
Užkietėjęs dalyvis
Užkietėjęs dalyvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
tai tarkim jeigu maksimalus timer'io laikas 255us tai 1/0.000255 = 3922Hz PWM'o dažnis, o su tuo kitu skaičium kurį pasiekus kažkas vykdoma bus reguliuojamas pulso plotis? ir čia aparatinis pwm bus?

bet pasiekus tą skaičių nelabai įsivaizduoju kaip tas portas atsidaro?
ar atskira funkcija kažkokia yra kaip interrupt()? kuri vykdoma pasiekus tą skaičių?

va čia yra aprašomas TIMER0
http://info.hobbyengineering.com/specs/MCHIP-PIC12F629.pdf
Kodas:
4.0 TIMER0 MODULE
The Timer0 module timer/counter has the following
features:
• 8-bit timer/counter
• Readable and writable
• 8-bit software programmable prescaler
• Internal or external clock select
• Interrupt on overflow from FFh to 00h
• Edge select for external clock
Figure 4-1 is a block diagram of the Timer0 module and
the prescaler shared with the WDT.
4.1 Timer0 Operation
Timer mode is selected by clearing the T0CS bit
(OPTION_REG<5>). In Timer mode, the Timer0 module
will increment every instruction cycle (without prescaler).
If TMR0 is written, the increment is inhibited for
the following two instruction cycles. The user can work
around this by writing an adjusted value to the TMR0
register.
Counter mode is selected by setting the T0CS bit
(OPTION_REG<5>). In this mode, the Timer0 module
will increment either on every rising or falling edge of
pin GP2/T0CKI. The incrementing edge is determined
by the source edge (T0SE) control bit
(OPTION_REG<4>). Clearing the T0SE bit selects the
rising edge.
4.2 Timer0 Interrupt
A Timer0 interrupt is generated when the TMR0 register
timer/counter overflows from FFh to 00h. This overflow
sets the T0IF bit. The interrupt can be masked by
clearing the T0IE bit (INTCON<5>). The T0IF bit
(INTCON<2>) must be cleared in software by the
Timer0 module Interrupt Service Routine before reenabling
this interrupt. The Timer0 interrupt cannot
wake the processor from SLEEP since the timer is
shut-off during SLEEP.

tai į kurį registrą tuos skaičius įrašinėt?
ir kaip tai turėtų atrodyt?


Paskutinį kartą redagavo edvintas, 2006 07 08, 15:20. Redaguota 1 kartą
 Pulse Width Modulation - C kalba...
PranešimasParašytas: 2006 07 08, 15:18 Pranešti apie taisyklių pažeidimą Atsakyti su citata
Digix
VIP narys
VIP narys
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
aha, tavo procesorius per dau menkas, jaame nera aparatinio pwm

su programiniu labai didelio grecio nepasieksi.

bet cia labai svarbu kokio tikslumo pwm tau reikia
kiek isejimu nori tureti, ir ka dar procesorisui reikes daryti tuo paciu metu
 Pulse Width Modulation - C kalba...
PranešimasParašytas: 2006 07 08, 15:24 Pranešti apie taisyklių pažeidimą Atsakyti su citata
edvintas
Užkietėjęs dalyvis
Užkietėjęs dalyvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
pradžiai bandau padaryt, kad du šviesos diodai nepriklausomai vienas nuo kito palaipsniui užgesinėtų ir užsideginėtų...
poto darysiu RGB kad trys diodai.... pwm dažnio reikėtų bent jau 5kHz Smile

ir dar reikės išsiaiškint kaip dvi funkcijas vykdyti vienu metu Smile
 Pulse Width Modulation - C kalba...
PranešimasParašytas: 2006 07 08, 15:32 Pranešti apie taisyklių pažeidimą Atsakyti su citata
Digix
VIP narys
VIP narys
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
o kam tau toks didelis daznumas? ir kokio tikslumo nori ar uztenka 1/16 ar tau reikia 1/256
 Pulse Width Modulation - C kalba...
PranešimasParašytas: 2006 07 08, 15:38 Pranešti apie taisyklių pažeidimą Atsakyti su citata
edvintas
Užkietėjęs dalyvis
Užkietėjęs dalyvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
dažnumą iš lempos čia sakau.. nu svarbu, kad mokėčiau kaip tą dažnumą nusistatyt... o tikslumo pradžiai ir 1/10 užteks Very Happy

Kodas:
void main() {
  OPTION_REG = 0x14;
  TRISIO     =   0;
  GPIO       = 0xFF;
  TMR0       =  96;
  INTCON     = 0xA0;
  while(1)
  {
    if(TMR0 > 22) GPIO = 0;
    else GPIO = 255;
  }
}

va gavosi tai ko reikia, tik neįsivaizduoju koks čia PWM'o dažnis?? Confused
o ta TMR0 reikšmė kaip supratau tai didėja nuo 0 iki 255 ir vėl nuo 0...?
P.S. Šitas kodas tik 2% PIC'o atminties užima Laughing
 Pulse Width Modulation - C kalba...
PranešimasParašytas: 2006 07 08, 18:13 Pranešti apie taisyklių pažeidimą Atsakyti su citata
edvintas
Užkietėjęs dalyvis
Užkietėjęs dalyvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
Kodas:
char pw = 22;
void main() {
  TRISIO     = 48;
  OPTION_REG = 1;
  //INTCON     = 160; //Dis/En Interrupts
  while(1)
  {
    if(TMR0 > pw) GPIO = 0;
    else GPIO = 255;
    if(???) pw++;
    if(???) pw--;
  }
}

va susidūriau su tokia problema.. kaip patikrint ar mygtukas paspaustas ar ne? Pirmas mygtukas pakabintas ant GP0(0b00100000) antras ant GP1(0b00010000)
ir parašykit kaip sužinot šito PWM dažnį?
 Pulse Width Modulation - C kalba...
PranešimasParašytas: 2006 07 08, 19:32 Pranešti apie taisyklių pažeidimą Atsakyti su citata
Digix
VIP narys
VIP narys
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
tas pwm metodas nelabai geras, didelies procesoraius apkroimas, mazas tikslumas, bet nesudetingas.


del mygtuku tikrinimo tai viska ta daryti vienu metu nebus labai lengva.

bet tavo principas teisingas.

if (GP0 & 0b00100000) {pw++; goto delay;}
if (GP0 & 0b00010000) {pw--; goto delay;}
else goto nodelay;

delay: for (n=0;n<60000;n++){
if(TMR0 > pw) GPIO = 0;
else GPIO = 255;
}


nodelay:
 Pulse Width Modulation - C kalba...
PranešimasParašytas: 2006 07 08, 21:13 Pranešti apie taisyklių pažeidimą Atsakyti su citata
edvintas
Užkietėjęs dalyvis
Užkietėjęs dalyvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
Kodas:
char pw = 1;
int n;
void main() {
  TRISIO     = 0b00110000;
  OPTION_REG = 1;
  //INTCON     = 150; //D/E Interrupts 160
  while(1)
  {
    nodelay:
    if(TMR0 > pw) GPIO = 0;
    else GPIO = 255;
    if (GPIO == 0b00100000 && pw < 255) {pw++; goto delay;}
    if (GPIO == 0b00010000 && pw > 0) {pw--; goto delay;}
    goto nodelay;
    delay:
    for(n=0;n<1000;n++)
    {
      if(TMR0 > pw) GPIO = 0;
      else GPIO = 255;
    }
  }
}

va visai veikiantis variantas Smile
o dabar gal kas parašys kaip PWM dažnį sužinot??
ir kam šitas OPTION_REG = 1; reikalingas kokį skaičių berašyčiau nuo 1-255 niekas nepasikeičia... galvojau, kad čia dažnis nusistato Rolling Eyes
 Pulse Width Modulation - C kalba...
PranešimasParašytas: 2006 07 08, 23:03 Pranešti apie taisyklių pažeidimą Atsakyti su citata
Digix
VIP narys
VIP narys
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
dazni suzinosi pamataves osilografu Smile

o jei rimciau tai galima taip.

suzinok koks taimerio iejimo daznumas padalink ji is 255 ir zinosi koks pwm daznumas.

programa galima butu padaryti zymiai tobulesne, panaudojant pertraukimus, bet jei veikia ir taip tai manau neverta
 Pulse Width Modulation - C kalba...
PranešimasParašytas: 2006 07 08, 23:19 Pranešti apie taisyklių pažeidimą Atsakyti su citata
edvintas
Užkietėjęs dalyvis
Užkietėjęs dalyvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
o tai iš kur tą timerio dažnumą sužinot? kaip jis nusistato?

o pertraukimus timerio ar GP porto pasikeitimo metu vykdoma pertraukima?

GP pertraukimai įsijungia lyg ir va taip INTCON = 150;

Citata:
IOCB — INTERRUPT-ON-CHANGE GPIO REGISTER (ADDRESS: 96h)
Note: If a change on the I/O pin should occur
when the read operation is being executed
(start of the Q2 cycle), then the GPIF interrupt
flag may not get set.
U-0 U-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0
— — IOCB5 IOCB4 IOCB3 IOCB2 IOCB1 IOCB0
bit 7 bit 0
bit 7-6 Unimplemented: Read as ‘0’
bit 5-0 IOCB<5:0>: Interrupt-on-Change GPIO Control bit
1 = Interrupt-on-change enabled
0 = Interrupt-on-change disabled
Note 1: Global interrupt enables (GIE and GPIE) must be enabled for individual interrupts to
be recognized.


bet kažkodėl nelabai gavos Smile
ir nežinau kaip patikrint ar įvyko būtent tas interruptas.. nes dar ir timer0 interruptas vykdomas.... blin Rolling Eyes
nu reikės žiūrėt dar.. išsiaiškint kaip 3 PWM vienu metu paleist Smile
 Pulse Width Modulation - C kalba...
PranešimasParašytas: 2006 07 08, 23:31 Pranešti apie taisyklių pažeidimą Atsakyti su citata
Digix
VIP narys
VIP narys
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
tau reikia taimerio pertraukimus naudoti, bet siaip tai bus gana sudetinga, ir as programos neparasysiu.

principas butu toks

nustatom taimeri ant nulio, paliecdziam.

kai ivyksta pertraukimas taimeri nustatom tokiam laikui po kurio reikes naujo pertraukimo.
tuos laikus suskaiciuoti reikes gana sudetingos programos ipac jei reikia ne vieno pwm.
jei yra pakankamai taimeriu tai viskas paprasciau.

o jei kaip dabar tai nesudetinga, tiesiog kieviema diodui pakartok sita dali
{
if(TMR0 > pw) GPIO = 0;
else GPIO = 255;
}


idomu ar tavo ompiliatorisu supranta inline funkcijas ?
tada sita galetum padaryti kaip funkcija
inline void pwm1(char pw) {
if(TMR0 > pw) GPIO = 0;
else GPIO = 255;
}
 Pulse Width Modulation - C kalba...
PranešimasParašytas: 2006 07 08, 23:50 Pranešti apie taisyklių pažeidimą Atsakyti su citata
edvintas
Užkietėjęs dalyvis
Užkietėjęs dalyvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
Kodas:
char pw = 1;
int n;
void pwm1()
{
  if(TMR0 > pw) GPIO = 0b00000000;
  else GPIO = 0b00000001;
}
void pwm2()
{
  if(TMR0 > (pw+20)) GPIO = 0b00000000;
  else GPIO = 0b00000010;
}
void pwm3()
{
  if(TMR0 > (pw+60)) GPIO = 0b00000000;
  else GPIO = 0b00000100;
}
void main()
{
  TRISIO     = 0b00110000;
  OPTION_REG = 1;
  while(1)
  {
    nodelay:
    pwm1();
    pwm2();
    pwm3();
    if (GPIO == 0b00100000 && pw < 255) {pw++; goto delay;}
    if (GPIO == 0b00010000 && pw > 0) {pw--; goto delay;}
    goto nodelay;
    delay:
    for(n=0;n<1000;n++)
    {
      pwm1();
      pwm2();
      pwm3();
    }
  }
}

inline nesupranta... Smile
va taip kažkas panašaus gaunas, bet reikia dar išsiaiškint kaip diodus perjunginėt nepriklausomai viena nuo kito.. pvz.:
0b00000001 įjungtas 3 diodas..
vykdoma funkcija įjungti 2 diodą 0b00000010 išjungia 3 ir įjungia antrą..
o reikėtų, kad tą trečia paliktų taip kaip yra 0b00000011 aišku galima su if padaryt bet juk gali būt įvairių variantų 1 3 led palikt įjungtus 2 3 ir t.t. daug if'ų reikėtų Confused
taip pat su mygtukais, jeigu bent vienas diodas šviečia tai paspaudimas neužfiksuojamas if (GPIO == 0b00100000 && pw < 255) Confused
 Pulse Width Modulation - C kalba...
PranešimasParašytas: 2006 07 09, 00:53 Pranešti apie taisyklių pažeidimą Atsakyti su citata
Digix
VIP narys
VIP narys
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
manau tau neuzteks laidu tokiame procesoriuje kiekvienal diodui valdyti.

del laido mygtuku naudok & o ne == nes tada galesi tikrinti po viena bita

== tikrina visus bitus
 Pulse Width Modulation - C kalba...
PranešimasParašytas: 2006 07 09, 11:05 Pranešti apie taisyklių pažeidimą Atsakyti su citata
edvintas
Užkietėjęs dalyvis
Užkietėjęs dalyvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
užteks užteks laidų, prie šito "žvėries" netgi LCD 4bitų išeitų pajungt Laughing
yra 6I/O pin'ai Surprised

ten galvojau, kad klaidą padariai kur parašiai & Smile
o tai tikrinti taip reik? if(0b00100000 & GPIO) ?
tai jeigu GPIO bus 3 bitas vienetas tai gražins true ir nekreips dėmesio į kitus bitus? teisingai supratau? Smile
 Pulse Width Modulation - C kalba...
PranešimasParašytas: 2006 07 09, 11:19 Pranešti apie taisyklių pažeidimą Atsakyti su citata
vakaras
VIP narys
VIP narys
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą Apsilankyti vartotojo tinklapyje ICQ numeris
edvintas rašo:
o tai tikrinti taip reik? if(0b00100000 & GPIO) ?
tai jeigu GPIO bus 3 bitas vienetas tai gražins true ir nekreips dėmesio į kitus bitus?


Ne 3-ias, o 5-as bitas.
Pradėti naują temą  Atsakyti į pranešimą Pereiti prie Atgal  1, 2, 3  Toliau
 
Forumo sistema: phpBB
 „Google“ paieška forume
 Kas naujesnio?
 Naujos temos forume

Global electronic components distributor – Allicdata Electronics

Electronic component supply – „Eurodis Electronics“

LOKMITA – įvairi matavimo, testavimo, analizės ir litavimo produkcija

Full feature custom PCB prototype service

Sveiki ir ekologiški maisto produktai

Mokslo festivalis „Erdvėlaivis Žemė

LTV.LT - lietuviškų tinklalapių vitrina

„Konstanta 42“

„Mokslo sriuba“

www.matuok.lt - Interneto spartos matavimo sistema

Programuotojas Tautvydas – interneto svetainių-sistemų kūrimas

PriedaiMobiliems.lt – telefonų priedai ir aksesuarai

Draugiškas internetas

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
Dantų protezavimas
All on 4 implantai,
Endodontija mikroskopu,
Dantų implantacija
FS25 Mods
FS25 Maps, FS25 Cheats, FS25 Install Mods
FS25 Mods
Farming Simulator 25 Mods,
FS25 Maps
ATS Trailers
American Truck Simulator Mods, ATS Trucks, ATS Maps
Must have farming mods
Farming simulator modhub, Best farming simulator mods
Reklama
‡ 1999– © Elektronika.lt | Autoriaus teisės | Privatumo politika | Atsakomybės ribojimas | Turinys | Reklama | Kontaktai LTV.LT - lietuviškų tinklalapių vitrina
Ets2 mods, Ats mods, Beamng drive mods
allmods.net
„MokslasPlius“ – mokslui skirtų svetainių portalas
www.mokslasplius.lt
Optical filters, UV optics, electro optical crystals
www.eksmaoptics.com
LTV.LT – lietuviškų tinklalapių vitrina
www.ltv.lt/technologijos/
Elektroninių parduotuvių optimizavimas „Google“ paieškos sistemai
www.seospiders.lt
Mokslo festivalis „Erdvėlaivis žemė“
www.mokslofestivalis.eu
Reklama


Reklama