![](http://www.elektronika.lt/_sys/img/dot.gif) |
![](/_sys/img/dot.gif)
|
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 02 09, 09:18. Visos datos yra GMT + 2 valandos.
|
|
|
![](/_sys/img/box_ico.gif) |
Forumas » Programavimas » PIC18 delay su tmr1
|
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
|
|
|
![](/_sys/img/dot.gif) |
![](/_sys/img/dot.gif) |
![](templates/elektronikalt/images/folder.gif) |
PIC18 delay su tmr1 |
Parašytas: 2019 03 26, 19:05 |
|
|
|
Sveiki, pasileidau tmr1 per mcc kurio periodas 50us, nes reikia clocko 10kHz, į išvadą RC0 išvedžiau taip:
Kodas: |
if (TMR1_HasOverflowOccured())
{
IO_RC0_Toggle();
TMR1_Reload();
TMR1IF = 0;
} |
Viskas būtų gerai, jei čia programa ir baigtusi, bet toliau vykdau šitai:
Kodas: |
/*TEMPIMAS CW**********************************************************/
if (res==0){
LATA = 0b01101100; //programled;reset;m2;m1-1
LATC = 0b00001000; //enable-1
/*ATLEIDIMAS CCW*******************************************************/
}else if (set==0){ //-/set mygtuko nuspaudimas
LATA = 0b01101100; //programled;reset;m2;m1-1
LATC = 0b00001100; //enable;ccw-1
}else{
LATA = 0;
LATC = 0;
} |
Ir prie šitų mygtukų negaliu naudoti šitokio vėlinimo:
Kodas: |
void delay (unsigned int ms){
unsigned int i;
while (ms--){
for (i = 0; i < 398; i++);
}
} |
Nes programa sustoja, sustoja ir mano clockas. Niekaip neįšeina suregzti kažkokio vėlinimo su tuo pačiu tmr1 įsivedus kintamuosius. Gal kas galit padėt? |
|
Paskutinį kartą redagavo Moterka, 2019 03 26, 23:47. Redaguota 4 kartus(ų) |
|
|
|
![](/_sys/img/dot.gif) |
![](templates/elektronikalt/images/folder.gif) |
PIC18 delay su tmr1 |
Parašytas: 2019 03 26, 19:45 |
|
|
|
Panasu, kad isvado kontrole tau reikia vykdyti paciame timer interrupte. |
|
|
|
|
![](templates/elektronikalt/images/folder.gif) |
PIC18 delay su tmr1 |
Parašytas: 2019 03 26, 20:55 |
|
|
|
Moterka rašo: |
Ta prasme sugeneruotame tmr1.c faile? |
Noras visgi neisiziurejau is pradziu...
Parodyk ka daro funkcija IO_RC0_Toggle();? |
|
|
|
|
![](templates/elektronikalt/images/folder.gif) |
PIC18 delay su tmr1 |
Parašytas: 2019 03 26, 21:21 |
|
|
|
#define IO_RC0_Toggle() do { LATCbits.LATC0 = ~LATCbits.LATC0; } while(0)
ištraukiau iš pin_manager.h, kiek matau ant proteus ir ant realaus maketo, ima tik puse clock periodo, tai todėl ir laiką imu 50us, o ne 100us norėdamas gauti 10kHz clock signalą. Aplamai šita komanda paimta iš pavyzdžio, nežinau ar galiu naudot kažkokia kitą, visa ta vieta if (TMR1_........ paimta iš pavyzdžio. |
|
|
|
|
![](templates/elektronikalt/images/folder.gif) |
PIC18 delay su tmr1 |
Parašytas: 2019 03 26, 23:03 |
|
|
|
Dabar pastebėjau, kad dažnis gaunasi jau 16,...kHz, pakeičiau periodo laiką į 90us, jei pakeičiu į 100us gaunu, jau virš 10kHz... Bet vistiek kažkaip kreivai viskas veikia, kai nespaudžiu jokio mygtuko ant clock turiu 9739Hz:
O jei žingsninį variklį noriu pasukt į kažkurią pusę, dažnis pakyla iki 9979Hz:
Iš pradžių galvojau, kad čia proteus man grybauja, pamėginau ant maketo, rodosi pats grybauju ![Very Happy](images/smiles/icon_biggrin.gif) |
|
|
|
|
![](templates/elektronikalt/images/folder.gif) |
PIC18 delay su tmr1 |
Parašytas: 2019 03 26, 23:11 |
|
|
|
Nepyk, vakar biski klaidu iveliau, debauncinga aprasiau, o klaviso busenos nevertinau. Ziurek zemiau. |
|
Paskutinį kartą redagavo AlgisL, 2019 03 27, 07:29. Redaguota 1 kartą |
|
|
|
![](templates/elektronikalt/images/folder.gif) |
PIC18 delay su tmr1 |
Parašytas: 2019 03 26, 23:30 |
|
|
|
Kompiliuoji su FREE mcc, tai nenustebk, kad bajeris su soft reload veikia neteisingai, nes kompileris is principo gamina 4 kar ilgesni ir 6 kar neefektyvesni koda, arba mokek 1000eu vienam mikrovaldikliu tipui.
nebent suderintum su univeru ar kolegija del studentiskos licencijos.
Jei iseina, pasiskaiciuok koks max PRESCALERis tau tinka ir ji naudok.
TMR1 ivykius apdorok pirmiausia, susitikrink kad priority butu HIGH, jei naudoji prioretizavima, o kitus ivykius nustatyk kaip LOW.
Kadangi PRESCALERis resetinamas irasant i TMR1, tai jei kiek nors uzdelsi tai padaryti, tai ir gauni neteisinga perioda.
https://www.mikroe.com/ebooks/pic-microcontrollers-programming-in-c/timer-tmr1 |
|
|
|
|
![](/_sys/img/dot.gif) |
![](templates/elektronikalt/images/folder.gif) |
PIC18 delay su tmr1 |
Parašytas: 2019 03 26, 23:55 |
|
|
|
Su skaitliukais nelabai pagavau minties, nors ir su pvz. pateikei, bet vistiek.
Apie patį darbą, dabar tikslas padaryti, kad paspaudus res mygtuką variklis suktusi 2 sekundes (dabar sukasi kol mygtukas laikomas), o paspaudus set mygtuką irgi 2 sekundes tik į kitą pusę, ta prasme, kad paspaudus išmestu aukštus ant tų išvadų kuriuos nurodęs LATA ir LATC.
Pasiskaičiuot prescaleri ir naudot, ta prasme visą tmr1 parašyti pačiam kode, o ne konfigūruoti per mcc ar kaip? Ir kaip su prioretizavimu, tai irgi aprašoma pačiam kode ar kažkur mcc?
Kolegijoje taip pat free mcc, tai apie studentiškas licenzijas turbūt nėra ką kalbėt. |
|
|
|
|
![](/_sys/img/dot.gif) |
![](templates/elektronikalt/images/folder.gif) |
PIC18 delay su tmr1 |
Parašytas: 2019 03 27, 00:27 |
|
|
|
ten kur pavyzdyje debauncinge "veiksmai = 20ms" iterpi
Kodas: |
#define btnPin1 PORTBbits.RB0
#define btnPin2 PORTBbits.RB1
#define CW_PULSE() .....
#define CCW_PULSE() ....
void doM1steps( int steps );
volatile unsigned char btnPressed1 = 0;
volatile unsigned char btnPressed2 = 0;
volatile int stepsM1 = 0;
void isr_high( void ) {
if (TMR1IE && TMR1IF) {
TMR1 = TMR1_SEED;
// kiti tavo veiksmai su pinais ir t.t.
// klaviso debaunce
// lai buna pasleptas nuo likusiu proceduru
static unsigned int debounceCounter1 = 0;
static unsigned char oldState1 = btnPin1;
unsigned char newState1 = btnPin1;
if (oldState1 != newState1) {
oldState1 = newState1;
debounceCounter1 = 0;
// kiti veiksmai, kai keiciasi busena, bet ji nenusistovejusi
} else
if (60000 >= debounceCounter1) { // mygtuko busena sekama iki 6 sek
if (200 == ++debounceCounter1) { // 10kHz/200=50ms
if ( !newState1 ) { // dazniausiai mygtukai trumpina i GND
btnPressed1 = 1;
// nuspaustas ir debouncintas btn1
stepsM1 += 1000; // suksis CW 1000 zingsneliu
// kiti veiksmai nuspaudus mygtuka
} else { // buvo atleistas
btnPressed1 = 0;
// kiti veiksmai atleidus mygtuka
}
// kiti galimi veiksmai, kai busena nusistovejusi 50ms
} else {
// kiti galimi veiksmai, kai busena nusistovejusi <50ms
}
} else {
// kiti galimi veiksmai, kai busena nusistovejusi >50ms
}
static unsigned int debounceCounter2 = 0;
static unsigned char oldState2 = btnPin2;
unsigned char newState2 = btnPin2;
if (oldState2 != newState2) {
oldState2 = newState2;
debounceCounter2 = 0;
// kiti veiksmai, kai keiciasi busena, bet ji nenusistovejusi
} else
if (60000 >= debounceCounter2) { // mygtuko busena sekama iki 6 sek
if (200 == ++debounceCounter2) { // 10kHz/200=50ms
if ( !newState2 ) { // dazniausiai mygtukai trumpina i GND
btnPressed2 = 1;
// nuspaustas ir debouncintas btn2
stepsM1 -= 1000; // suksis CCW 1000 zingsneliu
// kiti veiksmai nuspaudus mygtuka
} else { // buvo atleistas
btnPressed2 = 0;
// kiti veiksmai atleidus mygtuka
}
// kiti galimi veiksmai, kai busena nusistovejusi 50ms
} else {
// kiti galimi veiksmai, kai busena nusistovejusi <50ms
}
} else {
// kiti galimi veiksmai, kai busena nusistovejusi >50ms
}
// realiai cia dar reiktu ivertinti greitejima/letejima
// juolab pertrauktis pas tave lyg ir 10kHz
if ( 0 < stepsM1 ) { // CW
CW_PULSE();
stepsM1--;
}else
if ( 0 > stepsM1 ) { // CCW
CCW_PULSE();
stepsM1++;
}
TMR1IF = 0;
}
}
// teigiamas - CW, neigiamas CCW
void doM1steps( int steps ) {
GIE = 0;
stepsM1 += steps;
while ( 0 != stepmsM1 ) {
GIE = 1;
yeld(); // arba idle(); cia jau kaip nori
GIE = 0;
}
GIE = 1;
}
// kazkur kode...
doM1steps( 2000 ); // CW 2000 zingsneliu;
doM1steps( -500 ); // CCW 500 zingsneliu;
|
|
|
|
|
|
![](/_sys/img/dot.gif) |
![Atsakyti į pranešimą](templates/elektronikalt/images/lang_lietuviu/reply.gif) |
|
![](/_sys/img/dot.gif) |
|
![](http://www.elektronika.lt/_sys/img/box_ico.gif) |
Google paieška forume |
|
![](http://www.elektronika.lt/_sys/img/box_ico.gif) |
Naujos temos forume |
|
![](http://www.elektronika.lt/_sys/img/dot.gif) |
FS25 Tractors
Farming Simulator 25 Mods,
FS25 Maps,
FS25 Trucks |
![](http://www.elektronika.lt/_sys/img/dot.gif) |
ETS2 Mods
ETS2 Trucks,
ETS2 Bus,
Euro Truck Simulator 2 Mods
|
![](http://www.elektronika.lt/_sys/img/dot.gif) |
FS22 Tractors
Farming Simulator 22 Mods,
FS22 Maps,
FS25 Mods |
![](http://www.elektronika.lt/_sys/img/dot.gif) |
VAT calculator
VAT number check,
What is VAT,
How much is VAT |
![](http://www.elektronika.lt/_sys/img/dot.gif) |
LEGO
Mänguköök,
mudelautod,
nukuvanker |
![](http://www.elektronika.lt/_sys/img/dot.gif) |
KCD2 Mods
Installing KCD 2 Mods,
KCD 2 Guides,
KCD 2 Cheats |
![](http://www.elektronika.lt/_sys/img/dot.gif) |
FS25 Mods
FS25 Harvesters,
FS25 Tractors Mods,
FS25 Maps Mods |
![](http://www.elektronika.lt/_sys/img/dot.gif) |
Dantų protezavimas
All on 4 implantai,
Endodontija mikroskopu,
Dantų implantacija |
![](http://www.elektronika.lt/_sys/img/dot.gif) |
FS25 Mods
FS25 Maps,
FS25 Cheats,
FS25 Install Mods |
![](http://www.elektronika.lt/_sys/img/dot.gif) |
GTA 6 Wiki
GTA 6 Map,
GTA 6 Characters,
GTA 6 News |
![](http://www.elektronika.lt/_sys/img/dot.gif) |
FS25 Mods
Farming Simulator 25 Mods,
FS25 Maps |
![](http://www.elektronika.lt/_sys/img/dot.gif) |
ATS Trailers
American Truck Simulator Mods,
ATS Trucks,
ATS Maps |
|
![Reklama](http://www.elektronika.lt/_sys/img/rrr2.gif)
|
![Reklama](http://www.elektronika.lt/_sys/img/rrr1.gif) |