Musik spelas väckarklocka (23 / 24 steg)
Steg 23: Bilaga E: Timers och EEPROM, på AVRs
EEPROMhttp://en.wikipedia.org/wiki/EEPROM
Elektriskt raderbart programmerbart Läs bara minne. Det är en typ av icke-flyktigt minne, vilket betyder att den lagrar information även om strömmen försvinner. De flesta mikrokontroller har några internt för dig att använda.
För AVR microcontrollers, använder bara avr / eeprom.h's funktioner att skriva till eller läsa från EEPROM. Funktionerna är mycket mycket enkelt.
http://www.nongnu.org/avr-libc/user-manual/group__avr__eeprom.html
Du gör bara saker som
värde = eeprom_read_byte (sätta adress här);
och
eeprom_write_byte (adress, värde);
Detta är för enkelt av ett ämne, och således detta tillägg innehåller också...
Timers på AVRs
Timers hålla reda på tiden automatiskt i bakgrunden. Detta är användbart för att läsa hur länge en puls är (till exempel hur vi använde timer input capture för IR-mottagaren), eller mata ut pulser upprepade gånger (till exempel PWM inte relaterad till vårt projekt men vanligen används för olika saker), eller att upprepa något, eller att helt enkelt hålla reda på tiden. Det finns många många fler användningsområden...
Enkelt sätta timer prescaler som berättar hur snabbt att köra timern på AVR, och sedan starta timer modulen. Alternativt kan du aktivera olika avbrott, eller PWM modulen eller modulen input capture. Hur detta görs är alla i AVR: s datablad, de har även vissa exempelkod i både montering och C.
Till exempel om prescaler ställs på systemklockan dividerat med 2, och systemklockan är 8 MHz (i vårt fall, det är), då timern är aktiverad på 4 MHz, vilket innebär att varje 1/4000000 sekunder, räknaren timer kommer att öka med 1. Jag skrev en snygg verktyg som jag använder för att beräkna timer med värden: http://www.frank-zhao.com/index.php?page=avrtimercalc
Pop quiz, vad är den enhet som används för att fånga och store IR pulse bredd värden vi använder?
Teensy ++ har en 16 MHz kristall, men vi kör det på 3,3 v istället för 5V, så använder vi "clock_prescale_set(clock_div_2);" så det faktiskt kör på 8 MHz. Källkoden visar timer 1 kan konfigureras för att använda en "division med 8" prescaler, så timern är aktiverad på 1 MHz. 1/1000000 sekunder är alltså 1 nanosekund och att är vad värdena fångas och lagras i.
Det finns flera 8 bit timers och 16-bitars timers i AT90USB1286. 8 bit timers kan lagra tid counter värden från 0 till 255, 16-bitars timers är 0 till 65535. Detta beror på att antalet möjliga diskreta nummer som ett visst antal bitar kan representera ges av 2 ^ n där n är antalet bitar, 2 ^ 8 = 256, 2 ^ 16 = 65536.
Vi aktiverar en overflow avbrott rutin på en timer, kan vi lagra en overflow räknare, som i princip utökar antalet bitar så vi kan hålla reda på tid som inte kan lagras i 8 bitar.