This code It works in atmel studio.But this millis function is starting to run 31-34 miliseconds behind of arduino millis fuction.Why?I am adding picture.
Picture: https://imageshack.com/a/img922/3060/umtNJp.jpg
Update 2
#define F_CPU 8000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#define clockCyclesToMicroseconds(a) ( ((a) * 1000L) / (F_CPU / 1000L) )
#define MICROSECONDS_PER_TIMER0_OVERFLOW (clockCyclesToMicroseconds(64 * 256))
#define MILLIS_INC (MICROSECONDS_PER_TIMER0_OVERFLOW / 1000)
// the fractional number of milliseconds per timer0 overflow. we shift right
// by three to fit these numbers into a byte. (for the clock speeds we care
// about - 8 and 16 MHz - this doesn't lose precision.)
#define FRACT_INC ((MICROSECONDS_PER_TIMER0_OVERFLOW % 1000) >> 3)
#define FRACT_MAX (1000 >> 3)
volatile unsigned long timer0_overflow_count = 0;
volatile unsigned long timer0_millis = 0;
static unsigned char timer0_fract = 0;
volatile uint8_t count;
ISR (TIMER0_OVF_vect)
{
unsigned long m = timer0_millis;
unsigned char f = timer0_fract;
m += MILLIS_INC;
f += FRACT_INC;
if (f >= FRACT_MAX) {
f -= FRACT_MAX;
m += 1;
}
timer0_fract = f;
timer0_millis = m;
timer0_overflow_count++;
}
unsigned long millis()
{
unsigned long m;
uint8_t oldSREG = SREG;
// disable interrupts while we read timer0_millis or we might get an
// inconsistent value (e.g. in the middle of a write to timer0_millis)
cli();
m = timer0_millis;
SREG = oldSREG;
return m;
}
int main (void)
{
DDRB |= (1<<0);
TCNT0 = 0;
count = 0;
TCCR0B |= (0<<CS02) | (1<<CS01) | (1<<CS00); // PRESCALER 64
TIMSK0 = (1<<TOIE0);
sei();
while(1)
{
millis() to uart.
}
}
-
3cross post stackoverflow.com/questions/53780848/…Juraj– Juraj ♦2018年12月14日 14:42:28 +00:00Commented Dec 14, 2018 at 14:42
1 Answer 1
The millis()
function is defined in the Arduino Core for AVR architecture, specifically the wiring.c
file.
You can see that timer0 is setup with various parameters for prescaling and interrupt triggering and handling of timer0 overflow such that a variable called timer0_millis
contains the number of milliseconds since the sketch started.
The millis()
function basically returns that timer0_millis
value.
If you wish to make use of the function in AVR Studio, then you would need to include the same kind of timer0 setup and interrupt/overflow handling that the Arduino core does.
-
I have found example code,but isn't same.Can you write equivalent of code in above?for being example and my learning.Of course,If is this possible?Thanks.alex jla– alex jla2018年12月14日 14:58:20 +00:00Commented Dec 14, 2018 at 14:58
-
I will not write it for you. It's already written in wiring.cjose can u c– jose can u c2018年12月14日 15:00:22 +00:00Commented Dec 14, 2018 at 15:00
-
oh sorry,I hadn't seen wiring.c file.I have added to my project.But I am not using timer0_millis.Error: 'timer0_millis' undeclared (first use in this function). What can I add wiring.c to my project?alex jla– alex jla2018年12月14日 15:28:53 +00:00Commented Dec 14, 2018 at 15:28
-
3You will need to read all of wiring.c, understand it, and then implement it in your own project. Arduino makes very simple the things which are complex on "pain" AVR programming. What is the reason you choose to use AVR Studio?jose can u c– jose can u c2018年12月14日 15:33:27 +00:00Commented Dec 14, 2018 at 15:33
-
Because I am learning atmel studio.But now,I need to this function.No need to make it so difficult.Just,I want to counter like millis() which has forward direction.I need solution.alex jla– alex jla2018年12月14日 17:35:04 +00:00Commented Dec 14, 2018 at 17:35
Explore related questions
See similar questions with these tags.