Stap 9: Code en video voor versie 1
Ik heb mijn code voor deze eerste versie van het toetsenbord stuurprogramma bijgevoegd. In deze moet u druk op de toets en vervolgens op de knop om de ADC om te lezen van de input van het toetsenbord. Wat we liever hebt is geen knop, maar in plaats daarvan het signaal te doen de conversie komt uit de ToetsIndrukken (KeyPress) zelf.
Oefening 3: Verzamelen en uploaden van deze code en probeer het. Het is wellicht om te veranderen de verschillende conversie drempels overeenstemmen met uw ToetsIndrukken (KeyPress) spanningen, aangezien ze waarschijnlijk van de mijne verschillen. Wat gebeurt er als u probeert te gebruiken een input van het toetsenbord zowel voor de externe interrupt pin in plaats van via een knop voor de ADC0?
Ik zal ook een video van de werking van deze eerste versie van onze chauffeur ToetsIndrukken (KeyPress) hechten.
U zult opmerken dat in mijn code er een sectie voor het initialiseren van de Stack Pointer. Er zijn verschillende registers die we willen kunnen push en pop van de stack wanneer we zijn manipuleren van variabelen en wat niet en er zijn ook registers die we wilt opslaan en later herstellen. SREG is bijvoorbeeld een register dat niet over interrupts, is behouden, zodat de verschillende vlaggen die ingesteld en uitgeschakeld als gevolg van de operaties kunnen worden gewijzigd als er een interrupt optreedt in het midden van iets. Dus is het best als u SREG op de stack aan het begin van een interrupt handler duwen en vervolgens pop uit opnieuw aan het einde van de interrupt handler. Ik heb het geplaatst in de code om te laten zien hoe het wordt geïnitialiseerd en te anticiperen op hoe zullen we het later maar aangezien we niet schelen wat gebeurt er met SREG tijdens interrupts in onze code dat ik niet de stack hiervoor gebruiken.
Ook opmerken dat ik gebruikt de schuifbewerking naar heb verschillende stukjes instellen in registers bij het initialiseren. Bijvoorbeeld in de regel:
ldi temp,(1<<ISC01)|(1<<ISC00) ; comment to fix Instructables formating issues: >>>> sts EICRA,temp
De "<<" opdracht in de eerste regel van de bovenstaande code is een schuifbewerking. In wezen duurt het binaire getal 1, die is 0b00000001 en verschuivingen die het achtergelaten door het bedrag van het nummer ISC01. Dit is het standpunt van de bit met de naam ISC01 in het EICRA-register. Aangezien ISC01 is beetje 1, de nummer 1 is verschoven naar de linkerpositie 1 tot 0b00000010. Ook is de tweede, ISC00, bit 0 van EICRA en de verschuiving van de nummer 1 is dus nul posities naar links. Als blik nemen een andere kijk op het m328Pdef.inc-bestand dat u hebt gedownload in de eerste tutorial en zijn geweest using evrr sinds, zult u zien dat het is gewoon een lange lijst van de verklaringen van de ".equ". Vindt u dat ISC01 gelijk aan 1 is. De assembler vervangt elk exemplaar van het door 1 voordat zelfs te monteren om het even wat. Ze zijn gewoon namen voor register bits om te helpen ons mensen lezen en schrijven van de code. Nu, de verticale lijn tussen de bovenstaande twee shift-operaties is een logische "of" operatie. Hier is de formule:
0b00000010 | 0b00000001 = 0b00000011
en dit is wat we laden (met behulp van "ldi") in de temp. De reden mensen gebruiken deze methode kunt u de waarden in een register laden is dat het maakt het mogelijk om de naam van de bits te gebruiken in plaats van gewoon een nummer en dit de code maakt is veel gemakkelijker te lezen.
Er zijn ook twee andere technieken die we hebben gebruikt. We gebruiken de instructies "ori" en "andi". Deze laten instellen en schakelt u bits respectievelijk zonder wisseling ieder van naar de andere bits in een register. Bijvoorbeeld, wanneer ik gebruikte
ori temp,(1<ADC0D) ; comment to fix formating: >
deze "of" s temp met 0b00000001 die zet een 1 in de nulde bit en laat de rest ongewijzigd. Ook wanneer we schreven
andi temp,0b11111110
Dit verandert de nulde beetje temp op een 0 en al de rest die ongewijzigd laat.
Oefening 4: U moet de code doorlopen en zorg ervoor dat u begrijpt elke regel. Kan je het interessant om te vinden van betere methoden om dingen te doen en een beter programma te schrijven. Er zijn honderd manieren om code dingen en ik ben vrij zeker vindt u een veel betere manier dan de mijne. U kunt ook vinden (hemel verhoede!) fouten en omissies. In dat geval zou ik zeker willen horen over hen, zodat ze kunnen worden hersteld.
Oke, nu laten we zien als we van die overbodig knop ontdoen kunnen...