Elektronika.lt
 2025 m. spalio 12 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 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 13
Pereiti prie 1, 2, 3  Toliau
Pradėti naują temą  Atsakyti į pranešimą Rodyti ankstesnį pranešimą :: Rodyti kitą pranešimą 
 Programos ilgumas
PranešimasParašytas: 2015 10 19, 15:57 Pranešti apie taisyklių pažeidimą Atsakyti su citata
Saulius18
Užkietėjęs dalyvis
Užkietėjęs dalyvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą Apsilankyti vartotojo tinklapyje
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
PranešimasParašytas: 2015 10 19, 16:34 Pranešti apie taisyklių pažeidimą Atsakyti su citata
AlgisL
Senbuvis
Senbuvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
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
PranešimasParašytas: 2015 10 19, 16:37 Pranešti apie taisyklių pažeidimą Atsakyti su citata
Socrates
Senbuvis
Senbuvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
As asmeniskai tokiu griozdisku macrosu labai nemegstu... Geriau jau daryti proceduromis, juolab kad encoderiai nera ten kazkoks super greitas reikalas.
 Programos ilgumas
PranešimasParašytas: 2015 10 19, 16:48 Pranešti apie taisyklių pažeidimą Atsakyti su citata
AlgisL
Senbuvis
Senbuvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
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
PranešimasParašytas: 2015 10 19, 16:50 Pranešti apie taisyklių pažeidimą Atsakyti su citata
AlgisL
Senbuvis
Senbuvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
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
PranešimasParašytas: 2015 10 19, 19:00 Pranešti apie taisyklių pažeidimą Atsakyti su citata
Saulius18
Užkietėjęs dalyvis
Užkietėjęs dalyvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą Apsilankyti vartotojo tinklapyje
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
PranešimasParašytas: 2015 10 19, 19:51 Pranešti apie taisyklių pažeidimą Atsakyti su citata
AlgisL
Senbuvis
Senbuvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
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
PranešimasParašytas: 2015 10 19, 20:34 Pranešti apie taisyklių pažeidimą Atsakyti su citata
Saulius18
Užkietėjęs dalyvis
Užkietėjęs dalyvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą Apsilankyti vartotojo tinklapyje
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
PranešimasParašytas: 2015 10 19, 22:19 Pranešti apie taisyklių pažeidimą Atsakyti su citata
AlgisL
Senbuvis
Senbuvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
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
PranešimasParašytas: 2015 10 19, 23:27 Pranešti apie taisyklių pažeidimą Atsakyti su citata
Saulius18
Užkietėjęs dalyvis
Užkietėjęs dalyvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą Apsilankyti vartotojo tinklapyje
Ž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
PranešimasParašytas: 2015 10 20, 00:39 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ą
jei nori greicio ir paprastumo reiketu naudoti pertraukimus


vieno enkoderio funkcija gaunasi mazdaug tokia:

extint(){
if (PIND.1==0 ) x++; else x--;
}
trupesnes nesugalvosi Laughing

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
PranešimasParašytas: 2015 10 20, 07:18 Pranešti apie taisyklių pažeidimą Atsakyti su citata
AlgisL
Senbuvis
Senbuvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
Digix rašo:
extint(){
if (PIND.1==0 ) x++; else x--;
}
trupesnes nesugalvosi Laughing

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
PranešimasParašytas: 2015 10 20, 10:45 Pranešti apie taisyklių pažeidimą Atsakyti su citata
Socrates
Senbuvis
Senbuvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
AlgisL rašo:
Digix rašo:
extint(){
if (PIND.1==0 ) x++; else x--;
}
trupesnes nesugalvosi Laughing

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 Smile
 Programos ilgumas
PranešimasParašytas: 2015 10 20, 10:54 Pranešti apie taisyklių pažeidimą Atsakyti su citata
AlgisL
Senbuvis
Senbuvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
1) autorius kazkodel tikisi dideliu stebuklu is ATtiny2313 Twisted Evil
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
PranešimasParašytas: 2015 10 20, 11:20 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ą
Socrates rašo:

O siaip as tada rinkciausi mikrovaldikli su encoderio interfeisu Smile


tai o koks CPU turi bent jau 3 arba daugiau enkoderiu interfeisus?
Pradėti naują temą  Atsakyti į pranešimą Pereiti prie 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
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
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