Fattig mans AVR speldosa (2 / 6 steg)
Steg 2: Källkoden förklarade
Programmet flyter enligt följande:Start:
Tydlig register
Ställa in data riktning på portar av intresse
Loop0:
om ingen ingång, producera ingen utgång
om input, fortsätta
Note0:
input = note0?
i så fall producera ladda värden in timer register som gör att produktionen fungerar rätt fyrkantsvåg frekvensen
om inte, Fortsätt
(Producera en NoteX slinga för varje möjligt ton över 8 oktaver)
Hej:
höja produktionen hög (1)
timerhi:
definierar hur länge resultatet håller hög
Lo:
Återge utdata för att låg (0)
timerlo:
definierar hur länge produktionen förblir låg (0)
ingång:
Kontrollera om indata har ändrats
i så fall Använd fula knep för att komma tillbaka till loop0
om inte, gå till Hej
Det finns många "rjmp öar" att låta programmet gå tillbaka till början... denna microcontroller stöder inte jmp opcode, och rjmp kan bara ge dig en fungerar inom ett avstånd av ett antal instruktioner. Vi lösa detta genom "sådd" programmet med rjmp uttalanden som hoppas över på vägen "ned" till programmet, men kan användas att klättra tillbaka upp till programmet startas.
BUGG varning: Någonstans 3/4 väg ner skalan, det finns ett kluster av några (3-4) anteckningar som inte är helt rätt. Av de 3 värden som används för r30, jag misstänker den högsta som används är felaktig (lågt), jag förmodligen missbedömde antalet klockan cykler någonstans, eller kanske lägga ett fel värde för r29 någonstans... Jag kommer bara att komma runt det, fixa det om du vill (och berätta där misstaget var!)
INEFFEKTIVITET varning: Jag vet, jag kunde ha bara använt PWM och vissa EEPROM tabell, men när jag tänkte på det, det fungerade redan detta sätt.