|
|
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 01 03, 05:46. Visos datos yra GMT + 2 valandos.
|
|
|
|
Forumas » Mikrovaldikliai » Vienas laidas "1-Wire"
|
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 |
|
|
Ar aktuali tema? |
Ar aktuali tema? |
Taip |
|
59% |
[ 13 ] |
Ne |
|
27% |
[ 6 ] |
Elemento ID |
|
0% |
[ 0 ] |
Programa |
|
0% |
[ 0 ] |
Nedomina |
|
13% |
[ 3 ] |
|
Iš viso balsų : 22 |
|
|
|
Vienas laidas "1-Wire" |
Parašytas: 2016 12 13, 22:45 |
|
|
|
Nagrinėsim vieno laido elementus, ir kaip su jais kalbėtis...
Kviečiu dalyvauti... |
|
|
|
|
|
|
Vienas laidas "1-Wire" |
Parašytas: 2016 12 14, 20:33 |
|
|
|
Na matau, kad yra žmonių kuriuos tai domina paaiškinsiu kiek galėsiu.
Mano žinios remiasi kelių metų darytu projektu, gal ne viską pamiršau...
Teko dirbti su termometrais, potenciometrais ir diskretiniais outputais.
Aiškinimui už pagridą imsiu DS18B20 nors teko ir kitokių naudoti...
Projetas darytas Atmega16 po to sėkmingai perkeltas į Armus STM32F101 ir STM32F303.
Su termometrais dar ir dabar daug kas daro bizniuką
Atspirties taškas DS18B20 jo aprašymas: http://neutrino.phys.ksu.edu/~gahs/doublechooz/DC_SlowMRS/DS/DS18B20.pdf
Imsiu variantą kai jie sujungti lygiagrečiai ir visi kalbėsis per vieną atmegos koją, nes kur vienas daviklis prijungtas prie kojos pvz. pilnas internetas.
Daviklis turi tris kojas: Gnd, +5V arba +3...+5V, signalinį. Maitinimo galima nejungti, bet jei atstumai nemaži ir jų nemažai tai jis nepakenks.
Visus elektrinius parametrus rasite nurodytame pdf.
Dirbant lygiagrečiai reikia žinoti 64 bitų ID iš kurių 8 vyriausi bitai CRC.
ID kiekvienam įrenginiui skirtingas unikalus, bent taip teigia.
Šie 64 bitai suskirsto programuotojus....
Tai pirma problema iš kur gaut ID, galima atspėti , gal draugas pasakys, galima ir nusiskaityti. Du budai: skaityti prijungiant po 1 ir skaityti visą krūvą pajungtų, ir po to ieškoti kurio tai daviklio ID. Su termometrais tai paprasta skaitant temperatūrą šildai termometrą.
Galima jau pereiti ir prie konkretumų... |
|
|
|
|
|
|
Vienas laidas "1-Wire" |
Parašytas: 2016 12 14, 20:55 |
|
|
|
Atmegos16 atveju naudosiu PC7 koją, bet ji turi būti atviro kolektoriaus arba atviros santakos jungime dar vadinama OD, na ir aišku 4.7k rezistorius tarp šios kojos ir +5v. Push pull šiuo atveju netinka.
OD režimas daromas Atmegos atveju siakančiai.
Kodas: |
#define send_0 DDRC |=0b10000000;
#define send_1 DDRC &=0b01111111;
#define nulis PORTC &=0b01111111;
|
PORTC naudosim vieną kartą ir jos neliesim, o siusim 1 arba 0 naudodami krypties registrus DDRC tokiu būdu Atmega nepereis į Push Pull.
Kadangi koją sukonfiguravom, galima rašytis funkcijas... |
|
|
|
|
|
|
Vienas laidas "1-Wire" |
Parašytas: 2016 12 14, 21:52 |
|
|
|
Dabar reikės kelių žemiausio lygio funkcijų. Kadangi per vieną koją reikės rašyti, skaityti.
Resetas: remiantis INITIALIZATION TIMING Figure 13 .
http://neutrino.phys.ksu.edu/~gahs/doublechooz/DC_SlowMRS/DS/DS18B20.pdf
Reikės per koją išvesti 0 ir išlaikyti 480 us, po to koją paleisti išlaukti 15...60us tada tik pradės 1-wire įrenginys pradės savo prisistatymo impulsą tai 0 trukmės 60... 240us. Iškart matosi laikai užduoti diapazonais, nes tai priklauso nuo daviklių sujungimo laidų atstumo gal ir pačių daviklių. Gali pasidaryti automatinį paderinimą. Resetas nutraukia daviklio komandą, bet ne būseną, jei matuoti ir konvertuotis tai jis toliau darys, bet jei nepabaigėt nusiųsti komandos tai ją nutrauks.
Mes galim sužinoti ar įrenginys pajungtas ir ar netrumpina, tik tam tikrais tarpais pasitikrinti kas ant kojos.
Kodas: |
unsigned char ResetImpulsas ()
{
unsigned char pozymis, b;
send_0;
delejus (250);
delejus (250);
send_1;
delejus (60);
b = (PINC & 0b10000000)>>7;
if (b == 0){
pozymis = 1;}else {pozymis = 0;}
delejus (250);
delejus (250);
b = (PINC & 0b10000000)>>7;
if (b != 0){pozymis = 1;}else {pozymis = 0;}
return pozymis;
}
|
Čia vienas iš variantų;
Kadangi naudojau Atmega16 be kvarco su vidiniu RC ir kalibraciniu registru. Dar matau reikia dviejų funkcijų.
Kodas: |
ISR (TIMER0_OVF_vect)
{
delejaus_flagas = 0x00;
}
|
Tai pertraukimai:
Ir funkcija..
Kodas: |
void delejus (unsigned char a){
TCCR0 = 0x02;
TIFR &= 0xFF;
TIMSK |= 0b00000001;
TCNT0 = 0xFF - a;
delejaus_flagas = 0x01;
while (delejaus_flagas){
}
}
|
|
|
|
|
|
|
|
Vienas laidas "1-Wire" |
Parašytas: 2016 12 14, 22:33 |
|
|
|
Sekantis žingsnis:
Turim išmokti siusti 1 ir 0, remiantis to paties pdf informacija READ/WRITE TIME SLOT TIMING DIAGRAM Figure 14.
Kad siųsti 0 reikia linijoje išlaikyti 0 tarp 60...120 us, o kad siusti 1 reikia išlaikyti 0 truputi daugiau už 1 us ir koją paleisti.
Reziume: 0 koja 0 išlaikymas daugiau 60 us ir paleidžiam koją, 1 koja 0 išlaikom truputi daugiau 1 us ir paleidžiam koją.
Kodas: |
void sendBit (char bit)
{
send_0;
delejus (0);
if (bit != 0)
{send_1;
delejus (55);
}else {delejus (65);
send_1;}
delejus (8);
}
|
|
|
|
|
|
|
|
Vienas laidas "1-Wire" |
Parašytas: 2016 12 14, 22:53 |
|
|
|
Sekantis žingsnis nuskaityti bitą. Skaitant 1 arba 0 reikia į koja išvesti 0 ir paleisti. Remiantis pdf READ/WRITE TIME SLOT TIMING DIAGRAM Figure 14
Paveikslu skaitant 0 turim 15 us garantuotų ir 45 us neapibrežtų, tai kad nedaryti mandros funkcijos reikia tiksliai parinkti laikus kada skaityti kojos būseną, gali abiem atvejais gauti 1.
Kodas: |
unsigned char readBit (void)
{
unsigned char reiksme, b;
send_0;
asm volatile ("nop\n"
"nop\n"
"nop\n"
"nop\n"
"nop\n"
"nop\n"
"nop\n"
"nop\n"
"nop\n"
"nop\n"
"nop\n"
::);
send_1;
delejus (4);
b = (PINC & 0b10000000)>>7;
if (b != 0){reiksme = 1;}else {reiksme = 0;}
delejus (45);
return reiksme;
}
|
Teko net nopus panaudoti, kad surasti aukso vidurį.... |
|
|
|
|
|
|
Vienas laidas "1-Wire" |
Parašytas: 2016 12 14, 23:56 |
|
|
|
Šiais funkcijas reikia apjungti, kad rašytų ir skaitytų baitą, nes jis mums tik aktualus. Na jei ką sudomins idėsiu...
Čia buvo lengvoji dalis:
SEARCH ROM [F0h] arba musų atveju ID nuskaitymas, aprašymas buvo tame pdf linkas jis ir dabar yra prie komandos, tik kaip supratau Dallas nupirko Maxim nukreipia į maxim puslapį ir ten reikia ieškoti.
Na truputi yra algoritme.
Paleidus komandą F0 visi įrenginiai ją vykdys. Turim atlikti du skaitymus vienu skaitymu gausim tikrą bito reikšmę kitu invertuotą, jei bito reikšmė 0 tai pirmu skaitymu nuskaitysi gausi 0 antru 1. Nuskaitant antrą bitą reikia siusti tikrąją prieš tai buvusio bito reikšmę. Jei įrengimas vienas tai du skaitymai vienas įrašymas ir kartoti iki pabaigos, visą 64 bitų ID turi. Jei įrašysi netą reikšmę daviklis išeis iš komandos ir nuskaitymas nutrūks.
Turint du daviklius, ir jų ID skiriasi kokiam 5 bite, o iki tol sutampa. Paleidus komandą F0 visi davikliai pradeda atsakinėti į skaitymus ir elgiasi tai pat. Tik skaitant 5 bitą pirmu skaitymu atsakys vienas atsakys 1 kitas 0, bet pas mus atviras kolektorius gausim 0, antru abu invertuotais atsakys. Vienas 0 kitas 1 i vėl gausime 0. Gaunasi konfliktas arba sankryža, turim pasirinkti, kuriuo keliu eisim jei vesim 0 tai tas daviklis kuria reikėjo 1 atsijungs ir daugiau netrukdys. Gaunasi turi tik vieno daviklio ID, o reikia abiejų. Tai turim praeiti dar kartą ir konflikto vietoje pakeisti kelią priešingu nei prieš tai eitu, tai tada atsijungs pirmas daviklis ir netrukdys. Turėsime ir antro daviklio ID.
Algoritmo sudėtingumą sudaro, kad reikia praeiti visus kelius, nei vieno daviklio nepraleisti, neiti tuo pačiu keliu antrą kartą, tai reiškia turi asiminti konflikto vietą ir kuriuo keliu praėjai.
Du davikliai vienas konfliktas, penki davikliai keturi konfliktai....
Gal klausimų yra.... |
|
|
|
|
|
|
Vienas laidas "1-Wire" |
Parašytas: 2016 12 15, 11:11 |
|
|
|
Geriau parasyk tokias 1-Wire tvarkykles, kurios ir 1-Wire standartus tenkintu, bet ir kitu komunikaciju netrikdytu. |
|
|
|
|
|
Vienas laidas "1-Wire" |
Parašytas: 2016 12 15, 13:35 |
|
|
|
Gal gali kas nors išversti iš senovės baltų į šiuolaikinę lietuvių kalbą? |
|
|
|
|
|
Vienas laidas "1-Wire" |
Parašytas: 2016 12 15, 20:43 |
|
|
|
andriusa rašo: |
Gal gali kas nors išversti iš senovės baltų į šiuolaikinę lietuvių kalbą? |
simple:
I2C 400kHz vyksta iki 50000 rasymo/skaitymo operaciju per sekunde...
SPI ir Serial komunikacijos imanomos dar didesniais greiciais...
todel jei 1-Wire tvarkykle kreiva, tai neradusi daviklio ar ivykus kokiai nors klaidai buse, per ilgai uzlokina uCU, todel prarandami kitu komunikaciju simboliai ir sistema tampa jautri trikdziams.
Defaultines 1-Wire bibliotekos tokios ir yra, o aparatinis I2C, SPI ir USART buferizavimas bei DMA pigiuose uCU nenumatytas arba max 2 simboliai. |
|
|
|
|
|
|
Vienas laidas "1-Wire" |
Parašytas: 2016 12 15, 22:20 |
|
|
|
AlgisL rašo: |
andriusa rašo: |
Gal gali kas nors išversti iš senovės baltų į šiuolaikinę lietuvių kalbą? |
simple:
I2C 400kHz vyksta iki 50000 rasymo/skaitymo operaciju per sekunde...
SPI ir Serial komunikacijos imanomos dar didesniais greiciais...
todel jei 1-Wire tvarkykle kreiva, tai neradusi daviklio ar ivykus kokiai nors klaidai buse, per ilgai uzlokina uCU, todel prarandami kitu komunikaciju simboliai ir sistema tampa jautri trikdziams.
Defaultines 1-Wire bibliotekos tokios ir yra, o aparatinis I2C, SPI ir USART buferizavimas bei DMA pigiuose uCU nenumatytas arba max 2 simboliai. |
Ne tai, man pono krieno aprašymas neįkandamas |
|
|
|
|
|
|
Vienas laidas "1-Wire" |
Parašytas: 2016 12 15, 22:45 |
|
|
|
krienas rašo: |
Kuri dalis.... |
Visos. Sakyčiau kas smegenų turi tai datašytą ir aplication notes skaitydamas geriau supras visą veikimą, o kokiam pradedančiajam visas tavo parašytas jovalas bus nesuprantamas, jau geriau kokį tutorialą žinoma užsienio kalba susirasti ir perskaityti - tikrai bus informatyviau ir lengviau suprantama.
Panašu kad rašai tik dėl to kad rašyti, o ne dėl to kad suteikti kažkam realios pagalbos. |
|
|
|
|
|
|
Vienas laidas "1-Wire" |
Parašytas: 2016 12 15, 23:04 |
|
|
|
Kadangi truputi apšilot.
Pasidalinsiu savo brangenybe, paieškos funkcija. Ji rasta internete, bet mokėjo surasti tik vieną daviklį nors parašyta ieškoti daug. Teko pavargti apie dvi savaites, kol ji pradėjo veikti, tad nenustebkit rade daug anglišku žodžiu, net jos pavadinimą originalų palikau...
Kodas: |
int OWSearch()
{ char krypciu_seka [10]= {0,0,0,0,0,0,0,0,0,0};
int id_bit_number;
int last_zero, search_result;
int id_bit, cmp_id_bit;
char i;
char riba = 0;
unsigned char rom_byte_mask, Paieskos_kryptis;
int Daviklio_indeksas;
char EinamasKonfliktas;
char Konfliktu_suma;
unsigned char rom_byte_number;
int Davikliu_skaicius;
Davikliu_skaicius = 0 ;
id_bit_number = 0;
last_zero = 0;
rom_byte_number = 0;
rom_byte_mask = 1;
search_result = 0;
crc8 = 0;
Daviklio_indeksas = 0;
EinamasKonfliktas = 0;
Konfliktu_suma = 0;
Konfliktas = 0; //globalus
LastDeviceFlag = FALSE; //globalus
LastFamilyDiscrepancy = 0;
if (!LastDeviceFlag)
{
do {
ResetImpulsas ();
//Siunciu komanda
send_Baita (0xF0);
// paieškos kilpa
do
{
do
{
id_bit = readBit(); // Du skirtingi turi buti
cmp_id_bit = readBit();
if (id_bit != cmp_id_bit)
{Paieskos_kryptis = id_bit;}
else
{
EinamasKonfliktas++ ;
if ( krypciu_seka[ EinamasKonfliktas] == 0 )
{Paieskos_kryptis = 0;}
else
{ Paieskos_kryptis = 1;
}
}
if (Paieskos_kryptis == 1)
{ROM_NO [Daviklio_indeksas] [rom_byte_number] |= rom_byte_mask;}
else
{ROM_NO [Daviklio_indeksas] [rom_byte_number] &= ~rom_byte_mask;}
sendBit(Paieskos_kryptis);
id_bit_number++;
rom_byte_mask <<= 1;
}
while(id_bit_number < 8);
rom_byte_number++;
id_bit_number = 0;
rom_byte_mask =0x01;
}
while (rom_byte_number < 8);
//Davikliu_skaicius++;
//---------------------------------------------
Daviklio_indeksas++;
rom_byte_number = 0;
id_bit_number = 0;
rom_byte_mask =0x01;
//===================================
if (krypciu_seka[EinamasKonfliktas] == 0){
krypciu_seka[EinamasKonfliktas] = 1;
}
if (EinamasKonfliktas > Konfliktu_suma){
Konfliktu_suma = EinamasKonfliktas;
}
if (riba == 0){
if (Daviklio_indeksas >= Konfliktu_suma){
for (i=Konfliktu_suma; i >1; i--){
if (krypciu_seka [i] == 0){
riba = 1;
krypciu_seka [i] = 1;
}else {krypciu_seka [i] = 0;}
}
}
}
EinamasKonfliktas = 0;
//===================================
}
while (Daviklio_indeksas < 10);
}
search_result = Davikliu_skaicius ;
return Daviklio_indeksas;
}
|
Kaip matau ją suprast, neužteks dviejų savaičių.
Funkcija veikianti ieško 10 daviklių nesunku pakeisti, kad ir šimtą ieškotų.
Prižiūrėkit, lepinkit ją, nepamirškit, tobulinkit, neleiskite dulkėti... |
|
|
|
|
|
|
|
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 |
|
LEGO
Mänguköök,
mudelautod,
nukuvanker |
|
Thermal monocular
Thermal vision camera,
Night vision ar scope,
Night vision spotting scope |
|
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 |
|
GTA 6 Weapons
GTA 6 Characters,
GTA 6 Map,
GTA 6 Vehicles |
|
FS25 Mods
Farming Simulator 25 Mods,
FS25 Maps |
|
ATS Trailers
American Truck Simulator Mods,
ATS Trucks,
ATS Maps |
|
|
|