INHOUDSOPGAWE:

AVR -samestellingstudie 6: 3 -stappe
AVR -samestellingstudie 6: 3 -stappe

Video: AVR -samestellingstudie 6: 3 -stappe

Video: AVR -samestellingstudie 6: 3 -stappe
Video: Автоматический регулятор напряжения генератора 5-6 кВт (380В 3 ф) 2024, November
Anonim
AVR -samestelling -tutoriaal 6
AVR -samestelling -tutoriaal 6

Welkom by Tutoriaal 6!

Die tutoriaal van vandag is kort, waar ons 'n eenvoudige metode sal ontwikkel om data tussen een atmega328p en 'n ander te kommunikeer deur middel van twee poorte wat dit verbind. Ons neem dan die dobbelsteenrol van tutoriaal 4 en die registeranaliseerder van tutoriaal 5, koppel dit aan mekaar en gebruik ons metode om die resultaat van dobbelstene van die rol na die ontleder te kommunikeer. Ons sal dan die rol in binêre druk met behulp van die LED's wat ons vir die ontleder in Tutoriaal 5 gemaak het. Sodra ons klaar is, kan ons die volgende deel van ons algehele projek in die volgende tutoriaal bou.

In hierdie tutoriaal benodig u:

  1. Jou prototipe bord
  2. Jou dobbelsteenrol van tutoriaal 4
  3. U registeranaliseerder uit tutoriaal 5
  4. Twee verbindingsdrade
  5. 'N Afskrif van die volledige datablad (hersiening van 2014):

    www.atmel.com/images/Atmel-8271-8-bit-AVR-M…

  6. 'N Afskrif van die handleiding vir instruksies (2014 hersiening):

    www.atmel.com/images/atmel-0856-avr-instruc…

Hier is 'n skakel na die volledige versameling van my tutoriale vir AVR-samestellers:

Stap 1: Hoe kan ons twee mikrobeheerders laat praat?

Hoe kan ons twee mikrobeheerders laat praat?
Hoe kan ons twee mikrobeheerders laat praat?

Aangesien ons ons projek begin uitbrei sodat ons eindproduk uit 'n versameling kleiner dele bestaan, benodig ons meer penne as wat 'n enkele Atmega328P kan bied. Daarom gaan ons elke deel van die algehele projek op 'n aparte mikrobeheerder doen en dan die data tussen hulle laat deel. Die probleem wat ons moet oplos, is hoe kan ons 'n eenvoudige metode opstel om die beheerders met mekaar te praat en data tussen hulle oor te dra? Een ding met hierdie beheerders is dat hulle elkeen 16 miljoen instruksies per sekonde uitvoer. Dit is baie presies vasgestel, en ons kan hierdie tydsberekening gebruik om data oor te dra. As ons vertragings in millisekondes gebruik om die data op te stel, hoef ons nie regtig so presies te wees nie, aangesien die SVE 16 000 instruksies in 'n enkele millisekonde uitvoer. Met ander woorde, 'n millisekonde is 'n ewigheid vir die SVE. Laat ons dit dus probeer met die dobbelsteentjies. Ek wil die resultaat van 'n dobbelsteenrol van die dobbelsteenrolskyfie na die ontlederskyfie oordra. Gestel jy het oorkant die straat gestaan en ek wou vir jou die resultaat gee van my dobbelsteen. Een ding wat ek kon doen, as ons albei 'n horlosie gehad het, is dat ek 'n flitslig kan aanskakel; as u gereed is om my data te ontvang, skakel u u flitslig aan en begin ons albei ons horlosies. Dan hou ek my flitslig aan vir die presiese aantal millisekondes terwyl die dobbelsteen rol en maak dit toe. As ek dus 'n 12 rol, sal ek my lig vir 12 millisekondes aanhou. Nou is die probleem met die bogenoemde dat daar vir u en my geen manier is om dinge akkuraat genoeg te stel om tussen 5 millisekondes en 12 te onderskei nie millisekondes. Maar wat hiervan: Gestel ons besluit dat ek vir elke jaar op elke dobbelsteen my lig sal aanhou? As ek dan 'n 12 rol, sal ek vir 12 jaar die lig op jou skyn en ek dink jy sal saamstem dat daar geen moontlikheid is dat jy 'n fout sal maak om die nommer reg uit te vind nie? U kan 'n blaaskans neem en bofbal speel, u kan selfs vir 6 maande in Vegas gaan speel, solank u op die een of ander tydstip gedurende die jaar 'n blik oor die straat kyk om te sien of die lig nie brand nie. Dit is presies wat ons vir die mikrobeheerders doen! 'N Enkele millisekonde vir die SVE is ongeveer 'n jaar. As ek dus die sein vir 12 millisekondes aanskakel, is daar byna geen kans dat die ander mikrobeheerder dit vir 10 of 11 sal verwar nie, ongeag wat onderbreek en wat nie intussen gebeur nie. Vir die mikrobeheerders is 'n millisekonde 'n ewigheid, so hier is wat ons sal doen. Eerstens kies ons twee poorte op die beheerder as ons kommunikasiepoort. Ek sal PD6 gebruik om data te ontvang (ons kan dit Rx noem as ons wil) en ek sal PD7 kies vir die oordrag van data (ons kan dit Tx noem as ons wil). Die ontlederskyfie sal gereeld die Rx -pen daarvan kontroleer, en as dit 'n sein sien, val dit na 'n 'kommunikasie -subroutine' en stuur dan 'n terugkeersein na die dobbelsteenrol en sê dat dit gereed is om te ontvang. Hulle sal albei begin met die tydsberekening en die dobbelsteenrol sal 'n sein (dws 5V) vir 'n millisekonde per nommer op die dobbelsteen oordra. As die rol dus twee sesse was, of 'n 12, sou die dobbelsteenrol sy PD7 vir 12 millisekondes op 5V stel en dit dan weer op 0V stel. Die ontleder sal sy PD6 -pen elke millisekonde kontroleer, telkens tel, en as dit teruggaan na 0V, voer dit die gevolglike nommer uit na die ontlederskerm, wat 'n twaalf in binêre op die LED's toon, so dit is die plan. Kom ons kyk of ons dit kan implementeer.

Stap 2: Kommunikasiesubroetines

Die eerste ding wat ons moet doen, is om die twee beheerders aan te sluit. Neem dus 'n draad van PD6 op die een en koppel dit aan PD7 aan die ander kant, en omgekeerd. Inisialiseer dit dan deur PD7 op OUTPUT op beide te stel en PD6 op INPUT op beide. Stel almal uiteindelik op 0V. Voeg spesifiek die volgende by die Init of Reset -afdeling van die kode op elke mikrobeheerder:

sbi DDRD, 7; PD7 ingestel op uitvoer

cbi PortD, 7; PD7 aanvanklik 0V cbi DDRD, 6; PD6 ingestel op invoer cbi PortD, 6; PD6 aanvanklik 0V clr totaal; totaal op dobbelstene aanvanklik 0

Kom ons stel nou die kommunikasie-subroutine op die dobbelsteen-rolskyf op. Definieer eers 'n nuwe veranderlike bo -aan, genaamd 'totaal', wat die totale getal wat op die dobbelsteen gegooi word, stoor en dit op nul begin.

Skryf dan 'n subroutine om met die ontleder te kommunikeer:

kommunikeer:

cbi PortD, 7 sbi PortD, 7; Stuur gereed sein wag: sbic PinD, 6; lees PinD en slaan oor as 0V rjmp wagvertraging 8; vertraging om te sinchroniseer (vind dit eksperimenteel) stuur: dec totale vertraging 2; vertraging vir elke sterfgetal cpi totaal, 0; 0 hier beteken "totale" getal vertragings is gestuur breq PC+2 rjmp stuur cbi PortD, 7; PD7 tot 0V clr totaal; stel die dobbelsteen totaal terug na 0 ret

In die ontleder voeg ons 'n oproep van die hoofroetine by die kommunikeerroetine:

clr ontleder; berei u voor op 'n nuwe nommer

sbic PinD, 6; kyk na PD6 vir 'n 5V -sein om te skakel; as 5V mov analiseerder gaan kommunikeer, totaal; uitvoer na ontleder vertoon rcall ontleder

en skryf dan die kommunikeer -subroetine soos volg:

kommunikeer:

clr totaal; stel totaal terug op 0 vertraging 10; vertraging om van bons ontslae te raak sbi PortD, 7; stel PB7 op 5V om klaar ontvangs aan te dui: vertraging 2; wag vir die volgende getal in totaal; verhoog totale sbiese PinD, 6; as PD6 teruggaan na 0V, is ons klaar met die ontvangs; maak 'n ander terugloop vir meer data cbi PortD, 7; Stel PD7 terug as dit klaar is

Daar gaan jy! Nou is elke mikrobeheerder ingestel om die resultaat van die dobbelsteenrol te kommunikeer en dit dan op die ontleder te vertoon.

Ons sal later 'n baie meer doeltreffende manier van kommunikasie implementeer as ons die inhoud van 'n register tussen beheerders moet oordra in plaas van net 'n dobbelsteen. In daardie geval sal ons nog steeds slegs twee drade gebruik wat hulle verbind, maar ons sal 1, 1 gebruik om "begin transmissie" te beteken; 0, 1 beteken "1"; 1, 0 beteken "0"; en uiteindelik 0, 0 om "eind -oordrag" te beteken.

Oefening 1: Kyk of u die beter metode kan implementeer en gebruik die dobbelsteen as 'n 8-bis binêre getal.

Ek sal 'n video aanheg wat myne in werking wys.

Stap 3: Gevolgtrekking

Afsluiting
Afsluiting

Ek het die volledige kode vir u verwysing aangeheg. Dit is nie so skoon en netjies soos ek sou wou nie, maar ek sal dit opruim soos ons dit in toekomstige tutoriale uitbrei.

Van nou af sal ek net die lêers met die kode heg, eerder as om dit alles hier in te tik. Ons sal net die gedeeltes wat ons wil bespreek, tik.

Dit was 'n kort handleiding, waar ons 'n eenvoudige metode gekry het om vir ons ontleder se mikrokontroleerder te vertel wat die resultaat is van ons dobbelsteen-rol mikro-beheerder terwyl ons slegs twee poorte gebruik.

Oefening 2: In plaas daarvan om 'n gereed -sein te gebruik om aan te toon wanneer die dobbelsteenrol gereed is om te stuur en 'n ander wanneer die ontleder gereed is om te ontvang, gebruik 'n 'eksterne onderbreking', '' Pin Change Interrupt 'genoem. Die penne op die atmega328p kan op hierdie manier gebruik word, en daarom het hulle PCINT0 deur PCINT23 langs hulle in die pinout -diagram. U kan dit as 'n onderbreking op 'n soortgelyke manier implementeer as wat ons met die timer -oorlooponderbreking gedoen het. In hierdie geval is die onderbrekende "hanteerder" die subprogram wat met die dobbelsteenrol kommunikeer. Op hierdie manier hoef u nie eintlik die kommunikasie -subroutine te bel nie: dit sal altyd daarheen gaan as daar 'n onderbreking kom as gevolg van 'n toestandverandering op die pen.

Oefening 3: 'n Baie beter manier om data tussen een mikrobeheerder na 'n versameling ander te kommunikeer en oor te dra, is deur die ingeboude 2-draads seriële koppelvlak op die mikrobeheerder self te gebruik. Lees artikel 22 van die datablad en kyk of u kan uitvind hoe u dit kan implementeer.

Ons sal in die toekoms hierdie meer gesofistikeerde tegnieke gebruik as ons verdere beheerders byvoeg.

Die feit dat alles wat ons met ons ontleder gedoen het, is om die totaal van die dobbelsteenrol te neem en dit dan in binêre uit te druk met behulp van LED's, is nie belangrik nie. Die feit is dat ons ontleder nou 'weet' wat die dobbelsteen is en dit dienooreenkomstig kan gebruik.

In die volgende tutoriaal verander ons die doel van ons "ontleder", stel 'n paar meer kringelemente bekend en gebruik die dobbelsteen op 'n meer interessante manier.

Tot volgende keer…