Elektronika.lt
 2021 m. spalio 18 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
 NaujienosSąrašas
 StraipsniaiSąrašas
 Vaizdo siužetaiSąrašas
 Nuolaidos, akcijosSąrašas
 Produktų apžvalgosSąrašas
 Naudingi patarimaiSąrašas
 Vykdomi projektaiSąrašas
 Schemų archyvasSąrašas
 - Garso technika
 - Automobilių elektronika
 - Buitinė elektronika
 - Kompiuterių elektronika
 - Maitinimo šaltiniai
 - Mikrovaldikliai
 - Radiotechnika
 - Šviesos efektai
 - Įvairi elektronika
 Teorija, žinynaiSąrašas
 Nuorodų katalogai
 Įvairūs siuntiniai
 Bendravimas
 Skelbimai ir pasiūlymai
 Elektronikos remontas
 Robotų kūrėjų klubas
 RTN žurnalo archyvas






 Verta paskaityti
Spalio 18 d. 11:23
Technologijos atokiose vietose: kam reikalingi maistomatai kalnuose ar nuošaliame archipelage?
Spalio 18 d. 08:22
Skaitmeniniai statinių dvyniai: kaip NASA sukurta technologija padės tvariai vystyti miestus?
Spalio 17 d. 19:29
Nekokybišką prekę po remonto dar labiau sugadino: kas priklauso pirkėjui?
Spalio 17 d. 13:17
Kibernetinio saugumo specialistas: daugelis valstybinių institucijų sėdi tarsi ant tiksinčios bombos
Spalio 17 d. 09:51
„Sony“pristatė du naujus ausinių modelius „WF-C500“ ir „WH-XB910N“
Spalio 16 d. 13:18
Sveikatos revoliucija: gydyti lėtines ligas padeda ir mobiliosios programėlės
Spalio 16 d. 09:10
Grandininių pjūklų paslaptys: profesionalai atskleidė, kaip nesuklysti tiek renkantis, tiek prižiūrint
Spalio 15 d. 20:20
Praskaidrinti niūrią rudens dieną padės technologija, apie kurią pagalvoja ne visi
Spalio 15 d. 18:34
Programėlės, padėsiančios užtikrinti išmaniųjų telefonų saugumą
Spalio 15 d. 15:27
Pravers kiekvienam: kaip išsirinkti interneto naršyklę?
FS19 Mods
FS19 Courseplay, FS19 Maps, FS19 Seasons
GTA 5 Mods
GTA 5 Cheats, GTA 5 vehicle mods, GTA 5 Map mods
FS 19 Tractors
Farming Simulator 19 Mods, FS 19 Maps, FS22 Mods
ETS2 Mods
ETS2 Trucks, ETS2 Bus, Euro Truck Simulator 2 Mods
FS22 Tractors
Farming Simulator 22 Mods, FS22 Maps, FS22 Trucks
VAT calculator
VAT number check, What is VAT, How much is VAT
LS19 Mods
Fs19 modhub, fs19 maps, FS19 Seasons
FS19 Mapy
Farming Simulator 19 mody, FS19 Tractor, FS19 Truck
MSFS2020 Liveries
Flight Simulator 2020 Mods, MSFS2020 Scener, MSFS2020 Airports
Sims 4 Mods
Sims 4 cheats, Sims 4 money cheat, Sims 4 careers
Lastenvaunut
Turvaistuin, Matkarattaat, Lasten vaatteet
Paskola internetu
Vartojimo paskola, paskola automobiliui, paskola būsto remontui
FS22 Map mods
Farming simulator 22 mods, FS22 Harvesters, FS22 Seasons
FS22 Mods
FS22 Harvesters, FS22 Tractors Mods, FS22 Maps Mods
Reklama
 Schemų archyvas » Mikrovaldikliai Dalintis | Spausdinti

Nuoseklus duomenų perdavimas tarp dviejų AVR plokščių

Publikuota: 2006-12-08 15:43
Tematika: Mikrovaldikliai
Tipas: Paprasta
Autorius: el. paštas Darius Grigaitis, Mantas Čepinskas, Andrius Gurevičius
Aut. teisės: el. paštas ©Elektronika.lt

Aprašyme pateiktas nuoseklaus duomenų perdavimo tarp dviejų AVR bandymų plokščių pavyzdys. Bandymų plokštės konstrukciją bei principinę schemą galite rasti mūsų puslapyje.

 Rodyti komentarus (4)
Įvertinimas:  1 2 3 4 5 

Aprašyme pateiktas nuoseklaus duomenų perdavimo tarp dviejų AVR bandymų plokščių pavyzdys. Bandymų plokštės konstrukciją bei principinę schemą galite rasti mūsų puslapyje.

Pagal šį pavyzdį galima išmokti valdyti įvairius įrenginius, prijungtus prie AVR mikrovaldiklių ir kuriems reikia nuoseklaus duomenų perdavimo.

Duomenys tarp dviejų AVR perduodami dviem laidais, kuriuos sudaro vienas įžeminimo laidas (minuso gnybtas) ir signalo perdavimo laidas. Duomenų perdavimui galima naudoti bet kuriuos mikrovaldiklio prievadų gnybtus. Šiuo atveju siųstuve pasirinkome PORTD 1, o imtuve PORTA 1 išvadus.


1 pav. Siunčiamo signalo laiko išdėstymo pavyzdys

Kadangi duomenys perduodami asinchroniniu būdu (be sinchronizavimo signalo), apsibrėžiama loginio 1 ir 0 trukmė T, kuri yra fiksuota ir žinoma tiek imtuve, tiek siųstuve (1 pav.). Šiame paveiksle pateikta signalo loginių lygių ir trukmės diagrama (laiko diagrama). Ramybės būsenoje, kai įjungtas AVR plokščių maitinimas, PORTD 1 reikšmė lygi 0. Tai ramybės būsena, kai ryšio laidu niekas nesiunčiama. Pradėjus siuntimą, suformuojamas loginis vienetas, kuris reiškia duomenų siuntimo pradžią. Tada imtuvo režime dirbantis AVR mikrovaldiklis pradeda įrašinėti gaunamus duomenis.

Priėmus iš karto žinomą duomenų paketą (mūsų atveju duomenų paketas yra 8 bitų ilgio) ir žinant loginių vienetų bei nulių trukmę, galima atkurti, kokie duomenys buvo siųsti.

Programų pavyzdžiai suformuoti su iš karto įrašytomis siunčiamų duomenų reikšmėmis. Siuntimas vykdomas paspaudus perdavimo mygtukus (nurodyti Portą prie kurio prijungti mygtukai ir kurie iš jų skirti valdymui). Šviesos diodai panaudoti siunčiamų bei priimamų duomenų atvaizdavimui, pagal jų įsijungimą galima spręsti apie duomenų perdavimo teisingumą.

Duomenų siuntimo kodas, parašytas C kalba, pateikiamas su komentarais prie kiekvienos eilutės, kad būtų aiškiau.

Duomenų išsiuntimo algoritmas detaliai pateiktas programos kodo komentaruose.


//*** Asinchroninis duomenų išsiuntimas vienu laidu***

#include <iom16.h>                  
// prisijungiame pagrindinę „atmega16“
// procesoriaus In/Out biblioteką
#include <intrinsics.h>            
//prisijungiame  papildomą biblioteką, leidžiančią realizuoti 
//užlaikymo funkciją __delay_cycles()

int i;                              
//apsibrėžiame globalų kintamąjį
void main( )                        
//prasideda pagrindinė programa
{
    DDRD=255;                       
//nustatome prievadus D kaip išėjimus. 
//Iš jų vienas prievadas bus naudojamas
//duomenims išsiųsti
    PORTD=0;                        
//nustatome pastariesiems prievadams 
//pradinę reikšmę lygią 0
    DDRA=0;                         
//nustatome prievadus A kaip įėjimus
    PORTA=15;                     
//tam tikriems įėjimo prievadams įjungiame 
//„pull up“ rezistorius, kurie ant prievado palaiko nuolatinę teigiamą įtampą
    DDRC=255;                       
//nustatome prievadus C kaip išėjimus.
// Pastarieji bus naudojami siunčiamiems duomenims atvaizduoti
    PORTC=0;                        
//nustatome pastariesiems prievadams pradinę 
//reikšmę lygią 0
 while(1)                          
 //padarome begalinį ciklą
 {
    if ((PINA&1)==0)                
//tikriname prievado A pirmojo išvado reikšmę.
// Jei reikšmė lygi 0, tuomet vykdoma žemiau pateikta  sąlyga. 
//Ji bus lygi 0 tuomet, kai bus paspaustas pirmasis jungtukas.

    { int kodas[9]={1,0,1,0,1,0,1,1,1};     
//apsibrėžiame lokalų kintamąjį 
//kaip vienmatį masyvą, kuriam priskiriame tam tikras reikšmes

             for(i=0; i<9; i++){            
//vykdome ciklą tol, kol i bus mažiau už 9
                           PORTD=kodas[i];     
 //priskiriame prievadui D masyvo
// „kodas“ i-tojo elemento reikšmę. 
//Kadangi ji gali būti tik 1 arba 0, 
// tai reikšmė bus išvesta į prievado D pirmąjį išvadą.
// Išsiunčiamas duomuo.
    __delay_cycles(500000);                    
 //užlaikymas 500 000 ciklų
    PORTD=0;}                             
//prievado D reikšmes nustatome į pradinę padėtį

    PORTC=87;                            
//į prievadą C išvedame siunčiamo kodo reikšmę. 
// 87 = 1010111 dvejetainėje skaičiavimo sistemoje.

    __delay_cycles(50000000);                  
 //užlaikymas
    PORTC=0;}                                   
//nustatome prievadą C į pradinę padėtį

   else  if ((PINA&2)==0)                       
// jei ne pirmasis variantas, tuomet  
// tikriname antrąjį A prievadą. 				
//Jis bus lygus 0, kai antrasis jungtukas bus paspaustas. jei taip, 	
//vykdoma žemiau pateikta sąlyga
   { int kodas[9]={1,0,0,0,0,0,1,0,1};          
//skiriasi masyvo „kodas“ reikšmės
                      for(i=0; i<9; i++){       
//procesas kartojasi kaip yra  aprašyta aukščiau 

                           PORTD=kodas[i];
     __delay_cycles(500000); PORTD=0;}

    PORTC=5; __delay_cycles(50000000); PORTC=0;}  
 // 5 = 101 dvejetainėje skaičiavimo sistemoje

    else if((PINA&4)==0)                    
// procesą kartojame. 
//Tikriname trečiąjį A prievadą. 4 = 100 dvejetainėje sistemoje.

    { int kodas[9]={1,0,1,0,0,1,0,1,1};
                      for(i=0; i<9; i++){
                            PORTD=kodas[i];
     __delay_cycles(500000); PORTD=0;}

    PORTC=75; __delay_cycles(50000000); PORTC=0;}

    else if((PINA&8)==0)                     
// procesą kartojame. 
//Tikriname ketvirtąjį A prievadą. 8 = 1000 dvejetainėje sistemoje.

    { int kodas[9]={1,1,1,0,0,0,0,0,1};
                      for(i=0; i<9; i++){
                           PORTD=kodas[i];
    __delay_cycles(500000); PORTD=0;}

    PORTC=193; __delay_cycles(50000000); PORTC=0;}
}        //amžino ciklo pabaiga
}        //pagrindinės funkcijos pabaiga
 



Kadangi duomenys siunčiami po vieną bitą, todėl imtuve būtina atlikti duomenų surinkimą ir suformavimą į 8 bitų paketą, nes tokie duomenys buvo išsiųsti.

Priėmimo metu prievado A pirmasis išvadas laukia startinio bito (1 pav.), kuris lygus 1 ir turi iš karto imtuve žinomą trukmę T. Jam pasirodžius, pradedamas masyvo pildymas, prilyginant prievado A išvadą masyvo elementui i. Panaudojus ciklą su 8 kartų pasikartojimu (kadangi 8 bitų duomenų paketas), visi priimami bitai surašomi į masyvą.

Kai masyvas užpildytas, jo elementai paverčiami į dešimtainį skaičių bei prilyginami prievadui B, kad jame matytume priimtus duomenis.

Imtuvo programa palyginus su siuntimo yra paprastesnė, kadangi nereikia formuoti siunčiamo signalo:



#include <iom16.h>
#include <string.h>
#include <intrinsics.h>
int i=0;
void main( )
{
unsigned char a;
unsigned char data[10];
    DDRB=255;  
//Nustatome prievado B visus išvadus kaip išėjimus.
   while(1)
{
   if ((PINA&1)==1)  
//Tikriname, ar prievado A reikšmė lygi vienetui, jei taip, 
//pradedame pildyti masyvą „data“.
{
       for(i=0; i<10; i++){   
//Ciklą kartojame 8 kartus, nes priimame 8 bitų kodą, ir pildome masyvą „data“.
         data[i]=(PINA&1);   
//Kai prievado A pirmojo išvado reikšmė lygi vienetui, 
//į masyvo elementą įrašome 1, o kai reikšmė lygi nuliui,
// į masyvo sekantį elementą įrašome 0.
       __delay_cycles(500000);   }
   a=(data[2])+(2*data[3])+(4*data[4])+(8*data[5])+(16*data[6])+
+(32*data[7])+(64*data[8])+(128*data[9]);    
//Dvejetainius skaičius paverčiame dešimtainiu.
   PORTB=a;      
//Iš prievado A pirmojo išvado gautus duomenis, atvaizduojame prievade B.
   __delay_cycles(50000000); PORTB=0;
}
else PORTB=0;
}
}   


2 pav. Duomenų siuntimo pavyzdys siunčiant „01001011“ duomenų paketą

3 pav. Duomenų siuntimo pavyzdys siunčiant „11000001“ duomenų paketą

Taigi, kaip matyti (2 pav., 3 pav.) pavyzdžiuose, duomenų siuntimas atliekamas sėkmingai, kadangi siųstuve bei imtuve sutampa duomenų paketai. Atlikti bandymai parodė, jog tokiu būdu yra perduodami duomenys palyginti lėtai.

Naudojant tokį programos kodą didesnio greičio gauti nepavyko. Eksperimentai buvo atliekami su įvairaus ilgio kabeliais. Kabelio ilgis klaidų atsiradimui neturėjo įtakos. Didinant duomenų perdavimo spartą išsiųsti ir gauti duomenų paketai nesutapdavo dėl suderinamumo stokos. Bet vis tik šis pavyzdys gerai iliustruoja signalo perdavimą dvilaide linija, kurį patobulinus, galima gauti gerą ir greitą duomenų perdavimą.

Pasinaudojus pateiktais pavyzdžiais, galima išmokti formuoti nuoseklius signalus, ne tik vienam išvadai, bet ir keliems. Toks signalų formavimas gali pasitarnauti bandant pasirašyti nuosavą programą temperatūros daviklių valdymui, arba realizuoti plačiai naudojamą I2C protokolą. Tolimesni žingsniai, supratus ir išmokus realizuoti pavyzdžius, panašius į pateiktą, suteikia galimybę bet kokio tipo įrenginio valdymui.

Failai:

Duomenų išsiuntimui.hex

Duomenų priėmimui.hex




Draudžiama platinti, skelbti, kopijuoti
informaciją su nurodyta autoriaus teisių žyma be redakcijos sutikimo.

www.esaugumas.lt – apsaugok savo kompiuterį!

TMS ELECTRONICS
TMS ELECTRONICS

www.rslietuva.com – nemokamas elektronikos komponentų pristatymas

www.matuok.lt - Interneto spartos matavimo sistema

LOKMITA – įvairi matavimo, testavimo, analizės ir litavimo produkcija

Mokslo festivalis „Erdvėlaivis Žemė

„Deinavos baldai“ — šeimos baldai

ENEBA's game store

Technologijos.lt

LTV.LT - lietuviškų tinklalapių vitrina

Lietuvos mokinių neformaliojo švietimo centras

PriedaiMobiliems.lt – telefonų priedai ir aksesuarai

www.rrt.lt – Lietuvos Respublikos ryšių reguliavimo tarnyba


Reklama
‡ 1999–2021 © Elektronika.lt | Autoriaus teisės | Privatumo politika | Atsakomybės ribojimas | Reklama | Turinys | Kontaktai LTV.LT - lietuviškų tinklalapių vitrina Valid XHTML 1.0!
LTV.LT – geriausių lietuviškų tinklalapių katalogas
www.ltv.lt/technologijos/
Farming Simulator 2019 Mods, FS22 Mods, FS19 Maps
farmingsimulator19mods.fr
Optical filters, UV optics, electro optical crystals
www.eksmaoptics.com
Ilgalaikiai kreditai, paskola už automobilį, kreditų skaičiuoklė
www.mokilizingas.lt
FS19 Mods, FS17 Mods, FS15 Mods
www.farming2015mods.com
FS22 mods, Farming simulator 22 mods,
FS22 maps

fs22.com
Reklama


Reklama