Pagaliau prisikasiau prie taimerio ir pertraukimo pagal taimerį. Tai bene dažniausiai naudoja taimerio funkcija- gi tereikia kas kažkiek laiko apsiklausti visokios periferijas ir apdoroti rezultatus. O kitą laiką kontroleriukas miega ir taupo elektrą. Šiame pavyzdyje MCU elektros dar netaupo, tačiau taimeris veikia.
Programa sulipdyta iš interneto lobių. Tik kiek pakeistos kai kurios vietos, kad man būtų suprantamiau.
Čia matosi, kaip softas bando organizuoti 1ms (1000Hz) pertraukimą. Pertraukimo metu invertuojama viena koja ir ją galima pamatuoti su oscilografu. Nežinau kas kaltas, bet gavosi 984.4μs (1016Hz). Kas kaltas dar nežinau- aš nuskaitau vidinį MCU dažnį ir perskaičiuoju automatiškai dalinimo koeficientus. Vartotojui-programuotojui tereikia tik įvesti norimo intervalo dažnį hercais.
Source kodas pasidarė dar labiau modulinis- pertraukimas pagal taimerį faile “timeris.c”, o PIO kojų pertraukimą perkėliau į “pioint.c”. Taip lengviau man bus “klijuoti” būsimas programas.
Viskas kompiliuojasi per GCC toolchainą Yagarto, make failas dar sugeba per J-Linką suprograminti į mikroschemą.
ARM SAM7S taimerio pertraukimo source code ir hex failas, hexas sukompiliuotas Atmel AT91SAM7S256AU serijos čipui.
Dar galima pastebėti, kad daug kas persikraustė į pertraukimus.
Programinis uzlaikymo formavimas turi ivertinti papildomus uzlaikymus pasiruosimui bei galimus aparatiniu pertraukciu apdorojimo inestus uzdelsimus. Jei reikia tikslumo – tik aparatinis skaitliukas.
Nu tai gi per greitai veikia. 🙂 Jei vėluotu, tai suprasčiau, kad kojos perjungimas kažkiek suėda laiko.
Dabar spėjimas toks- procesoriaus dažnis biški plaukioja, ir aš jaučiu neteisingą pasirinkau registrą- gal ten koks vidinio PLL padalintas dažnis. Tas dažnis (naudojamas taimerio daliklių skaičiavimui) keičiasi kartais nuo karto. Nedaug, bet keičiasi.
Be to, pagal logika. Jei vėluoja įjungti koją, tai ir vėluos išjungti. Aš gi matuoju atstuma tarp dviejų “vėluojančių” signalų. Turi rodyti pertraukimo dažnį. Kadangi pertraukimas visiskai primityvus, tai viskas padaroma per kokią viena mikrosekundę- neturi stabdyti.
o kazkur esu skaites kad uztrunkama nevienodai laiko koju junginejime. Berods ijungimui atlikti reik 2 o isjungimui 1 procesoriaus takto. Bet tai cia prie 40MHz nelabai jaustusi tas skirtumas…
Oscilogramoje matosi tik du pertraukimai, gal laiko tarpas tarp tu pertraukimu, kai koja yra nustatoma i HIGH ir bus lygiai 2000ms arba tarp dvieju isjungimu -2000ms :)?
Rankinių metodu reguliuojant taimerio parametrus, galima prisiderinti pertraukimo dažnį. Kažkas paprasčiausiai negerai su procesoriaus dažnio išmatavimu.
Jei būtų kokia precizika, tikriausiai reikėtu kalibruoti kaip nors tuos taktinius dažnius.
Tačiau šis procesorius yra toks “semi hardware” palyginus su AVR šeima kur viskas griežtai pririšta ir galima pasiskaičiuoti vieno “stepo” tikslumu visus parametrus.