AnsweredAssumed Answered

RTC Real time clok (in spanish)

Question asked by g.antonio on Jul 24, 2011
hello
My sample
RTC with internal timer stm8s-discovery
Not very precission. +- 2sec each 14h

main:


/************************************************************************/
/* La variable global "hora" se incrementa cada segundo por interrupciones y estamos llamando constantemente a est funcion en el main */
/************************************************************************/
void pinta_reloj(){

long seg=0;
long min=0;
char hor=0;

seg=hora;
while(seg>59){ min++; seg=seg-60;}
while(min>59){ hor++; min=min-60;}

  if(hor>23){
      hor=1;       
        if(dia < DOMINGO){
            dia++;
            hora=0;
            }else{               
                hora=0; // Al llegar hora a 86400 seg (un dia) debe ponerse a cero e incrementarse el dia de la semana.
                dia=LUNES;
                }       
  }

  /* Pintamos horas */
    if(hor>19){LCD_CHR('2'); hor=hor-20;} else{
     if(hor>9) {LCD_CHR('1'); hor=hor-10;} else{LCD_CHR('0');}
   }
    LCD_CHR(hor+0x30);

 LCD_CHR(':');  /* Los dos puntos */
   
  /* minutos */
  if(min>9)  {LCD_CHR((min/10)+0x30); while(min>9) min=min-10;}
    else LCD_CHR('0');
   LCD_CHR(min+0x30);   /* si son menos de 9 min los pintamos sin mas */

  LCD_CHR('.');
   
  /* segundos */
  if(seg>9)  {LCD_CHR((seg/10)+0x30); while(seg>9) seg=seg-10;}
    else LCD_CHR('0');
   LCD_CHR(seg+0x30);   /* si son menos de 9 min los pintamos sin mas */

    LCD_CHR(' ');

    switch(dia){
       
        case LUNES:
         LCD_STR("L");
        break;
       
        case MARTES:
         LCD_STR("M");
        break;
               
        case MIERCOLES:
         LCD_STR("X");
        break;
       
        case JUEVES:
         LCD_STR("J");
        break;
       
        case VIERNES:
         LCD_STR("V");
        break;
       
        case SABADO:
         LCD_STR("S");
        break;
       
        case DOMINGO:
         LCD_STR("D");
        break;   
               
    }


}



-----------------------------------------

stm8_interrupt_vector.c:


/* BASIC INTERRUPT VECTOR TABLE FOR STM8S devices
 * Copyright (c) 2007 STMicroelectronics
 */

#include "STM8_TSL_RC_API.h"
#include "STM8_TSL_RC_TimerDriver.h"

extern long hora;
int xx;

typedef void @far (*interrupt_handler_t)(void);


struct interrupt_vector
{
  unsigned char interrupt_instruction;
  interrupt_handler_t interrupt_handler;
};


@far @interrupt void TSL_Timer_ISR_prueba (void)
{
  /* in order to detect unexpected events during development,
     it is recommended to set a breakpoint on the following instruction
  */
    if(xx++>15595){  // Cuanto menor sea, mas adelanta.   // 15616 atrasa .1seg -- 15610 atrasa unos .04 -/- 15606 atrasa .05  --  15600 atrasa .02seg*min --  15564 adelanta unos .1seg*min   --  15597 atrasa 0.0066seg (4seg*10h)  -- 15596 atrasa .0031 (1.5seg en 8 horas) --  15595 adelanta .002 (2seg en 14h)
    // Parece que el calor hace que adelante
     hora++;
     xx=0;
  }
    TIM4_ClearITPendingBit(TIM4_IT_UPDATE);
   
  return;
}



@far @interrupt void NonHandledInterrupt (void)
{
  /* in order to detect unexpected events during development,
     it is recommended to set a breakpoint on the following instruction
  */
  return;
}






extern void _stext();     /* startup routine */
void main(void);

struct interrupt_vector const _vectab[] =
  {
    {
      0x82, (interrupt_handler_t)_stext
    }
    , /* reset */
    //{0x82, (interrupt_handler_t)main}, /* reset */
    {0x82, NonHandledInterrupt}, /* trap */
    {0x82, NonHandledInterrupt}, /* irq0 - tli */
    {0x82, NonHandledInterrupt}, /* irq1 - awu */
    {0x82, NonHandledInterrupt}, /* irq2 - clk */
    {0x82, NonHandledInterrupt}, /* irq3 - exti0 */
    {0x82, NonHandledInterrupt}, /* irq4 - exti1 */
    {0x82, NonHandledInterrupt}, /* irq5 - exti2 */
    {0x82, NonHandledInterrupt}, /* irq6 - exti3 */
    {0x82, NonHandledInterrupt}, /* irq7 - exti4 */
    {0x82, NonHandledInterrupt}, /* irq8 - can rx */
    {0x82, NonHandledInterrupt}, /* irq9 - can tx */
    {0x82, NonHandledInterrupt}, /* irq10 - spi*/
    {0x82, NonHandledInterrupt}, /* irq11 - tim1 */
    {0x82, NonHandledInterrupt}, /* irq12 - tim1 */
    {0x82, NonHandledInterrupt}, /* irq13 - tim2 */
    {0x82, NonHandledInterrupt}, /* irq14 - tim2 */
    {0x82, NonHandledInterrupt}, /* irq15 - tim3 */
    {0x82, NonHandledInterrupt}, /* irq16 - tim3 */
    {0x82, NonHandledInterrupt}, /* irq17 - uart1 */
    {0x82, NonHandledInterrupt}, /* irq18 - uart1 */
    {0x82, NonHandledInterrupt}, /* irq19 - i2c */
    {0x82, NonHandledInterrupt}, /* irq20 - uart2/3 */
    {0x82, NonHandledInterrupt}, /* irq21 - uart2/3 */
    {0x82, NonHandledInterrupt}, /* irq22 - adc */
    {0x82, (interrupt_handler_t)TSL_Timer_ISR_prueba}, /* irq23 - tim4 */
    {0x82, NonHandledInterrupt}, /* irq24 - flash */
    {0x82, NonHandledInterrupt}, /* irq25 - reserved */
    {0x82, NonHandledInterrupt}, /* irq26 - reserved */
    {0x82, NonHandledInterrupt}, /* irq27 - reserved */
    {0x82, NonHandledInterrupt}, /* irq28 - reserved */
    {0x82, NonHandledInterrupt}  /* irq29 - reserved */
  };






Outcomes