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

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Supersnigel
Inlägg: 86
Blev medlem: 4 november 2011, 13:11:52
Ort: Göteborg
Kontakt:

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

Inlägg 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?
snigelen
Inlägg: 815
Blev medlem: 8 maj 2009, 11:02:14
Ort: Lund

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

Inlägg 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.
Användarvisningsbild
jesse
Inlägg: 9234
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

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

Inlägg 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.
Användarvisningsbild
Icecap
Inlägg: 26139
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

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

Inlägg 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...
Senast redigerad av Icecap 13 mars 2012, 10:42:30, redigerad totalt 1 gång.
labmaster
Inlägg: 2919
Blev medlem: 5 april 2011, 01:10:25

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

Inlägg 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.
Nerre
Inlägg: 26700
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

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

Inlägg 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.
Supersnigel
Inlägg: 86
Blev medlem: 4 november 2011, 13:11:52
Ort: Göteborg
Kontakt:

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

Inlägg 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.
Skriv svar