Stap 2: Software
De zekeringen ATtiny2313 moeten op de juiste wijze zijn ingesteld op de interne klok van 1Mhz te selecteren. De volgende link www.engbedded.com/fusecalc is nuttig voor het vereenvoudigen van de enigszins verwarrend omgekeerde logica die wordt gebruikt voor het programmeren van de zekering. Het fuse.txt bestand hieronder toont het commando dat ik gebruikt voor het programmeren van de zekeringen.
Een ander ding is dat de flits programmering poorten met PORTB, overlappen zodat u de LEDs loskoppelen wellicht terwijl de ATtiny2313 programmeren. De build-instructies staan in het bestand build.txt hieronder. (Net als een geestelijke gezondheid te controleren, ik printen de grootte van de code en de variabele kaart.)
Ik gebruikte een meerkanaals scope voor foutopsporing. Het zou moeilijk voor me te vinden sommige van de 'bugs' anders geweest zijn. Het kostte me een tijdje om erachter te komen dat de LED knipperen was interfereren met de conversie. Om te debuggen deze kwestie, die ik verdacht was gerelateerd aan de interrupts, ik gebruikte de ongebruikte poort van PORTD en stel deze aan het begin van de interrupt en unset het vlak voor het einde. Het probleem was dat, terwijl de code knipperen in de interrupt service routine makkelijk was te lezen en te begrijpen, het duurde ongeveer 500μS uit te voeren. Ik herschreef de code, zodat er minder lijnen (maar moeilijker en minder begrijpelijk), en dit werd minder een probleem. Ik heb ook besloten om het uitschakelen van de knipperen-interrupts tijdens de conversie.
De opstelling is ongecompliceerd, timer1 wordt gebruikt voor het activeren van de knipperen interrupt (1000 cycli op 1Mhz). De comparator is ingeschakeld om te activeren een opname timer op een stijgende rand. Alle stukjes PORTB en PORTD zijn aanvankelijk tri-vermeld. De LED-stations (6 bits op PORTB, 4 op PORTD) zijn ingeschakeld. De besturen van de lading en geen kwijting weerstanden poorten zijn ingesteld op hoge en lage respectievelijk. De condensator wordt geloosd, waarna de interrupts zijn ingeschakeld. Dit wordt gevolgd door een oneindige lus van conversies gevolgd door het resultaat weer te geven.
De LED knipperen is conceptueel eenvoudig, maar enigszins gecompliceerd doordat het de bits zijn verdeeld over twee poorten. Het knipperen werkt in een cyclus van 10mS. In de eerste cyclus, LED0 & LED1 zijn ingeschakeld, in de volgende cyclus, LED1 & LED2 zijn ingeschakeld, en zo verder, totdat de laatste cyclus waarin LED9 & LED0 zijn ingeschakeld. De inschakelen maskers worden opgeslagen in een vooraf berekende statische matrix display_mask_B en display_mask_D en de interrupt routine cycli door elk van de 10 maskers.
De ADC-conversie werkt door het uitschakelen van de timer1-interrupt, opladen van de condensator (en opnemen van de starttijd die de timer1-waarde) totdat de Comparateur-output is ingesteld. Dan de condensator wordt aangezuiverd voor 5 * R_DIS * C_CHR, dat ongeveer 60μS is. De tijd die nodig is voor de conversie wordt gemeten door de timer1-interrupt vastleggen (veroorzaakt door een stijgende rand op de uitgang van comperator). De timer1-interrupt is ingeschakeld en het tijdsverschil berekend. De berekening is eenvoudig omdat de conversie minder dan 1 MS duurt. (Vergeet niet dat de teller om elke 1000-teken terugloopt.)
Aanvankelijk probeerde ik kalibreren van de uitvoer door te meten en computing, maar het begon te krijgen te ingewikkeld, dus heb ik besloten om tijdelijk het resultaat met behulp van een debug_led_value-routine (dat weergegeven de waarde 10-bits binaire, houd het display voor een tweede) weer te geven, en spelen met een static. Dit gaf een (subjectieve) aantal keren van 136-351 teken. Ik schreef sommige vertakkende code toewijzen van dit bereik naar een getal tussen 0 en 10, en gebruikt dit om de balken weer te geven. Dit werkte naar behoren. (Ik gekalibreerd het apparaat vóór montage, aangezien dit betrof de ATtiny2313 reflashing.)