AVR Assembler handledning 6 (2 / 3 steg)
Steg 2: Kommunikation subrutiner
Det första vi behöver göra är att ansluta de två handkontroller. Så ta en tråd från PD6 på en och ansluta den till PD7 på den andra och vice versa. Sedan initiera dem genom att ange PD7 till produktionen på båda och PD6 till ingången på båda. Slutligen ställa dem alla till 0V. Specifikt, lägger du till följande i Init, eller återställa avsnitt 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 inledningsvis 0V
CLR totalt; totalt på dice från början 0
Nu låt oss upprätta kommunikation subrutinen på dice-roller chip. Först definiera en ny variabel överst kallas "total" som kommer att lagra totalt antal rullade på para av tärningarna och initiera den till noll.
Sedan skriva en subrutin att kommunicera med analyzer:
meddela:
CBI PortD, 7
SBI PortD, 7. Skicka klar signal
Vänta:
sbic PinD, 6. läst PinD och hoppa över om 0V
rjmp vänta
dröjsmål 8. fördröjning för att synkronisera (hittade detta experimentellt)
Skicka:
dec totalt
dröjsmål 2. fördröjning för varje die greve
KPI totalt, 0; 0 här betyder "total" antalet förseningar har skickats
breq PC + 2
rjmp skicka
CBI PortD, 7. PD7 till 0V
CLR totalt; återställa dice totala till 0
ret
Analysatorn vi lägga till en rcall från den huvudsakliga rutinen att kommunicera subrutinen:
CLR analyzer; förbereda för nya numret
sbic PinD, 6. När PD6 på en 5V signal
rcall kommunicera; om 5V går att kommunicera
MOV analyzer, totalt; utgång till analyzer Visa
rcall analyzer
och sedan skriva kommunicera subrutinen enligt följande:
meddela:
CLR totalt; återställa totalt 0
dröjsmål 10. dröjsmål att bli av studsar
SBI PortD, 7. Ange PB7 till 5V signal redo
ta emot:
dröjsmål 2. vänta tills nästa nummer
Inc totalt; ökning totalt
sbic PinD, 6. om PD6 går tillbaka till 0V klar vi
rjmp får; annars loop tillbaka upp för mer data
CBI PortD, 7. återställa PD7 när du är klar
ret
Där går du! Nu är varje mikrokontroller inställd att kommunicera resultatet av tärningskast och sedan Visa det på analysatorn.
Vi kommer att genomföra ett mycket effektivare sätt att kommunicera senare när vi behöver flytta innehållet i ett register mellan domänkontrollanter i stället för bara ett tärningskast. I så fall använder vi fortfarande bara två kablar ansluter dem men vi kommer att använda 1,1 betyda "börja överföringen"; 0,1 betyda "1"; 1,0 betyder "0"; och slutligen 0,0 betyder "slutet överföring".
Övning 1: se om du kan genomföra metoden bättre och använda den för att överföra tärningarna rulla som en 8-bitars binära tal.
Jag fäster en video som visar min i drift.