Stap 2: Communicatie subroutines
Het eerste wat dat we moeten doen is het aansluiten van de twee controllers. Dus neem een draad van PD6 enerzijds en aansluiten op PD7 anderzijds, en vice versa. Dan hen te initialiseren door PD7 te stellen op OUTPUT op zowel en PD6 op ingang van beide. Tot slot stelt ze allemaal op 0V. Met name het volgende toevoegen aan de Init, of sectie van de code op elk microcontroller resetten:
sbi DDRD,7 ; PD7 set to output cbi PortD,7 ; PD7 initially 0V cbi DDRD,6 ; PD6 set to input cbi PortD,6 ; PD6 initially 0V clr total ; total on dice initially 0
Nu laten we opzetten van de communicatie-subroutine op de dobbelstenen-roller-chip. Eerst definiëren een nieuwe variabele aan de top die zal slaan het totaalaantal op de paar dobbelstenen gerold en initialiseren op nul "totale" genoemd.
Schrijf dan een subroutine om te communiceren met de analyzer:
communicate: cbi PortD,7 sbi PortD,7 ; Send ready signal wait: sbic PinD,6 ; read PinD and skip if 0V rjmp wait delay 8 ; delay to synchronize (found this experimentally) send: dec total delay 2 ; delay for each die count cpi total,0 ; 0 here means "total" number delays have been sent breq PC+2 rjmp send cbi PortD,7 ; PD7 to 0V clr total ; reset dice total to 0 ret
In de analyzer toevoegen we een rcall uit de belangrijkste routine aan de subroutine communiceren:
clr analyzer ; prepare for new number sbic PinD,6 ; check PD6 for a 5V signal rcall communicate ; if 5V go to communicate mov analyzer, total ; output to analyzer display rcall analyzer
en vervolgens de subroutine communiceren als volgt schrijven:
communicate: clr total ; reset total to 0 delay 10 ; delay to get rid of bounces sbi PortD,7 ; set PB7 to 5V to signal ready receive: delay 2 ; wait for next number inc total ; increment total sbic PinD,6 ; if PD6 goes back to 0V we're done rjmp receive; otherwise loop back up for more data cbi PortD,7 ; reset PD7 when done ret
Daar ga je! Nu is elke microcontroller ingesteld om te communiceren het resultaat van de dobbelstenen rollen en vervolgens weer te geven over de analyzer.
We zullen een veel efficiëntere manier van communiceren later wanneer we moet overbrengen van de inhoud van een register tussen domeincontrollers in plaats van gewoon een dobbelsteen implementeren. In dat geval zullen we nog slechts twee draden aansluiten van hen gebruiken maar we 1,1 zal gebruiken om te betekenen "beginnen transmissie"; 0,1 betekenen "1"; 1,0 betekent "0"; en ten slotte 0,0 te betekenen "end transmission".
Oefening 1: zie als u kunt de betere methode implementeren en het gebruiken om te zetten de dobbelstenen rollen als een 8-bits binair getal.
Ik zal een video die mijne ingebruikzijn toont hechten.