Musik spelas väckarklocka (18 / 24 steg)
Steg 18: Software Design
Sista projektet källkoden finns även nedan. Dock IR kommando kodfilen är tom och ska fyllas i med samma data som du fik från steg "Fånga IR Remote Control Data". När du fyller i, du bör kunna sammanställa-uppladdning-kör den.Koden kommer att spela alla filer på ditt SD-kortets rotkatalog. Filerna kommer att sorteras i alfabetisk ordning. Min källa koden har några extra funktioner som visar volymen när det ändras och visar den aktuella filnamnet, låten längd och aktuell tid i sången. Vänligen följ källkoden för att förstå hur varje funktion fungerar.
Music player kommer inte att kunna spela musik medan ansluten till en dator som en USB-masslagringsenhet. Detta beror på att SCSI (minns jag nämnt tidigare?) fungerar på block av rådata på SD-kortet direkt men modulen FatFs vi använde cachelagrar data i RAM, således ändra något med USB kommer att orsaka de data som används av FatFs vara out-of-sync med verkliga data.
Även om jag ville använda USB ansluta och koppla från händelser för att automatiskt upptäcka om att tillåta FatFs åtkomst till SD-kortet eller inte, jag kan inte på ett sådant sätt att det Teensy ++ är utformad. Det kommer alltid finnas en spänning på VBUS, vilket gör händelserna värdelös. Så om du vill aktivera USB-åtkomst, måste du gå in i menyn av klockan för att aktivera den.
Det finns en timer som kallas den "en shot timer" som kommer eld en händelse endast en gång efter en viss tid. Detta används för att visa aktuell tid på LCD efter någon annan sak har varit visas på LCD-skärmen. Så om du ändrar volymen, det kommer att visa volymen, och efter 3 sekunder, det kommer att gå tillbaka till visar du tid.
En annan timer är timer 0, som är programmerad att avfyra en händelse varje sekund, detta håller reda på tiden internt så vi slipper fråga DS1307 ofta. Detta avfyrar också alarmet när tiden matchar.
Jag har ett kort tillägg på timers, kolla upp.
Alla LCD utskrift sker med sträng lagras i flash-minne, detta är typ av långsamma i jämförelse med hjälp av RAM. Jag har strukturerat programflödet för att bara uppdatera LCD under perioder när dekodern är upptagen. Strängar sparas i flash eftersom RAM-minnet är mer värdefulla, det är en god vana att alltid spara icke föränderliga strängar i flash.
Alla inställningar sparas antingen till DS1307 användaren RAM (som är batteriet backas) eller AVR: s interna EEPROM (se bilaga för mer detaljer). Dessa inställningar är laddad och validerats vid starten och sparas när dekodern är upptagen.
Om du gräver dock filerna, kan du hitta testfunktioner som jag använder för att testa olika enskilda komponenter i systemet.
Alla filer som skrivs enbart av mig är i topp projektmappen. LUFA lagras under mappen LUFA och "Lib" lagrar olika komponenter inte skriven av mig (det kan finnas ändringar).
Erfarna C kodare kan det hända att jag bröt flera regler. För den. C-filer som ingår i stället för sammanställt min ursäkt är att de är åtskilda för att Modularisera utan att utforma API: er som abstrakta. För de andra misstag är min ursäkt den begränsade tid jag var tvungen att bygga, program, testa och dokumentera detta projekt.
Det finns vissa mekanismer i den kod som gör att samma kod som skall sammanställas för ATmega644 och ATmega644P marker som Teensy ++, Stifttilldelningar är olika (och kretsen kräver alltså mindre omkoppling). Porterade koden har inte testats. Uppenbarligen finns det ingen USB-funktionalitet i ATmega644/ATmega644P-versionen eftersom den microcontroller inte har USB.
Säkringar för AT90USB1286 ska inte ändras om du använder Teensy ++.
Säkringar för ATmega644 bör vara: LFUSE: 0xE2, HFUSE: 0x9F, vikten av dessa inställningar är att den interna RC-oscillatorn används på 8 MHz (medan det Teensy ++ använder en extern 16 MHz kristall som delas av 2 internt).
För ett snyggt sätt att beräkna AVR säkringar, prova detta: http://www.frank-zhao.com/fusecalc/
Bifogat finns tidsstämplad komplett källkod.