Elektronika.lt
 2025 m. liepos 25 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 07 25, 03:42. Visos datos yra GMT + 2 valandos.
 Forumas » Mikrovaldikliai » Plonybės su PIC'ais
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 12
Pereiti prie 1, 2  Toliau
Pradėti naują temą  Atsakyti į pranešimą Rodyti ankstesnį pranešimą :: Rodyti kitą pranešimą 
 Plonybės su PIC'ais
PranešimasParašytas: 2012 05 17, 14:47 Pranešti apie taisyklių pažeidimą Atsakyti su citata
Saugos_kodas
Naujokas
Naujokas
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
Kadangi programa veiks mikrovaldiklyje, konkrečiau PIC, tai ir taikau į šį forumą, bet klausimas gali būti užduotas ir Programavimo forume. Jei moderatoriai manys, kad ten jis tinka geriau - lai perkelia.
Gal galit pasiūlyti būdą, kaip iš skaičiaus nuskaityti bitų pozicijas ir jas sudėti į masyvą. Programuojama C kalba. Kad vaizdžiau būtų, keletas pavyzdžių:

Tarkime, turime 8 bitų žodelį, skaičių nuo 0 iki 255, sakykime:

75 = 0x 4B = 0b 01001011;
Turėtume gauti masyvą kurs atrodo arr[] = {0,1,3,6}

255 = 0x FF = 0b 11111111;
Turėtume gauti masyvą kurs atrodo arr[] = {0,1,2,3,4,5,6,7}

Šis žodis apibūdina aktyvių ADC kanalų įjungimą. Kodas, kuriame naudočiau masyvo nuskaitymą.

Kodas:
short int arr[];
short int Delsa_K;
short int Delsa_T;

void main(void)
{
 Init();

Kn = sizeof(arr)/sizeof(arr[1]);
while(PIR1.RCIF == 0) {

for(j = 0; j < Kn; j++){
           rezultatas = getADC(arr[j]);
           hex2dec2uart(rezultatas, arr[j]);
           VDelay_ms(Delsa_K);
           }
VDelay_ms(Delsa_T);
} //END while(PIR1.RCIF == 0)
} //END MAIN
 Plonybės su PIC'ais
PranešimasParašytas: 2012 05 17, 15:07 Pranešti apie taisyklių pažeidimą Atsakyti su citata
specialistas
Užkietėjęs dalyvis
Užkietėjęs dalyvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą Siųsti el. laišką
Kodas:

unsigned char arr[8];
unsigned char zodis, n, p=0;
for(n=0; n<8; n++){
   if(zodis & 0x01){
      arr[p] = n;
      p++;
   }
   zodis = zodis >> 1;
}
 Plonybės su PIC'ais
PranešimasParašytas: 2012 05 17, 15: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ą
as rasytau trumpiau:
Kodas:

unsigned char arr[9];
unsigned char zodis,n,p;
for (p=0;n=0;n<8;n++)
    if (zodis&(1<<n)) arr[p++]=n;
arr[9]=p;


beje, ka nori tuom padaryt?
Kodas:

Kn = sizeof(arr)/sizeof(arr[1]);


nebent pakoreguotium i:
Kodas:

for(j = 0; j<arr[9]; j++)
           rezultatas = getADC(arr[j]);


beje p galima aprasyti ir taip
Kodas:

unsigned char arr[9];
usigned char *p=&arr[9];
unsigned char zodis,n;
for ((*p)=0;n=0;n<8;n++)
    if (zodis&(1<<n)) arr[(*p)++]=n;

for(j = 0; j<(*p); j++)
           rezultatas = getADC(arr[j]);


[/code]


Paskutinį kartą redagavo AlgisL, 2012 05 17, 15:47. Redaguota 2 kartus(ų)
 Plonybės su PIC'ais
PranešimasParašytas: 2012 05 17, 15:39 Pranešti apie taisyklių pažeidimą Atsakyti su citata
Saugos_kodas
Naujokas
Naujokas
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
Ačiū už atsakymą specialistas, puikus pavyzdys.
Deja jis ne visiškai atitinka tai ko man reikėtų. Šis, jūsų pateiktas, ciklas generuoja tokį masyvą:

jei zodis: 15 = 0xFF = 0b00001111 , tai turime arr[] = {0,1,2,3,0,0,0,0},
kai norėčiau kad būtų arr[] = {0,1,2,3}

jei zodis: 4 = 0x04 = 0b00000100 , tai turime arr[] = {0,0,2,0,0,0,0,0},
kai norėčiau kad būtų arr[] = {2}

jei zodis:205 = 0xCD = 0b11001101 , tai turime arr[] = {0,0,2,3,0,0,6,7},
kai norėčiau kad būtų arr[] = {0,2,3,6,7}

Problema tame, kad negaliu masiškai imti ir pašalinti visų masyve esančių 0, todėl kad ADC kanalai numeruojami nuo 0, ir norint nuskaityti 0 - inį kanalą, kuris musu kalba dažnai apibūdinamas kaip pirmasis kanalas, man reikia naudoti funkcija "adcREAD(0)''. Jei noriu nuskaityti antrąjį kanalą, aš naudoju "adcREAD(1)" nes kaip jau sakiau, keitiklis numeruoja kanalus nuo 0. Jei ši pastraipa pakartojo tai, ką jau ir taip žinote, atsiprašau Wink


Paskutinį kartą redagavo Saugos_kodas, 2012 05 17, 15:59. Redaguota 1 kartą
 Plonybės su PIC'ais
PranešimasParašytas: 2012 05 17, 15:50 Pranešti apie taisyklių pažeidimą Atsakyti su citata
caca
Patyręs dalyvis
Patyręs dalyvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą Siųsti el. laišką
koks skirtumas kaip adresuojami adc kanalai?

_________________
Nieko taip lengvai nedaliname, kaip patarimus...
 Plonybės su PIC'ais
PranešimasParašytas: 2012 05 17, 15:54 Pranešti apie taisyklių pažeidimą Atsakyti su citata
Saugos_kodas
Naujokas
Naujokas
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
AlgisL rašo:
as rasytau trumpiau:
Kodas:

unsigned char arr[9];
unsigned char zodis,n,p;
for (p=0;n=0;n<8;n++)
    if (zodis&(1<<n)) arr[p++]=n;
arr[9]=p;

Jūsų pateiktame pavyzdyje identiška problemėlė, kaip ir specialistas versijoje. Žr. žinutę (15:39) aukščiau.

AlgisL rašo:

beje, ka nori tuom padaryt?
Kodas:

Kn = sizeof(arr)/sizeof(arr[1]);

Čia kad žinočiau masyvo elementų skaičių, kai masyvo dydis kinta nuo 1 elemento iki 8.


Paskutinį kartą redagavo Saugos_kodas, 2012 05 17, 16:04. Redaguota 1 kartą
 Plonybės su PIC'ais
PranešimasParašytas: 2012 05 17, 16:01 Pranešti apie taisyklių pažeidimą Atsakyti su citata
Saugos_kodas
Naujokas
Naujokas
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
caca rašo:
koks skirtumas kaip adresuojami adc kanalai?

Skirtumas tame, kad specialisto ir AlgioL pateiktuose koduose aš nuskaitau reikšmes tokia tvarka:
    kai zodis = 15:
    itampa kanale 0
    itampa kanale 0
    itampa kanale 0
    itampa kanale 0
    itampa kanale 0
    itampa kanale 1
    itampa kanale 2
    itampa kanale 3
    Ciklas kartojasi nuo pradziu
    O man reikia, kai zodis = 15:
    itampa kanale 0
    itampa kanale 1
    itampa kanale 2
    itampa kanale 3
    Ciklas kartojasi nuo pradziu
    O man reikia, kai zodis = 205 = 0xCD:
    itampa kanale 0
    itampa kanale 2
    itampa kanale 3
    itampa kanale 6
    itampa kanale 7
    Ciklas kartojasi nuo pradziu
 Plonybės su PIC'ais
PranešimasParašytas: 2012 05 17, 17:08 Pranešti apie taisyklių pažeidimą Atsakyti su citata
AlgisL
Senbuvis
Senbuvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
siuo atveju
Kodas:

unsigned char arr[9];
unsigned char zodis=0xC3,n,p;
for (p=0,n=0;n<8;n++)
    if (zodis&(1<<n)) arr[p++]=n;
arr[9]=p;

gavau:


zodis=0xC3
0 1 6 7 0 0 0 0
p=4


o siuo atveju
Kodas:

unsigned char arr[9];
usigned char *p=&arr[9];
unsigned char zodis=0xAA,n;
for ((*p)=0,n=0;n<8;n++)
    if (zodis&(1<<n)) arr[(*p)++]=n;

for(j = 0; j<(*p); j++)
           rezultatas = getADC(arr[j]);



zodis=0xAA
1 3 5 7 0 0 0 0
1 3 5 7
(*p)=4
 Plonybės su PIC'ais
PranešimasParašytas: 2012 05 17, 17:15 Pranešti apie taisyklių pažeidimą Atsakyti su citata
AlgisL
Senbuvis
Senbuvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
siaip, po c,c++ esu tik diletantas, tai dar neradau kaip jame issireiksti
var a:byte;b:byte; absolute $a;
gal kas bakstels zlibiui nuoroda, nes net neisivaizduoju kaip google to paklausti?
 Plonybės su PIC'ais
PranešimasParašytas: 2012 05 17, 18:13 Pranešti apie taisyklių pažeidimą Atsakyti su citata
Saugos_kodas
Naujokas
Naujokas
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
Na jau, na jau...diletantas.. Aš apie savo programavimo lygmenį net užsiminti nedrįstu. Tiesą pasakius, neturiu supratimo kaip veikia tie "pointeriai", tad nelabai perprantu antrą kodo pavyzdį.

Jei teisingai suprantu, antrasis pavyzdys nepalieka 0 - inių reikšmių kanalų aktyvavimo masyve, bet tuomet kai zodis = 9 arba 15, nenuskaitomas 0 - inis kanalas, vietoje jo nuskaitant 1-ajį kanalą, o tai yra negerai.

Na iš esmės, pirminė užduotis tokia: su 1B informacijos įjungti norimus kanalus. Pas mane stipriai apribotas perduodamos informacijos kiekis, tad negaliu sau leisti atsiųsti tarkime 8 skaitmenų ASCII formatu (jei veikia visi 8 kanalai), kad užpildyti kanalų įjungimo masyvą.
 Plonybės su PIC'ais
PranešimasParašytas: 2012 05 17, 18:35 Pranešti apie taisyklių pažeidimą Atsakyti su citata
AlgisL
Senbuvis
Senbuvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
abu pavyzdziai arr[8] uzpildo tavo pateiktais bitu numeriais, o i arr[9] patalpina kiek reiksmingu bitu buvo. antras pavizdys kintamaji p apraso kaip rodykle i arr[9], todel vietoje arr[9] kode uztenka parasyti (*p).
tiesa apskliausti nevisada butina, bet patartina, nes *p++ ne taspat kaip (*p)++, kaip ir *p+=x nelygu arr[9]+=x

pritaikant pas save gali nedaryti arr[9], o panaudoti du atskirus kintamuosius
usnigned char arr[8],p;
tada arr[] bus uzpildytas bitais, o p saugos reiksmingu bitu (uzduotu kanalu skaiciu)

taip pat nieko baisaus nenutiktu, jei kanalus numeruotum 1..8,
tada tik pasikoreguotum getADC(arr[n]-1);
tokio poziurio pliusas, kad apart masyvo arr[] nieko perduoti nereiketu, t.y. galetum atsiputes rasyt ir nereiktu tau jokio papildomo kintamojo !
Kodas:

for (n=0;n<sizeof(arr);n++)
  if (arr[n]) getADC(arr[n]-1);
    else break;
 Plonybės su PIC'ais
PranešimasParašytas: 2012 05 17, 21:03 Pranešti apie taisyklių pažeidimą Atsakyti su citata
Saugos_kodas
Naujokas
Naujokas
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
Matyt keistai atrodo, bet neįsikertu į paskutinio jūsų kodo logiką.
AlgisL rašo:
Kodas:

for (n=0;n<sizeof(arr);n++)
      if (arr[n]) getADC(arr[n]-1);
      else break;

Nelabai suprantu ką gražina sąlygos sakinys "if (arr[n])". Jei teisingai interpretuoju jūsų parašytą pastraipą, tai visas kodas galėtų atrodyti taip:

Kodas:

unsigned char arr[8];
unsigned char q;
unsigned char pl;
short int Delsa_K;
short int Delsa_T;
unsigned char zodis = 0;


void interrupt() {                   
       if (PIR1.RCIF == 1) //ar interuptas is UART'o
       {                     
       GIE_bit = 0; PEIE_bit = 0; RCIE_bit = 0;
       while(!UART1_Data_Ready());
       zodis= UART1_Read();
       for (pl=0,q=0;q<8;q++){
             if (zodis&(1<<q)) arr[pl++]=q;
             }
       arr[9]=pl;       
       
       RCIF_bit = 0;
       RCIE_bit = 1; GIE_bit = 1; PEIE_bit = 1;
       } //end Interupt


void main(void)
{
 Init();
 Delsa_K = 50;
 Delsa_T = 100;


while(PIR1.RCIF == 0){
for (q=0;q<sizeof(arr);q++){
       if (arr[q]){
           rezultatas = getADC(arr[q]-1);
           hex2dec2uart(rezultatas, arr[q]-1);//pavercia ASCII ir issiuncia rez, ir kanalo numeri
           VDelay_ms(Delsa_K);
           }
       else break;
       }
 VDelay_ms(Delsa_T);
} // end while(PIR1.RCIF == 1)
} // end MAIN


Stengiuosi išgauti tai, ką jau aprašiau ankstesnėje žinutėje. Kai kažkas ateina iš UART'o, trūkyje nuskaitau vieną baitą info. Hi_lvl bitus, pagal pateiktą pavyzdį sugrūdu į masyvą. Main{} programoje vieną po kitos nuskaitinėju reikšmes iš arr[] masyvo.

Bet dėja negaunu rezultato, kurio tikėjausi. Jei UART'u nusiunčiu 15, kas klaviatūra būtų "Ctrl+O", neįsijungia nei nei vienas kanalas, kai turėtų veikti keturi (0,1,2,3). Jei nusiunčiu "Ctrl+H" = 0x8, įjungiami iš eilės 0,1,2,2, kai turėtų veikti tik 3 kanalas, skaičiuojant nuo nulinio. Bet kokiu atveju, dėkoju už pastangas Wink
 Plonybės su PIC'ais
PranešimasParašytas: 2012 05 17, 22:45 Pranešti apie taisyklių pažeidimą Atsakyti su citata
specialistas
Užkietėjęs dalyvis
Užkietėjęs dalyvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą Siųsti el. laišką
unsigned char arr[8];
unsigned char zodis, n, p=0;
for(n=0; n<8; n++){
if(zodis & 0x01){
arr[p] = n;
p++;
}
zodis = zodis >> 1;
}

for(n=0; n<p; n++){
adcREAD(arr[n]);
}
 Plonybės su PIC'ais
PranešimasParašytas: 2012 05 18, 09: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ą
(argumentas) ekvivalentu (argumentas != 0)
(!argumentas) ekvivalentu (argumentas == 0)
Kodas:

unsigned char arr[8];
short int Delsa_K;
short int Delsa_T;

void interrupt()
{
register unsigned char zodis,kiekis,bitas;                   

    if (PIR1.RCIF) //ar interuptas is UART'o
    {                     
        GIE_bit=0; PEIE_bit=0; RCIE_bit=0; // as tiek nedeliociau
// cia per akis RCIE_bit, o ir tai nebutina, jei algoritmas kokybiskas ir niekada netruks ilgiau nei simbolio perdavimas

        if (UART1_Data_Ready()) // ar tikrai binary formate perduodi ZODIS ?
        { 
            zodis=UART1_Read();

            for (kiekis=0,bitas=1;(zodis);bitas++) // numeracija 1..n
                if (zodis&(1<<bitas)) arr[kiekis++]=bitas;

            while (kiekis<=sizeof(arr)) arr[kiekis]=0; // cia tam atvejui jei pertraukimas ivyko main prodeduroje apdorojant nuskaitymo cikla
        }
        RCIF_bit=0; RCIE_bit=1; GIE_bit=1; PEIE_bit=1; // zek auksciau
    }
} //end Interupt


void main(void)
{
register unsigned char q;

    arr[0]=0;
    Delsa_K=50;
    Delsa_T=100;
    Init();

    while(1)
    {
        for (q=0;(arr[q])&&(q<sizeof(arr));q++)
        if (RCIF) break // galimai pasikeite ZODIS, todel pernauja
// bet cia dar ne viskas, gali nesuveikti, rimciau butu veliaveliu mechanizmas
        else       
        {
             rezultatas=getADC(arr[q]-1);
             hex2dec2uart(rezultatas, arr[q]-1); //pavercia ASCII ir issiuncia rez, ir kanalo numeri
             VDelay_ms(Delsa_K);
        }
        VDelay_ms(Delsa_T);

    } // end while(1)

} // end MAIN
 Plonybės su PIC'ais
PranešimasParašytas: 2012 05 18, 14:11 Pranešti apie taisyklių pažeidimą Atsakyti su citata
Saugos_kodas
Naujokas
Naujokas
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
Ačiū paaiškinimus dėl IF sąlygos.

Šiek tiek apie jūsų siūlomą kodą.

Kad aiškiau būtų interpretuoti, tai numečiau puslapį. Čia matosi numeruotos eilutės. Taigi, 11 kodo eilutėje deaktyvuoju pertraukčių bitus tam, kad neįvyktų pertrauktis ją aptarnaujant. Kaip ir pastebėjote, išeidamas iš pertraukties 23 eil. juos vėl įjungiu. Kodėl siūlote to nedaryti?

14 eil. komentare užduodate klausimą. Taigi, atsakymas: kad UART'u išsiųsti binary vertę, naudoju puslapyje nurodytais trumpiniais. Na, sakykim, kad išsiųsti, 15 = 0x0F reikia klaviaturoje spausti {CTRL+O}, kad siųsti 31 = 0x1F reikia spausti {CTRL+_}, tai laikyčiau kad ZODIS perduodu binary formate.

Ar kartias sizeoff() funkcija negražina rezervuoto bitų kiekio? Kalbu apie 21 eil. Man kažkodėl atrodo, jei unsigned char arr[8], tai sizeoff{arr} = 16. Tas pats 39 eil. Ar aš šioje vietoje klystu?

Kaip ten bebūtų, mikrovaldiklis nereaguoja į aktyvių kanalų pokyčius.
Pradėti naują temą  Atsakyti į pranešimą Pereiti prie 1, 2  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
FS25 Mods
FS25 Harvesters, FS25 Tractors Mods, FS25 Maps 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
Football Training Kit
Football Training Equipment, Football Skills, Football Training
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
FS22 mods, Farming simulator 22 mods,
FS22 maps

fs22.com
Reklama


Reklama