Stap 5: Programmering de AWG
Hier is een gids voor de programmering van dit apparaat. Ik zal beginnen met het programma gebruikt voor het genereren van de 1.7 Mhz sinusgolf:START:
.include "m8515def.inc"; Dit is een definitiebestand, een handig ding om te gebruiken. Als u een kopie, google de bestandsnaam nodig
REGISTERS0:
LDI r16, 0x00
LDI r17, 0x25
LDI r18, 0x7F
LDI r19, 0xD9; Belasting registreert eerst, op die manier later die uw code ~ 1 uitgang per klokcyclus kan produceren
LDI r20, 0xFF; Deze waarden werden vastgesteld door 127*sin(x)(pi/4), voor positieve geheeltallige waarden voor x.
uit DDRB, r20
2Mhz sine0:
uit PORTB, r18
uit PORTB, r19
uit PORTB, r20
uit PORTB, r19
uit PORTB, r18
uit PORTB, r17
uit PORTB, r16
uit PORTB, r17; één periode van sinus golf @ 2Mhz als u met een kloksnelheid van 16Mhz
rjmp 2Mhz sine0
Deze volgen voorbeelden van 1Mhz sinus golven, gegenereerd van twee verschillende manieren.
1Mhz sine0:
uit PORTB, r18
NOP
uit PORTB, r19
NOP
uit PORTB, r20
NOP
uit PORTB, r19
NOP
uit PORTB, r18
NOP
uit PORTB, r17; één periode van sinus golf @ 1Mhz als u met een kloksnelheid van 16Mhz
NOP
uit PORTB, r16; Dit is de luie manier.
NOP
uit PORTB, r17; In het volgende voorbeeld demonstreert de betere manier.
rjmp 1Mhz sine0
REGISTERS1:
LDI r16, 0x7F
LDI r17, 0xAB
LDI r18, 0xD1
LDI r19, 0xF6
LDI r20, 0xFE
LDI r21, 0x53; Merken dat we 9 registers naar het geheugen hebt geladen! Let op hoeveel registers hebt, en
LDI r22, 0x2D, maak goed gebruik van hen. Waar 127*sin(x)(pi/n), n een willekeurig aantal registers kunnen worden
LDI r23, 0x08; waar een aantal registers plus 1 gedeeld door 2... als ik mij niet vergis!
LDI r24, 0x00
1Mhz sine1:
uit PORTB, r16
uit PORTB, r17
uit PORTB, r18
uit PORTB, r19
uit PORTB, r20
uit PORTB, r19
uit PORTB, r18
uit PORTB, r17
uit PORTB, r16
uit PORTB, r21
uit PORTB, r22
uit PORTB, r23
uit PORTB, r24
uit PORTB, r23
uit PORTB, r22
uit PORTB, r21
rjmp 1Mhz sine1
Het bovenstaande is een mooi voorbeeld van de afweging tussen de resolutie en frequentie. Door halvering van de resolutie, kunt u dubbele de frequentie. Een scherpzinnige lezer
zal zijn opgevallen dat beide golfvormen 0x7F (127) gebruiken als een nulpunt ongeacht de volgorde dat de registers worden geladen... U kan bepalen dat een ander
nulpunt is nuttiger zijn voor bepaalde golfvormen... maar voor symmetrische degenen zoals u bent het meest waarschijnlijk te gebruiken, 0x7F is optimaal.
Nu, gaan we naar een meer gecompliceerde onderwerp... hoe we het genereren van een golfvorm 1.5Mhz? Houd rekening met:
sine(x)(Pi/6)
die zou worden de juiste resolutie te gebruiken... maar aangezien deze resolutie gelijkmatig in 2pi, maar niet in p/2 verdeelt... onze golfvorm ziet er vreemd,
omdat op geen enkel moment is de output gelijk is aan het minimum of het maximum van de functie, dat wil zeggen iets in de buurt van 0x00 of 0xFF! Voor hoge
frequenties, de golfvorm kan toch ongeveer juiste, vanwege de natuurlijke precisiecapaciteit en zelfinductie in elk circuit. Dit verzet zich tegen elke wijziging
in stroom en spanning, dus bij hogere frequenties, als u uitvoer 0x00 tien keer, dan 0xFF tweemaal... de tweede 0xFF krijgt u een iets hogere waarde
dan de eerste. Probeer het en zie, het kan of kan niet werken afhankelijk van variabelen die te complex om te bespreken hier.
Het punt is dat het moeilijk of onmogelijk om het genereren van de frequenties die niet binaire breuken van de kloksnelheid... At zeer hoog
frequenties die je zou kunnen "cheat" met behulp van parasitaire precisiecapaciteit en inductie... en zeker bij lagere frequenties de kwestie irrelevant wordt
zoals we in het volgende voorbeeld zien zullen... maar er zijn zeker sommige frequenties die kunnen niet worden gegenereerd.
Een slimme ingenieur (dwz: niet mij) zal het installeren van een socket te houden van de kristal oscillator gebruikt in dit apparaat... op die manier hij/zij onbelangrijk kunt de
fundamentele frequentie van het apparaat en in wezen elke frequentie ze binnen de specificaties van de microcontroller willen te verkrijgen
(Ik heb gezien goedkoop... 2$... atmels die maximaal 20 Mhz kloksnelheden werken).
Nu, hier is wat code voor een uitgesproken lagere frequentie golfvorm. Het is eigenlijk een code van de website die ik als referentie vermeld:
http://www.AVR-ASM-tutorial.net/avr_en/AVR_DAC.html
De golfvorm is een zaagtandgolf. Ga check out de website zoals het is zeer nuttig en de code er echt goed voor laag-medium frequentie golfvormen is.
.include "m8515def.inc"
START:
LDI r18, 0xFF
uit DDRD, r18
ZAAGTAND:
uit PORTD, r18
Inc r18
rjmp zaagtand
Dit genereert een golfvorm van ongeveer 2,5 kilohertz. U kon verkleinen/vergroten frequentie met pauzes (nop) of timers toe te voegen, of u kan de frequentie verhogen
door het verlagen van de resolutie in plaats van inc (increment) eenvoudig door een aantal aan r18 toevoegen. Als u 2 toevoegt, zou de frequentie verdubbelen. Als u 3 en een pauze toevoegen
(nop), de frequentie stijgt met 1,5 keer.
Te maken van een driehoek golf, voegen een cpi-instructie om te testen of r18 is gelijk aan 0xFF, en zo ja, tak naar een vergelijkbare functie die verlaagt of wordt afgetrokken van r18. Dat de functie natuurlijk testen moet als r18 = 0x00, en als dus terug naar de eerste functie tak.
Ik zal eind van deze tutorial met een paar aanwijzingen over hoe slim gebruik van dit apparaat:
-Hiermee kunt u dat goede timerfuncties nauwkeurig maken lagefrequentie golfvormen. Het is moeilijker dan je denkt om klokcycli van programma's in je hoofd bij te houden.
-Als timerfuncties bang voor bent (ze maakt me bang), tellen klokcycli in je hoofd en dan testen op uw bereik om ervoor te zorgen dat het klopt.
-Een decimaal getal naar hex converter is een handig ding bij het bepalen van wat de waarden van de registers moeten worden.
-Don't haak van dit apparaat op een antenne en gebruiken voor draadloze communicatie, tenzij u een licentie hebt en weet wat je doet.
-Kunt u waarschijnlijk het programma tot een 4 Mhz blokgolf met dit apparaat... gebruiken als een variabele klokbron of om te injecteren seriële communicatie in een circuit.
-8 van deze samen met een gemeenschappelijk klok zou een echt cool parallelle programmeerbare bron maken.
-Het genereren van neuron actie potentials mee, en ongetwijfeld een heleboel geld besparen uw biologie laboratorium.
-Maak een piano mee.
-Dit apparaat laat vele ingangen op de atmega ongebruikte. Als u wilt dat het apparaat meer handig maar functies hebben beperkt, u kon bouwen een
interface voor het en een slimme programma zodat u een aantal golfvormen en frequenties zonder herprogrammering genereren kunt.
-Herinner me dat rjmp neemt klokcycli en zorgt voor een artefact! Rond dit krijgen door met inbegrip van vele periodes in uw programma voor looping. Goed benutten
van al dat geheugen op de atmegas!
Verouderd (legioen Labs is een nieuwe non-profit, no-graden-verplicht onderzoekinspanning momenteel gevestigd in Montreal. Wij zijn niet verbonden zijn met andere organisaties.
Het heeft momenteel een lid, aangezien ik heb pas zeer onlangs overwogen uitbreiding van het toepassingsgebied van deze bewerking.)
Huidige: Legioen Labs is een lid van een montreal-gebaseerde non-profit onderzoek/engineering inspanning met een aantal andere mensen, die een industriële workshop verhuren als een plek om te sleutelen.