Sziasztok, nem tudom jó helyre írok-e de nem találtam jobb témát. Segítséget szeretnék kérni egy Ardunio Uno programozásában ugye ebben 328 as ic van és ilyet még nem programoztam. CTC időzítést szeretnék készíteni amit a Timer0 van szeretnék megoldani hogy minden 0,001s ban az isr vektorban megadott kód lefusson. De valamiért kb. 20 másodper után elcsúszik és nem jöttem rá sehogy se hogy miért. pedig szinte mindenhol ugyan ezt a kódot láttam a neten. Kérlek nézzetek rá nekem, ha van egy kis időtök. Ennél az ic nél azt, hogy amikor túlcsordul a beállított 250 nél akkor újrakezdjen számolni az aútómatikus vagy be kell állítani csak mert nem találtam meg hogyan kellene, picit fura nekem hogy van A-B regiszter kölün a timer0 hoz. Köszönöm.
[code]
#include <avr/io.h>
#include <avr/interrupt.h>
int ledPin = 12;
volatile int a = 0;
volatile int b = 0;
volatile int c = 1;
int inPin = A1;
int volatile flag = 0;
void setup()
{
pinMode(inPin, INPUT);
pinMode(ledPin, OUTPUT);
timer();
}
void loop()
{
b = digitalRead(inPin);
if (b == 0) flag = 1;
digitalWrite(ledPin, c);
}
void timer() {
cli(); // letiltom a megszakításokat
TCCR0A = 0; // nullázom
TCCR0B = 0;
TCCR0A = (1 << WGM01); // CTC mód
OCR0A = 250; // eddig számol
TIMSK0 = (1 << OCIE0A); //isr vektor eng
TCCR0B = (1 << CS00) // ez 64as osztás
| (1 << CS01)
| (0 << CS02);
sei(); //globális megszakitás eng
}
ISR (TIMER0_COMPA_vect) // ez minden 0.001s enként lefut
{
if (flag == 1) { // ezt csak azért tettem bele hogy gombal tudjam indítani hogy tudjam figyelni az órámon a másodperceket.
if (a <= 999) {
a++;
}
else {
a = 0;
c = !c; //ezzel csak annyit szeretnék hogy 1-1 mp ig világítson és aludjon el a led
}
}
}
USB analizátorral megmértem a megszakítás pontosságát és hát nem volt pontos. A szoftveres osztást ami 1000 volt 995 re kellett levenni így már tökéletesen pontos.