 |

|
|
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 24, 20:07. Visos datos yra GMT + 2 valandos.
|
|
|
 |
Forumas » Mikrovaldikliai » pic16f84a ir 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 2 iš 2 Pereiti prie Atgal 1, 2 |
|
 |
pic16f84a ir pwm |
Parašytas: 2012 03 20, 16:30 |
|
|
|
|
Sveiki ,
Nenorėjau kištis į "įnirtingą" diskusiją . Ne, aš noriu su C kalba išmokti, ness univiere mokausu su c++ tai C nelabai daug kuom ir skiriasi Pavyzdžiai tai tiko, tik tas kur yra su ifais, kaskodėl labai ilgai dirba, greiti mažinant ar didinant niekas nesikeičia. Toks jausmas, kad tas TMR0 parašytas tik šeip O daugiau tai labai dėkoju, kad padedat
Pagarbiai Marijus V. |
|
|
|
|
|
 |
 |
pic16f84a ir pwm |
Parašytas: 2012 03 20, 16:51 |
|
|
|
|
kokia prasme cia tau if ilgai dirba?
pirmu atveju duty reiksme imama is B porto, kaskart jo reiksmei pakitus.
antru atveju keiciasi masyvo reiksme didejanciai/mazejanciai, priklausomai ar buvo nuspaustas mygtukas. jei tau permazas zingsnis, tai rasyk duty[x]++n, kur n norimas zingsnis.
del pacio TMR0, tai jis dar turi prescaler, kuri irgi gali keisti bei taktavimo saltini
dar toks niuansas, kad interrupt() reikia kogero isnaujo nustatineti TMR0=N (cia manuale pasiziurek)
1-ojo varianto interrupt() dalyje nustatant TMR0=0 arba 255 reikia zet kas dedasi, ar timeris tokiu atveju skaiciuoja 256 taktus, jei reiksme 0 ir bent 1 takta jei reiksme 255.
as labai seniai esu pic16f84 kazka programines po assembleriu, tad tau nieko nepasakysiu, nes tai nera mano pagrindinis uzsiemimas ir laisvalaikiu pasizaidziu tik su ATtiny2313, ATmega8/16, PIC18F2550, 4550 bei bandau kazka http://www.friendlyarm.net/products/mini2440 |
|
|
|
|
|
 |
 |
pic16f84a ir pwm |
Parašytas: 2012 03 20, 23:10 |
|
|
|
|
nedidukas MicroC ir PIC16F84A patyrinejimas
(patikrint realiai teks paciam)
| Kodas: |
//programine FAST_PWM emuliacija RA0..RA3 isejimuose
//generuoja signala ~19,531 kHz duty[x] uzpildymo
//numatoma, kad naudojamas isorinis 20MHz kvarcas ar ossciliatorius
//RB0 iejime mygtukas i VSS atlieka duty[0]-- (mazina RA0 PWM duty)
//RB1 iejime mygtukas i VSS atlieka duty[0]++ (didina RA0 PWM duty)
//RB2 iejime mygtukas i VSS atlieka duty[1]-- (mazina RA1 PWM duty)
// :
//RB7 iejime mygtukas i VSS atlieka duty[3]++ (didina RA3 PWM duty)
#define CPU_CLOCK 20000000 //kvarco daznis Hz
#define One_ms_TICKS (CPU_CLOCK / 4*256*1000) //Timer0 ciklai ~1 ms pasiekti
#define KBD_DEBOUNCE_TIME 50 //ms uzlaikymas kontaktui nusistoveti
#define KBD_REPEAT_DELAY 400 //ms pasikartojimo velinimas
#define KBD_REPEAT_RATE 200 //ms pasikartojimo daznis
unsigned int kbdtm[] = {0, 0, 0, 0, 0, 0, 0, 0};
unsigned char duty[] = {51, 102, 153, 204};
unsigned char tmpb, oldb;
unsigned char ms_ticks = 0, pwmcnt = 0;
//primityvas pakeisti duty[x]
#define _DUTY(d) (d & 1) ? (duty[d/2]++) : (duty[d/2]--)
//primityvas apdoroti klavisams su autorepeat f-ja
#define KBD_TEST(b){\
if (!(tmpb & (1<<b))) {\
if (oldb & (1<<b)) kbdtm[b]=0;\
else kbdtm[b]++;\
if (kbdtm[b] == KBD_DEBOUNCE_TIME) _DUTY(b);\
if (kbdtm[b] >= KBD_REPEAT_DELAY){\
kbdtm[b]-=KBD_REPEAT_RATE;\
_DUTY(b);\
}\
}\
else kbdtm[b]=0;\
}
//primityvas PWM isvedimo apdorojimui
#define DUTY_TEST(d, p) {\
if (d < pwmcnt) p = 1;\
else p = 0;\
}
void interrupt()
{
pwmcnt++;
DUTY_TEST(duty[0], PORTA.F0);
DUTY_TEST(duty[1], PORTA.F1);
DUTY_TEST(duty[2], PORTA.F2);
DUTY_TEST(duty[3], PORTA.F3);
ms_ticks++;
INTCON.T0IE = 1; //Timer0 Interrupt enabled
INTCON.T0IF = 0; //clear Timer0 Interrupt flag
}//interrupt()
void main()
{
TRISA &= 0xF0; //RA0..RA3 output
PORTA &= 0xF0; //RA0..RA3 = 0
OPTION_REG.NOT_RBPU = 0; //PortB pull-ups enabled
OPTION_REG.T0CS = 0; //TMR0 clock source (CLKOUT)
// OPTION_REG.PSA = 1 (default) Prescaler to WDT, Timer0 not use this
TMR0 = 0; //Timer0 ciklas 20MHz / 4*256 = 19,531kHz
INTCON.GIE = 1; //Global Interrupts enabled
INTCON.T0IE = 1; //Timer0 Interrupt enabled
INTCON.T0IF = 0; //clear Timer0 Interrupt flag
ms_ticks = 0;
oldb = PORTB;
while (1)
if (ms_ticks >= One_ms_TICKS-1)
{
ms_ticks = 0; // praejo ~1 ms laikas
tmpb = PORTB;
if (oldb != tmpb)
{
oldb ^= tmpb; //RBx changed
KBD_TEST(0);
KBD_TEST(1);
KBD_TEST(2);
KBD_TEST(3);
KBD_TEST(4);
KBD_TEST(5);
KBD_TEST(6);
KBD_TEST(7);
oldb = tmpb;
}// if (oldb
}//if (ms_ticks
}//main
|
jei rupes didesnes gudrybes, klausk profesionalu, nes as tik pradedantis megejas sioje srity. |
|
|
|
|
|
 |
|
 |
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 |
|

|
 |