Sida 1 av 1

AVR - Realtidsklocka till lcd på färre klockcykler?

Postat: 13 mars 2012, 09:41:16
av Supersnigel
Har i nuläget en realtidsklocka med 1s interrupt där tiden skrivs ut till en lcd på formen hh:mm:ss
Klipper jag bort det övriga är koden något i stil med:

Kod: Markera allt

#include "include/lcd.h"
#include "include/lcd.c"

ISR (TIMER2_OVF_vect)
{
        time_increase_second();
}

void time_increase_second()
{
        time.second++;
        if (time.second > 59)
        {
                time.second = 0;
                lcd_gotoxy(12,0);       
                lcd_puts("00");
                time_increase_minute();
        }
        else if (time.second < 10)
        {
                itoa(time.second , buffer, 10);
                lcd_gotoxy(12,0);       
                lcd_puts("0");
                lcd_gotoxy(13,0);       
                lcd_puts(buffer);
        }
        else
        {
                itoa(time.second , buffer, 10);
                lcd_gotoxy(12,0);       
                lcd_puts(buffer);
        }
}

På samma sätt sen för minuter och timmar.
Alla de olika skrivningarna till lcd:n tar ganska många klockcykler i anspråk och känns klumpigt, någon som har tips på hur man kan lösa det snyggare?

Re: AVR - Realtidsklocka till lcd på färre klockcykler?

Postat: 13 mars 2012, 09:50:11
av snigelen
Hej Supersnigel :)

Jag skulle ha gjort typ

Kod: Markera allt

volatile uint8_t new_second;

ISR (TIMER2_OVF_vect)
{
   new_second = 1;
}

main()
{
   ...

   if (new_second) {
      new_second = 0;
      time_increase_second();
      ...
}
Men då får man ju organisera sin main så att man inte fastnar med något i mer än en sekund. Eventullt kan man uppdatera timmar, minuter och sekunder i avbrottsutinen, men låt main sköta skrivningen till displayen.

Re: AVR - Realtidsklocka till lcd på färre klockcykler?

Postat: 13 mars 2012, 10:23:38
av jesse
eller så

Kod: Markera allt

volatile uint8_t new_second;

ISR (TIMER2_OVF_vect)
{
   new_second ++1;
}

main()
{
   ...

   if (new_second) {
      new_second--;
      time_increase_second();
      ...
}
Så kan det dröja upp till 255 sekunder innan det blir tokfel. :)
Oftast inte så nödvändigt när man bara ökar en gång per sekund, men räknar man t.ex. millisekunder så kan det vara mindre marginaler.

Re: AVR - Realtidsklocka till lcd på färre klockcykler?

Postat: 13 mars 2012, 10:30:29
av Icecap
Att gå till en viss position på ett LCD kostar cyklar. Varför inte bara skriva rätt värde i en buffer ("hh:mm:ss") och klämma den ut i ett svep?
Om bara sekunder ändras skriver du för tillfället:
1: Goto LCD-position
2: Skriv

Och precis som snigelen skriver: uppdatera inte i en ISR! Uppdatera i main-loop!

Om vi antar att tiden buffras som ovannämnda format kan en inkrement se ut som:

Kod: Markera allt

volatile char Update;
char Time[8];

ISR (TIMER2_OVF_vect)
  {
  Update++;
  }

I main loop:
if(Update)
  {
  if(++Time[7] > '9')
    {
    Time[7] = '0';
    if(++Time[6] > '5')
      {
      Time[6] = '0';
      if(++Time[4] > '9')
        {
        Time[4] = '0';
        if(++Time[3] > '5')
          {
          Time[3] = '0';
          if((++Time[1] > '9')
            {
            Time[1] = '0';
            Time[0]++;
            if((Time[0] >= '2') && (Time[1] >= '4'))
              {
              Time[0] = '0';
              Time[1] = '0';
              }
            }
          }
        }
      }
    }
  Update--;
  lcd_gotoxy(5,0);
  lcd_puts(Time);
  }
Vid att räkna upp/ner Update kan rutinen missa ett par gångar utan att det händer annat än att utläsningen blir fördröjt.
Kom ihåg att initiera klockan vid att skriva "00:00:00" till Time.

EDIT: Oj, ser att jag har tagit tid på mig att skriva...

Re: AVR - Realtidsklocka till lcd på färre klockcykler?

Postat: 13 mars 2012, 10:34:40
av labmaster
Eller så lägger du tiden i en global variabel och uppdaterar den från interuptrutinen. När du uppdaterar tiden på LCD:n plockar du tiden från den globala variabeln.

Edit: Jag det var ju det Icecap skrev.

Re: AVR - Realtidsklocka till lcd på färre klockcykler?

Postat: 13 mars 2012, 11:47:32
av Nerre
Problemet blir väl om det är uppdateringen av tiden som skall prioriteras, d.v.s. att man inte accepterar "hack" i visningen.

Re: AVR - Realtidsklocka till lcd på färre klockcykler?

Postat: 13 mars 2012, 13:16:40
av Supersnigel
Tackar för tipsen, ska testa icecaps förslag lite senare ikväll. Borde spara en massa cykler att skriva en rad i taget istället för enskilda tecken.