 |

|
|
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 12 25, 00:54. 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 2 iš 2 Pereiti prie Atgal 1, 2 |
|
 |
 |
 |
Plonybės su PIC'ais |
Parašytas: 2012 05 18, 14:27 |
|
|
|
|
| Saugos_kodas rašo: |
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. |
sizeof() grazina masyvo apimti baitais !
sizeof(unsigned char) yra 1
sizeof(unsigned char arr[8]) yra 8
jei gauni ne taip, reiskia pas tave ne char, o pvz short, kuris gali buti tiek 8bitu tiek 16bitu tiek 32bitu, priklausomai nuo cpu tipo !
numeruojant kanalus 1..n atrandame galimybe 0 pazymeti masyvo pabaiga, bet zymeti reikia tik tada, kai kanalu prirenki maziau nei masyvo dydis, kad zodis=255 atveju netektu arr[p]=0, kai p reikesme tuo metu jau bus 9 ir ivyks neteisingas atminties perrasymas
del pertraukciu, tai ju isvis nera prasmes drausti, jei kodas korektiskas ir reikia tik tuos drausti, kurie gali sutrikdyti darba, bet tai retas ir atskiras klausimas, tuo tarpu bandai uzdrausti viska ir visiskai bereikalingai.
CTRL+kombinacija gerai, bet nepatogi
yra ALT+kodas mazojoje klavoje
taciau ir tai nera patogu
geriau yra padaryti perduodamu skaitmenu dorokle
jei sutinki '0'..'9' -
| Kodas: |
c=USART_Read();
if ((c>='0')&&(c<='9')) sk=sk*10+c-'0';
else
{
// dorojam sk
sk=0;
}
|
|
|
|
|
|
|
 |
 |
Plonybės su PIC'ais |
Parašytas: 2012 05 19, 18:11 |
|
|
|
|
Dėl sixeof() aišku. Dėkoju kad pataisėte. Su pertrauktimis irgi paaiškėjo. Palikau tik pertraukties flag'o išvalymą pertraukties pabaigoje.
Vistik neaišku kodėl mikrovaldiklis neišsiunčia reikšmių. Skripte klaidos kaip ir nematau, bet matyt kažką pražiūriu.
Dabar galvoju, kad reikia plačiau apibūdinti sistemą. Tada bus lengviau paaiškinti kodėl reikia vieno ar kito programinio dalykėlio. Reikalas tas, kad projektuojuosi bevielio ryšio sistemėlę, su keletu nutolusių jutiklių. Tinklo koordinatorius jungiamas prie kompiuterio per (USB -RS232), nutolę duomenų fiksavimo moduliai (jutikliai) jam siunčia informaciją. Koordinatorius perduoda jutikliams veikimo komanda, kanalu veikimo "zodi" ir dvi laiko vertes. Laiko vertės ne didesnės nei 100 ms, taigi vėl telpu į vieną baitą kiekvienai laiko vertei. Šiuos 4 B info koordinatorius gauna iš kompiuterio. Kodas parodo mano įsivaizduojamą modulio veikimo algoritmuką. Visgi negaliu gauti norimo rezultato. Nelabai suprantu kodėl, bet nesuveikia norimi kanalai.
{EDITED...} Sugalvojau kad darysiu tik 4 adc įėjimo kanalus. Ir nevargsiu su pastangomis iš vieno B info dekoduoti aktyviųjų kanalų reikšmes. Uartu nusiųsiu visų jų numerius ir tiek. Bus paprasčiau. Bet kokiu atveju, įdėja lieka atvira, tad jei kokių minčių atsiras dėl pirminės užduoties -prašom pasidalinti. |
|
|
|
|
|
 |
 |
Plonybės su PIC'ais |
Parašytas: 2012 05 19, 21:12 |
|
|
|
|
pertrauktyje tai ten susvaigai kap turi but
atmink, niekada nestabdyk cpu pertrauktyje ir nevesk laukti kazkokiu duomenu, kuriu jis gali ir negauti niekada;
| Kodas: |
register unsigned char i=0;
unsigned char rx[4];
void interupt(void)
{
if (PIR1.RCIF)
{
if (i>=sizeof(rx)) i=0; // apsisaugom masyvo perpildymo
if ((rx[i++]=UART1_Read())==124)
{
if (i==4) // 124 turi buti 4 baitas
{
// tolesni veiksmai su rx[0..3]
i=0;
}
}
PIR1.RCIF=0;
}
}
|
siaip, teisybes delei, pas tave labai grubi sinchronizacija, todel karts nuo karto tau teks siusti 124,124,124,124 ir juos eliminuoti is apdorojimo arba skaiciuoti rx_time_out.
normaliai dirbant reikia sinchro_byte arba packet_start, packet_data, CRC
jei duomenu kiekis kintamas - pries packet_data eina packet_len
visi simboliai packet_len, packet_data, CRC dazniausiai perduodami hex simboliniam formate, kad nesutaptu su synchro ar packet_start simboliais
sudetingesnis paketas tiesiog butinas, jei zadi naudoti negarantuota transporta, pvz bevieli rysi !
suprask, realaus laiko sistemos - ne sestoku informatikos pamokele, kur gali svaigt kiek tik panorejes ir vistiek atsiskaitysi, pramoneje dazniausiai daroma rimtai, kad veiktu ir galvos neskaudetu. |
|
|
|
|
|
 |
 |
Plonybės su PIC'ais |
Parašytas: 2012 05 19, 22:56 |
|
|
|
|
Ačiū dėl išsakytų pastebėjimų. Išties aš nežinau tokios esminės valdiklių abėcėlės, tad dėl tos pertraukties, kai jau pasakėte, pasidaro akivaizdu, kad taip netinka daryti, kaip kad mano kode.
Būtų labai puiku jei tuos pramonėje taikomus sprendimus "kurie veikia ir galvos neskauda" ypač dėl realaus laiko ryšio sistemų pakaišiotumėt dažniau. Duomenis žadu apdoroti real-time arba kiek įmanoma sparčiau (na keletas ms ne bėda) ir atvaizduoti ekrane. Python programavimo kalba rašausi GUI, kuriuo valdyčiau jutiklių tinklą. Tikrumos dėlei, jutikliuose bevielio ryšio perdavimo chip'as su mikrovaldikliu kalbėsis per SPI, bet čia testavimui dabar krapštausi su RS232, todėl, kad tinklo koordinatorius bus jungiamas per šią sąsają ir priims iš PC valdymo komandas, kurias siųs jutikliams, bei perdavinės PC'iukui iš jų gautus ADC duomenis.
Kiek plačiau apie bevielio ryšio modulius. Tai ZigBee protokolo IEEE802.15.4 standarto versija - MiWi moduliukai iš MicroChip. Atsiradus poreikiui, pakomentuočiau plačiau apie juos.
Jie turi tam tikrą Stack'ą, ir numatytas siunčiamų žinučių rūšis. Na, konkrečiau, tai yra 4žinutės (MAC komandos, Data, Acknowledgement, Beacon) Visose šiose žinutėse yra kadrai, apibūdinantys jūsų išsakytus baitus. Kalbu apie (sinchro, packet ir etc.) Principas toks, kad programiniame kode jutikliui bus SPI sąsajos generuojama pertrauktis, kai priima info iš koordinatoriau. Koordinatoriuje veiks SPI ir UART'o pertrauktis. SPI pertrauktį koordinatoriuje generuos atėję duomenys iš jutiklių, UART'o pertrauktį generuos PC, kai koordinatoriui bus perduodamos valdymo komandos. Šiuo metu noriu atidirbti valdymo komandu perdavimo būdą, todėl ir knisuosi su tuo kanalų valdymo žodžiu. |
|
|
|
|
|
 |
 |
Plonybės su PIC'ais |
Parašytas: 2012 05 20, 00:39 |
|
|
|
|
tai kad naudoji zigbee ir SPI - teisingas poziuris, nes daug ka atlieka jau pati aparatura, tad protokoline dali gali mazinti iki minimumo.
siaip pamasciau, o kam tau isvis per ta arr[8] kazka daryt ?
gauni byte(channels) arba ERROR
zigbee programinini kad interrupta duotu tik kai atlikta operacija (priimtas paketas, issiustas paketas, klaida)
pertrauktyje pasitikrini kas per ivykis ir gauni iskarto visa paketa arba atsizymi statusa
toliau:
| Kodas: |
unsigned char channels=0, n=0,i,t;
unsigned char/*arba int*/ rez[8];//cia pagal kanalu poreiki ir reikiama tiksluma
if (t=channels) {
for (i=0; (t); t>>1,i++)
if (t&1) rez[n++]=getADC(i);
}
if (n) {
spi_SendPacket((char *)&rez, n*sizeof(rez[0])); //su galimais protokolo apreminimais
n=0;
}
|
kazko labiau padeti daba neitin galiu, nes pats turiu skubiu projektu
nebent pakonsultuotum ant smugio NETBEANS+ANDROID |
|
|
|
|
|
|
 |
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 |
 |
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 |
 |
Must have farming mods
Farming simulator modhub,
Best farming simulator mods |
|

|
 |