 |

|
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 1 iš 2 Pereiti prie 1, 2 Toliau |
|
 |
 |
 |
Plonybės su PIC'ais |
Parašytas: 2012 05 17, 14:47 |
|
|
|
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 |
Parašytas: 2012 05 17, 15:07 |
|
|
|
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 |
Parašytas: 2012 05 17, 15:34 |
|
|
|
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 |
Parašytas: 2012 05 17, 15:39 |
|
|
|
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  |
|
Paskutinį kartą redagavo Saugos_kodas, 2012 05 17, 15:59. Redaguota 1 kartą |
|
|
|
 |
 |
Plonybės su PIC'ais |
Parašytas: 2012 05 17, 15:50 |
|
|
|
koks skirtumas kaip adresuojami adc kanalai? |
|
_________________ Nieko taip lengvai nedaliname, kaip patarimus... |
|
|
|
 |
Plonybės su PIC'ais |
Parašytas: 2012 05 17, 15:54 |
|
|
|
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 |
Parašytas: 2012 05 17, 16:01 |
|
|
|
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 |
Parašytas: 2012 05 17, 17:08 |
|
|
|
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 |
Parašytas: 2012 05 17, 17:15 |
|
|
|
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 |
Parašytas: 2012 05 17, 18:13 |
|
|
|
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 |
Parašytas: 2012 05 17, 18:35 |
|
|
|
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 |
Parašytas: 2012 05 17, 21:03 |
|
|
|
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  |
|
|
|
|
 |
 |
Plonybės su PIC'ais |
Parašytas: 2012 05 17, 22:45 |
|
|
|
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 |
Parašytas: 2012 05 18, 09:51 |
|
|
|
(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 |
Parašytas: 2012 05 18, 14:11 |
|
|
|
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. |
|
|
|
|
|
 |
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 |
 |
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 |
|

|
 |