 |

|
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 10 12, 12:25. Visos datos yra GMT + 2 valandos.
|
|
|
 |
Forumas » Elektronika žaliems » Programos ilgumas
|
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š 3 Pereiti prie 1, 2, 3 Toliau |
|
 |
 |
 |
Programos ilgumas |
Parašytas: 2015 10 19, 15:57 |
|
|
|
Sveiki, kaip visada turiu problemą, man nepatinka mano programos rašymo stilius, deja, kitokio nemoku, tad norėčiau gauti pasiūlymų, kaip galėčiau sutrumpinti ilgą "rašliavą". Taigi programa skirta enkoderiui, skaičiuoti pulsus, viso 3 kanalai, programa:
Kodas: |
int main(void)
{
DDRD=0b0001111;
DDRB=255;
while(1)
{
//A kanalas
if (PIND&16)//PD4
{
if(laikymui==0) skAkil++;
laikymui=1;
////B kanalas
if (PIND&32)//PD5
{
if(laikymuib==0) skBkil++;
laikymuib=1;
}
else
{
if(skBkil==-1) skBkil=0;
if(laikymuib==1) skBkri++;
laikymuib=0;
}
///C kanalas
if (PIND&64)//PD6
{
if(laikymuic==0) skCkil++;
laikymuic=1;
}
else
{
if(skCkil==-1) skCkil=0;
if(laikymuic==1) skCkri++;
laikymuic=0;
}
}
else
{
///A kanalas
if(skAkil==-1) skAkil=0;
if(laikymui==1) skAkri++;
laikymui=0;
/// B kanalas
if (PIND&32)//PD5
{
if(laikymuib==0) skBkil++;
laikymuib=1;
}
else
{
if(skBkil==-1) skBkil=0;
if(laikymuib==1) skBkri++;
laikymuib=0;
}
///C kanalas
if (PIND&64)//PD6
{
if(laikymuic==0) skCkil++;
laikymuic=1;
}
else
{
if(skCkil==-1) skCkil=0;
if(laikymuic==1) skCkri++;
laikymuic=0;
}
}
viso=skAkil+skAkri+skBkil+skBkri+skCkil+skCkri;
PORTB= viso;
//TODO:: Please write your application code
}
} |
|
|
|
|
|
 |
 |
Programos ilgumas |
Parašytas: 2015 10 19, 16:34 |
|
|
|
Is pateikto pavyzdzio matosi, kad naudoji du vienodus veiksmus, tad juos gali aprasyti dviem proceduromis ir perduoti i jas parametrus.
Kadangi nenoresi prarasti greicio, tai arba jas aprasyk kaip static inline arba daryk makrosus, tad uzmetes aki i tavo abrakadabra suprastinciau iki pvz:
Kodas: |
#define proc_1(laikymui, sk_kil) { \
if (laikymui==0) { sk_kil++; } \
laikymui=1; \
}
#define proc_2(laikymui, sk_kil, sk_kri) { \
if (sk_kil==-1) { sk_kil=0; } \
if (laikymui==1) { sk_kri++; } \
laikymui=0; \
}
int main(void) {
DDRD=0b0001111;
DDRB=255;
while(1) {
uint8_t pin_d = PIND;
if (pin_d&16) { //PD4 A kanalas
proc_1(laikimui, skAkil);
} else {
proc_2(laikimui, skAkil, skAkri);
}
if (pin_d&32) { //PD5 B kanalas
proc_1(laikimuib, skBkil);
} else {
proc_2(laikimuib, skBkil, skBkri);
}
if (pin_d&64) { //PD6 C kanalas
proc_1(laikimuic, skCkil);
} else {
proc_2(laikimuic, skCkil, skCkri);
}
viso=skAkil+skAkri+skBkil+skBkri+skCkil+skCkri;
PORTB=viso;
}
}
|
!!! yra vienas dalykas - aprasant makrosus kompiliatorius stengsis naudoti int tipo parametrus, bet jei veiksmuose pasitaikys unsigned tipo parametrai, tai matematika bus atlikta kaip tarp unsigned parametru, todel nenustebk, kad vietoje -1 (tavo manymu 0xFF) bus paimta 0x100 reiksme.
Kad isvengti tokiu "navarotu", vietoje [-1, 0, 1] aibes, siulau naudoti [0,1,2] aibe, jei tik tai imanoma. |
|
|
|
|
 |
 |
Programos ilgumas |
Parašytas: 2015 10 19, 16:37 |
|
|
|
As asmeniskai tokiu griozdisku macrosu labai nemegstu... Geriau jau daryti proceduromis, juolab kad encoderiai nera ten kazkoks super greitas reikalas. |
|
|
|
|
 |
Programos ilgumas |
Parašytas: 2015 10 19, 16:48 |
|
|
|
dar:
Kodas: |
static uint8_t pin_o=PIND;
while(1){
uint8_t pin_d=PIND;
uint8_t pin_x=pin_d^pin_o;
if(pin_x&16){//pokytis PD4
if(pin_d&16){// PD4 patapo 1
/////////////// kodas
}else{// PD4 patapo 0
/////////////// kodas
}
}//PD4
////////// likes kodas
pin_o=pin_d;
}//while
|
|
|
|
|
|
 |
Programos ilgumas |
Parašytas: 2015 10 19, 16:50 |
|
|
|
Socrates rašo: |
As asmeniskai tokiu griozdisku macrosu labai nemegstu... Geriau jau daryti proceduromis, juolab kad encoderiai nera ten kazkoks super greitas reikalas. |
jei jau cia tikrai enkoderio proceduros, tai yra kurkas efektyvesniu proceduru, tad aftariau susisiek ir gausi pritaikyta konkreciai tau ir efektyvu koda. |
|
|
|
|
 |
Programos ilgumas |
Parašytas: 2015 10 19, 19:00 |
|
|
|
greitis labai aktualus, viso prie mikrovaldiklio,aisku jei užteks greičio, pajunkčiau 3 encoderius po 3 kanalus, bei dar 4 signalai kaip įeinantys, bei tiek pat kaip išeinantys |
|
|
|
|
 |
Programos ilgumas |
Parašytas: 2015 10 19, 19:51 |
|
|
|
Patikslink koks pasirinktas uCU, kokiam tikslui encoderis (meniu/cnc instrumento pozicija), koks tikslumas domina (viengubas, dvigubas, keturgubas), koks numatomas maksimalus busenu pasikeitimo daznis pfs (signalo pokyciu per sekunde). |
|
|
|
|
 |
 |
Programos ilgumas |
Parašytas: 2015 10 19, 20:34 |
|
|
|
cnc, misrus, ta prasme , kad galeciau pasirinkti x1,x2 ar x4 rezimus, dažnis, kol kas konkretaus nėra, jis priklausys nuo varikliukų max sukimosi greičio, atitinkamai bandysiu kiekvienam po viena, ar visiems varikliukams vieną mikrovaldiklį.
kodą pakoregavau savaip: kruvai kintamųju sukuriau 2 masyvus, ir žaidžiu su jais:
Kodas: |
while(1)
{
//A kanalas
if (PIND&pirmas)//PD4
{
if(laikymo[0]==0) skkilkri[0]++;
laikymo[0]=1;
//B,C, ...., kanalai
for (i=0;i<kanalai;i++)
{
if (PIND&(pirmas<<(i+1)))//PB5 ir PB6 ir .....
{
if(laikymo[i+1]==0) skkilkri[(i*2)+2]++;
laikymo[i+1]=1;
}
else
{
if(skkilkri[(i*2)+2]==-1) skkilkri[(i*2)+2]=0;
if(laikymo[i+1]==1) skkilkri[(i*2)+3]++;
laikymo[i+1]=0;
}
}
}
else
{
///A kanalas
if(skkilkri[0]==-1) skkilkri[0]=0;
if(laikymo[0]==1) skkilkri[1]++;
laikymo[0]=0;
//B,C, ...., kanalai
for (i=0;i<kanalai;i++)
{
if (PIND&(pirmas<<(i+1)))//PB5 ir PB6 ir .....
{
if(laikymo[i+1]==0) skkilkri[(i*2)+2]++;
laikymo[i+1]=1;
}
else
{
if(skkilkri[(i*2)+2]==-1) skkilkri[(i*2)+2]=0;
if(laikymo[i+1]==1) skkilkri[(i*2)+3]++;
laikymo[i+1]=0;
}
}
}
viso=skkilkri[0]+skkilkri[1]+skkilkri[2]+skkilkri[3]+skkilkri[4]+skkilkri[5];
PORTB= viso;
//TODO:: Please write your application code
} |
o enkoderiu režimai skirsis tik ką su kuo sudėsiu, mikrovaldiklis pamiršau paminėti attiny2313(pradžiai) |
|
|
|
|
 |
 |
Programos ilgumas |
Parašytas: 2015 10 19, 22:19 |
|
|
|
su Attini2313 nekazika ten ir padarysi, net jei assembleriu viska rasysi.
Jei jau darysi CNC, tai patikslink ka ten tokio buri?
Tu enkoderius naudosi linijines pavaros padeciai nustatyti, o pati pavara valdysis DC varikliu?
Jei varikliai zingsniniai, tai geriau jau mechanika susiderink, nors enkoderiai ir nepamaisys.
Jei visgi zingsniniai, tai kas uz steperiu driverius?
kuom komunikuosi su PC ar G-Code skaitysi is SD korteles?
taip ir neatsakei koks daznis is enkoderiu?
Jei reikia microsteppingo, tai sis attiny gali aptarnauti max 1 stepperi
Jei reikia didesnio servo pozicionavimo tikslumo, tai velgi max 1 servo galesi valdyti 16bit PWM
Arba iskarto imk Atmega2560 (pvz Arduino MEGA + RAMPS), arba ziurek i koki nors ARM, pvz Stelaris/Tiva ar STM32 ir nesuk niekam cia kiausiu.
vienas is pavyzdziu attiniui butu:
Kodas: |
#include <inttypes.h>
#include <avr/interrupt.h>
#include <avr/io.h>
#include <util/atomic.h>
volatile int16_t encPosition=0;
static int16_t encOldPos=0;
const uint8_t encInc[]={0,2,1,0,1,0,0,2,2,0,0,1,0,1,2,0};
static uint8_t pin_o=0;
ISR(PCINT_vect){//PB0,PB1 as PhaseA/PhaseB
register uint8_t t=(PINB&3)|pin_o;
pin_o=t<<2; t=encInc[t&15];
if(1==t){encPosition++;}//jei reikia, kryptis galima sukeisti per ++/--
else if(2==t){encPosition--;}
}
void main(void){
pin_o=(PINB&3)<<2;
PCMSK=(1<<PCINT1)|(1<<PCINT0);
GIMSK|=(1<<PCIE);
sei();
while(1){
int16_t enc_cpy;
ATOMIC_BLOCK(ATOMIC_RESTORESTATE){enc_cpy=encPosition;}
int16_t encDist=enc_cpy-encOldPos; encOldPos=enc_cpy;
if(encDist>0){
//encPosition padidejo
}else
if(encDist<0){
//encPosition sumazejo
}
////// likes kodas
}
}
|
|
|
Paskutinį kartą redagavo AlgisL, 2015 10 20, 07:13. Redaguota 1 kartą |
|
|
|
 |
 |
Programos ilgumas |
Parašytas: 2015 10 19, 23:27 |
|
|
|
Žinksniniu varikliuku tikslinimui, šiaip kaip ir nelabai reikia, bet , kadangi turiu tai dedu enkoderius, valdau su pc per kažkokia... nepamenu, kiniška plokšte 5 ašių, driveriai toshiba TB6560AHQ, realiai, enkoderiai gaunasi tik dėl pamesto signalo ne daugiau, tai turėtų būti intarpas tarp toshibos ir kiniskos plokstes, o enkoderiai tai: jųmaksimalus mechaninis greitis 5000r/min. o dažnis iki 20khz
Staklių mechaninė dalis kaip ir baigta, pratestuota. Beliko elektrronika, žinoma ir "apdailos" reikalai |
|
|
|
|
 |
 |
Programos ilgumas |
Parašytas: 2015 10 20, 00:39 |
|
|
|
jei nori greicio ir paprastumo reiketu naudoti pertraukimus
vieno enkoderio funkcija gaunasi mazdaug tokia:
extint(){
if (PIND.1==0 ) x++; else x--;
}
trupesnes nesugalvosi
cia petraukimas pajungtas ant kurio nors vieno is IQ enkoderio laido
o pind.1 tai kitas to paties enkoderio laidas.
pertaukima sukonfiguruok pvz ant kylancio fronto
nenaudojant pertraukimu rezultatai bus gana prasti
priklausomai nuo konkretaus procesroiaus programa gali kiek skirtis
jei pertraukimu procesorius turi daug galima visus enkoderio laidus pajungti ant pertraukimu tada enkoderio rezoliucija padides du kartus. |
|
|
|
|
 |
 |
Programos ilgumas |
Parašytas: 2015 10 20, 07:18 |
|
|
|
Digix rašo: |
extint(){
if (PIND.1==0 ) x++; else x--;
}
trupesnes nesugalvosi
cia petraukimas pajungtas ant kurio nors vieno is IQ enkoderio laido
o pind.1 tai kitas to paties enkoderio laidas.
pertaukima sukonfiguruok pvz ant kylancio fronto
|
tik tikslmas bux x1, vietoje x4
sitas supaprastintas variantas tinka tik meniu valdymo encoderiui |
|
|
|
|
 |
Programos ilgumas |
Parašytas: 2015 10 20, 10:45 |
|
|
|
AlgisL rašo: |
Digix rašo: |
extint(){
if (PIND.1==0 ) x++; else x--;
}
trupesnes nesugalvosi
cia petraukimas pajungtas ant kurio nors vieno is IQ enkoderio laido
o pind.1 tai kitas to paties enkoderio laidas.
pertaukima sukonfiguruok pvz ant kylancio fronto
|
tik tikslmas bux x1, vietoje x4
sitas supaprastintas variantas tinka tik meniu valdymo encoderiui |
Kaip suprantu galima su pertrauktim sukonfiguruot ant abieju frontu, jei reikia X4?
O siaip as tada rinkciausi mikrovaldikli su encoderio interfeisu  |
|
|
|
|
 |
 |
Programos ilgumas |
Parašytas: 2015 10 20, 10:54 |
|
|
|
1) autorius kazkodel tikisi dideliu stebuklu is ATtiny2313
2) mano ISR pavyzdys ir aptarnauja iskarto 2 pinus ir abiem frontais
Kodas: |
ISR(PCINT_vect){//PB0,PB1 as PhaseA/PhaseB
register uint8_t t=(PINB&3)|pin_o;
pin_o=t<<2; t=encInc[t&15];
if(1==t){encPosition++;}
else if(2==t){encPosition--;}
}
|
3) specializuotas uCU bus ne blogiau, bet autorius kogero neturi reikiamos patirties.
4) ISR galima uzrasyti pliku ASM ir tada sanaudos prie 20kHz nesieks nei 0,5% |
|
|
|
|
 |
Programos ilgumas |
Parašytas: 2015 10 20, 11:20 |
|
|
|
Socrates rašo: |
O siaip as tada rinkciausi mikrovaldikli su encoderio interfeisu  |
tai o koks CPU turi bent jau 3 arba daugiau enkoderiu interfeisus? |
|
|
|
|
|
 |
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 |
 |
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 |
|

|
 |