 |

|
|
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
|
|
|
 |
 |
 |
Pulse Width Modulation - C kalba... |
Parašytas: 2006 07 08, 15:10 |
|
|
|
|
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... |
Parašytas: 2006 07 08, 15:18 |
|
|
|
|
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... |
Parašytas: 2006 07 08, 15:24 |
|
|
|
|
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
ir dar reikės išsiaiškint kaip dvi funkcijas vykdyti vienu metu  |
|
|
|
|
|
 |
Pulse Width Modulation - C kalba... |
Parašytas: 2006 07 08, 15:38 |
|
|
|
|
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
| 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??
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  |
|
|
|
|
|
 |
Pulse Width Modulation - C kalba... |
Parašytas: 2006 07 08, 18:13 |
|
|
|
|
| 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... |
Parašytas: 2006 07 08, 19:32 |
|
|
|
|
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... |
Parašytas: 2006 07 08, 21:13 |
|
|
|
|
| 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
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  |
|
|
|
|
|
 |
 |
Pulse Width Modulation - C kalba... |
Parašytas: 2006 07 08, 23:03 |
|
|
|
|
dazni suzinosi pamataves osilografu
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... |
Parašytas: 2006 07 08, 23:19 |
|
|
|
|
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
ir nežinau kaip patikrint ar įvyko būtent tas interruptas.. nes dar ir timer0 interruptas vykdomas.... blin
nu reikės žiūrėt dar.. išsiaiškint kaip 3 PWM vienu metu paleist  |
|
|
|
|
|
 |
 |
Pulse Width Modulation - C kalba... |
Parašytas: 2006 07 08, 23:31 |
|
|
|
|
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... |
Parašytas: 2006 07 08, 23:50 |
|
|
|
|
| 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...
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ų
taip pat su mygtukais, jeigu bent vienas diodas šviečia tai paspaudimas neužfiksuojamas if (GPIO == 0b00100000 && pw < 255)  |
|
|
|
|
|
 |
 |
Pulse Width Modulation - C kalba... |
Parašytas: 2006 07 09, 00:53 |
|
|
|
|
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... |
Parašytas: 2006 07 09, 11:05 |
|
|
|
|
užteks užteks laidų, prie šito "žvėries" netgi LCD 4bitų išeitų pajungt
yra 6I/O pin'ai
ten galvojau, kad klaidą padariai kur parašiai &
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?  |
|
|
|
|
|
 |
Pulse Width Modulation - C kalba... |
Parašytas: 2006 07 09, 11:19 |
|
|
|
|
| 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. |
|
|
|
|
|
|
 |
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 |
 |
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 |
|

|
 |