1

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.

    }

}
1

1 Answer 1

4

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.

10
  • 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
    Dec 14, 2018 at 14:58
  • I will not write it for you. It's already written in wiring.c 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
    Dec 14, 2018 at 15:28
  • 3
    You 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? 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
    Dec 14, 2018 at 17:35

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.