Innehållsförteckning:

AVR -monteringshandledning 6: 3 -steg
AVR -monteringshandledning 6: 3 -steg

Video: AVR -monteringshandledning 6: 3 -steg

Video: AVR -monteringshandledning 6: 3 -steg
Video: Подключение генератора с автозапуском и блоком АВР 2024, Juli
Anonim
AVR -monteringshandledning 6
AVR -monteringshandledning 6

Välkommen till självstudie 6!

Dagens handledning blir kort där vi kommer att utveckla en enkel metod för att kommunicera data mellan en atmega328p och en annan med två portar som ansluter dem. Vi tar sedan tärningsrullen från självstudie 4 och registeranalysatorn från självstudie 5, kopplar ihop dem och använder vår metod för att kommunicera resultatet av tärningsrullar från rullen till analysatorn. Vi kommer sedan att skriva ut rullen i binär med hjälp av de lysdioder som vi konstruerade för analysatorn i självstudie 5. När vi har arbetat så kommer vi att kunna konstruera nästa del av vårt övergripande projekt i nästa handledning.

I denna handledning behöver du:

  1. Din prototypbräda
  2. Din tärningsrulle från självstudie 4
  3. Din registeranalysator från självstudie 5
  4. Två anslutningskablar
  5. En kopia av det fullständiga databladet (översyn 2014):

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

  6. En kopia av bruksanvisningen (2014 års översyn):

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

Här är en länk till den kompletta samlingen av mina AVR-monteringsstudier:

Steg 1: Hur kan vi få två mikrokontroller att prata med varandra?

Hur kan vi få två mikrokontroller att prata med varandra?
Hur kan vi få två mikrokontroller att prata med varandra?

Eftersom vi börjar utöka vårt projekt så att vår enda slutprodukt består av en samling mindre delar kommer vi att behöva fler stift än vad en enda Atmega328P kan tillhandahålla. Därför kommer vi att göra varje del av det övergripande projektet på en separat mikrokontroller och sedan låta dem dela data mellan dem. Så problemet som vi måste lösa är hur kan vi hitta på en enkel metod för kontrollerna att prata med varandra och överföra data mellan dem? En sak med dessa kontroller är att de var och en utför 16 miljoner instruktioner per sekund. Detta är mycket exakt tidsinställt och så kan vi använda denna tidpunkt för att överföra data. Om vi använder millisekundfördröjningar för att bilda data behöver vi inte vara så exakta eftersom CPU: n kör 16 000 instruktioner på en enda millisekund. Med andra ord är en millisekund en evighet för CPU: n. Så låt oss prova med tärningskastorna. Jag vill överföra resultatet av en tärningsrulle från tärningsvalschipet till analysatorchipet. Antag att du stod tvärs över gatan och jag ville signalera till dig resultatet av min tärningsslinga. En sak jag kunde göra, om vi båda hade en klocka, är att jag kunde slå på en ficklampa, sedan när du är redo att ta emot mina data tänder du din ficklampa och vi startar båda våra klockor. Sedan håller jag min ficklampa tänd i det exakta antalet millisekunder när tärningarna rullar och stänger sedan av den. Så om jag rullade en 12 skulle jag hålla mitt ljus tänt i 12 millisekunder. Nu är problemet med ovanstående att det för dig och mig inte finns något sätt att vi skulle kunna ta saker tillräckligt noggrant för att skilja mellan 5 millisekunder och 12 millisekunder. Men vad sägs om det här: Antag att vi bestämde att jag skulle hålla mitt ljus tänt i ett år för varje nummer på tärningarna? Om jag rullar en 12 -tal skulle jag tända ljuset på dig i 12 år och jag tror att du kommer att hålla med om att det inte finns någon möjlighet att du gör ett misstag när du räknar ut siffran rätt? Du kan ta en paus och spela baseboll, du kan till och med spela craps i Vegas i 6 månader, så länge som du någon gång under året tittade över gatan för att se om ljuset var tänt skulle du inte missa en räkning. Det är precis vad vi gör för mikrokontrollerna! En enda millisekund för CPU: n är ungefär ett år. Så om jag slår på signalen i 12 millisekunder är det nästan ingen chans att den andra mikrokontrollern kommer att förvirra den i 10 eller 11 oavsett vad som avbryter och vad som inte händer under tiden. För mikrokontrollerna är en millisekund en evighet, så här kommer vi att göra. Först väljer vi två portar på regulatorn som våra kommunikationsportar. Jag kommer att använda PD6 för att ta emot data (vi kan kalla det Rx om vi vill) och jag kommer att välja PD7 för att överföra data (vi kan kalla det Tx om vi vill). Analysatorchipet kommer regelbundet att kontrollera att det är Rx -stift och om det ser en signal kommer det att falla till en "kommunikationssubrutin" och sedan överföra en retursignal till tärningsrullen som säger att den är redo att ta emot. De kommer båda att börja tajma och tärningsrullen kommer att sända en signal (dvs. 5V) för en millisekund per tal på tärningarna. Så om rullen var dubbla sexor eller en 12, då skulle tärningsrullen ställa in den PD7 till 5V i 12 millisekunder och sedan sätta tillbaka den till 0V. Analysatorn kommer att kontrollera sin PD6 -stift varje millisekund, räkna varje gång, och när den går tillbaka till 0V matar den ut det resulterande numret till analysatorns display och visar en tolv i binär på lysdioderna. Så det är planen. Låt oss se om vi kan genomföra det.

Steg 2: Kommunikationssubrutiner

Det första vi behöver göra är att ansluta de två kontrollerna. Så ta en kabel från PD6 på den ena och anslut den till PD7 på den andra, och vice versa. Initiera sedan dem genom att ställa in PD7 på OUTPUT på båda och PD6 till INPUT på båda. Sätt slutligen alla till 0V. Lägg specifikt till följande i avsnittet Init eller Reset i koden på varje mikrokontroller:

sbi DDRD, 7; PD7 inställd på utgång

cbi PortD, 7; PD7 initialt 0V cbi DDRD, 6; PD6 inställd på ingång cbi PortD, 6; PD6 initialt totalt 0V clr; totalt på tärningar initialt 0

Låt oss nu konfigurera kommunikationssubrutinen på tärningsvalschippet. Definiera först en ny variabel högst upp som kallas "totalt" som lagrar det totala antalet kastade på tärningsparet och initierar det till noll.

Skriv sedan en subrutin för att kommunicera med analysatorn:

kommunicera:

cbi PortD, 7 sbi PortD, 7; Skicka redo signal vänta: sbic PinD, 6; läs PinD och hoppa om 0V rjmp väntetid 8; fördröjning för att synkronisera (hittade detta experimentellt) skicka: dec total fördröjning 2; fördröjning för varje die count cpi totalt, 0; 0 här betyder "totalt" antal förseningar har skickats breq PC+2 rjmp skicka cbi PortD, 7; PD7 till 0V clr totalt; återställ tärningen totalt till 0 ret

I analysatorn lägger vi till en rcall från huvudrutinen till kommunikationssubrutinen:

clr -analysator; förbereda dig för ett nytt nummer

sbic PinD, 6; kontrollera PD6 för en 5V signal rcall kommunicera; om 5V går för att kommunicera mov -analysator, totalt; utmatning till analysator display rcall analysator

och skriv sedan kommunikationssubrutinen enligt följande:

kommunicera:

clr totalt; återställ totalt till 0 fördröjning 10; fördröjning för att bli av med studsar sbi PortD, 7; ställ in PB7 på 5V för att signalera klar mottagning: fördröjning 2; vänta på nästa antal inkl totalt; öka totalt sbic PinD, 6; om PD6 går tillbaka till 0V är vi klara med rjmp -mottagning; annars loopa tillbaka för mer data cbi PortD, 7; återställ PD7 när du är klar ret

Varsågod! Nu är varje mikrokontroller inställd för att kommunicera resultatet av tärningskastet och sedan visa det på analysatorn.

Vi kommer att implementera ett mycket effektivare sätt att kommunicera senare när vi behöver överföra innehållet i ett register mellan kontroller istället för bara en tärning. I så fall kommer vi fortfarande att använda bara två ledningar som förbinder dem, men vi kommer att använda 1, 1 för att betyda "börja sändning"; 0, 1 betyder "1"; 1, 0 betyder "0"; och slutligen 0, 0 för att betyda "slutöverföring".

Övning 1: Se om du kan implementera den bättre metoden och använda den för att överföra tärningsrullen som ett 8-bitars binärt tal.

Jag bifogar en video som visar min i drift.

Steg 3: Slutsats

Slutsats
Slutsats

Jag har bifogat hela koden för din referens. Det är inte så rent och snyggt som jag skulle vilja, men jag städar det när vi utökar det i framtida självstudier.

Från och med nu ska jag bara bifoga filerna som innehåller koden istället för att skriva allt här. Vi kommer bara att skriva ut de avsnitt som vi är intresserade av att diskutera.

Detta var en kort handledning där vi kom fram till en enkel metod för att berätta för vår analysatorns mikrokontroller vad resultatet av vår tärningskast från vår tärningsvalsmikrocontroller medan vi bara använder två portar.

Övning 2: Istället för att använda en klarsignal för att visa när tärningsrullen är klar att sända och en annan när analysatorn är redo att ta emot, använd ett "externt avbrott" som kallas "Pin Change Interrupt". Stiften på atmega328p kan användas på detta sätt, varför de har PCINT0 till och med PCINT23 bredvid dem i pinout -diagrammet. Du kan implementera detta som ett avbrott på ett liknande sätt som vi gjorde med timeröverflödesavbrottet. I det här fallet är avbrottshanteraren subrutinen som kommunicerar med tärningsrullen. På så sätt behöver du inte faktiskt ringa kommunikationssubrutinen från huvudet: den kommer att gå dit när som helst det kommer ett avbrott från en förändring av staten på den stiftet.

Övning 3: Ett mycket bättre sätt att kommunicera och överföra data mellan en mikrokontroller till en samling andra använder det inbyggda 2-trådiga seriella gränssnittet på själva mikrokontrollen. Försök att läsa avsnitt 22 i databladet och se om du kan ta reda på hur du implementerar det.

Vi kommer att använda dessa mer sofistikerade tekniker i framtiden när vi lägger till ytterligare kontroller.

Det faktum att allt vi gjorde med vår analysator är att ta tärningssumman totalt och sedan skriva ut den i binär med hjälp av lysdioder är inte det som är viktigt. Faktum är att nu vår analysator "vet" vad tärningsrullen är och kan använda den därefter.

I nästa handledning kommer vi att ändra syftet med vår "analysator", introducera några fler kretselement och använda tärningsrullen på ett mer intressant sätt.

Tills nästa gång…