TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: D1to en 14 de Febrero de 2017, 00:33:07

Título: Timer para tiempos largos?
Publicado por: D1to en 14 de Febrero de 2017, 00:33:07
Buenas noches a todos, tengo una pequeña consulta, me gustaría implementar un timer que pueda controlar tiempos desde min hasta horas, por ejemplo 20 min o 4 horas, ¿alguna idea o referencia donde pueda encontrar información? uso mikroC Pro
Título: Re:Timer para tiempos largos?
Publicado por: Pinolillo16 en 14 de Febrero de 2017, 04:49:02
Que tal, que PIC utilizas? La mayoria de micros tienen timers de 16 bits por muy grandes, realmente no encuentro sentido de porque usar un timer para tiempos largos si ya el mismo compilador contiene librerias de delay basadas en los timers con base de retardos en ms o us, que se pueden ciclar en tiempos anidados a una función for.

Saludos
Título: Re:Timer para tiempos largos?
Publicado por: QIQE en 14 de Febrero de 2017, 10:26:15
Yo ajustaría un tóner digamos a 10 segundos, y en cada desborde incrementaría una variable cuando la incrementas 6 veces ya tienes un minuto en ese momento incrementaría una variable minutos y compararía los minutos con los.minutos a los que tienes que temporizar y al llegar pondría a cero todo, todo esto dentro de la interrupción ya que es un código pequeño
Título: Re:Timer para tiempos largos?
Publicado por: manwenwe en 14 de Febrero de 2017, 11:17:43
Si tienes RTC mejor utilízalo antes que un timer: pones una interrupción y ya llegará la hora del despertador... :P. Saludos!
Título: Re:Timer para tiempos largos?
Publicado por: RedPic en 14 de Febrero de 2017, 11:22:14
Si tienes RTC mejor utilízalo antes que un timer: pones una interrupción y ya llegará la hora del despertador... :P. Saludos!

Eso mismo iba a proponer yo, para tiempos largos lo mejor un RTC.
Título: Re:Timer para tiempos largos?
Publicado por: manwenwe en 14 de Febrero de 2017, 17:38:28
Lo malo del RTC en los PICs es que no tiene un pin de alimentación dedicado (que yo sepa) como en otro micros (p.e.: Kinetis): por lo demás es muy cómo para alarmas (tiempos largos) como dice RedPic.
Título: Re:Timer para tiempos largos?
Publicado por: D1to en 15 de Febrero de 2017, 01:10:40
Gracias por sus respuestas, no se q es un rtc, investigare en internet a ver como lo aplico, si no aplicare lo de incrementar variables. Uso 16f877a y mikroc pro. Lo del tiempo es algo q me planteé a modo de practica, controlar un motor q funcione 2 horas luego se apague y arranque otro, un arranque alternado. Es posible? O requiero de algun componente externo?
Título: Re:Timer para tiempos largos?
Publicado por: manwenwe en 15 de Febrero de 2017, 06:15:09
El RTC al que no referimos es un modulo del PIC igual que otros como timer, pwm, adc, etc. Las siglas quieren decir "reloj de tiempo real"; en esencia es un contador de segundos con hora, calendario y alarmas que recibe como entrada un reloj externo de 32.768khz o uno interno de 32Khz (en este caso tienes que ir ajustando el desfase "a mano). El PIC que comentas no tiene RTC. También hay RTCs externos.

Si no tienes RTC hazlo con un timer: era sólo una sugerencia.

Saludos!
Título: Re:Timer para tiempos largos?
Publicado por: D1to en 15 de Febrero de 2017, 10:24:28
 :D  :D muchas gracias por su apoyo amigos a modo de prctica usare lo de la interrupcion y variables y mas adelante trabajo con un rtc.
Título: Re:Timer para tiempos largos?
Publicado por: Picuino en 15 de Febrero de 2017, 13:32:48
Una forma estándar de hacerlo es programar una interrupción cada milisegundo y contar los milisegundos con una variable entero largo (32bits).

static volatile unsigned long millis;
 
Puedes temporizar desde 1 milisegundo hasta 50 días. Las variables unsigned long son estandar en c y no dan problemas.
Los desbordamientos tampoco dan problemas, restas del tiempo mayor, el menor y el resultado siempre es un positivo con el tiempo que falta para llegar.

Hay que dejar un margen. Si falta mucho tiempo, ha habido desbordamiento y es que el tiempo ya se ha pasado. Tu puedes definir cuánto tiempo es eso. Por ejemplo con 1 día tendrás más que suficiente para comprobar si el tiempo se ha pasado y te quedarán 49 días para temporizar.

Un saludo.
Título: Re:Timer para tiempos largos?
Publicado por: Picuino en 15 de Febrero de 2017, 13:46:54
Para comenzar, te recomiendo que programes con Arduino.
Tienes muchas librerías, ayudas y ejemplos.

Esto haría lo que tu quieres (programado en 5-10 minutos):

Código: C
  1. const unsigned long minutos = 60*1000;
  2. const unsigned long horas = 3600*1000;
  3. const int pin_motor1 = 2;
  4. const int pin_motor2 = 3;
  5. unsigned long tiempo;
  6. int marcha_motor;
  7.  
  8. void setup() {
  9.   pinMode(pin_motor1, OUTPUT);
  10.   pinMode(pin_motor2, OUTPUT);
  11.   tiempo = millis();
  12.   marcha_motor = 1;
  13. }
  14.  
  15. void loop() {
  16.   if (tiempo < millis()) {
  17.     tiempo = tiempo + 2 * horas + 30 * minutos;
  18.     if (marcha_motor == 1) {
  19.        digitalWrite(pin_motor1, HIGH);
  20.        digitalWrite(pin_motor2, LOW);
  21.        marcha_motor = 2;
  22.     }
  23.     else {
  24.        digitalWrite(pin_motor1, LOW);
  25.        digitalWrite(pin_motor2, HIGH);
  26.        marcha_motor = 1;  
  27.     }
  28.   }
  29.  
  30.   // Otras instrucciones aquí
  31.  
  32. }

Un saludo
Título: Re:Timer para tiempos largos?
Publicado por: Picuino en 15 de Febrero de 2017, 13:57:18
Manual Arduino. Milisegundos:
https://www.arduino.cc/en/Reference/Millis

Tienes arduinos por menos de 3 Euros:
http://www.ebay.es/itm/Micro-Mini-USB-Nano-V3-0-ATmega328P-5V-16M-Arduino-Y1-Modulo-Junta-Controlador-/252195398867?hash=item3ab80464d3:g:0ywAAOSwajVUM0ED

Hay placas nano que cuestan menos de 2 euros con transporte incluído:
http://www.ebay.es/itm/Pro-3-3V-8M-Mini-atmega328-Replace-ATmega128-Arduino-Compatible-Nano-Redesign-/122158909212?hash=item1c713d071c:g:YnAAAOSwzaJX7hlE


El compilador es GCC (opensource, libre, gratuíto y muy potente) que compila C++.

Con Arduino también puedes controlar los detalles de bajo nivel del micro y utilizar un entorno de desarrollo profesional como Eclipse.

Un saludo.
Título: Re:Timer para tiempos largos?
Publicado por: manwenwe en 15 de Febrero de 2017, 16:20:24
Macho!!! 2-3€ que barbaridad  :D :D :D No hay quien compita con eso... :oops:
Título: Re:Timer para tiempos largos?
Publicado por: Picuino en 15 de Febrero de 2017, 17:21:55
Por eso Arduino está subiendo como un cohete. No hay color.
Lo nuestro con los PIC ya empieza a ser masoquismo (y lo dice un fan de los PIC).

Un saludo.
Título: Re:Timer para tiempos largos?
Publicado por: manwenwe en 15 de Febrero de 2017, 17:25:57
Bueno, yo me quedo con PIC o si eso Kinetis  :D :D :D
Título: Re:Timer para tiempos largos?
Publicado por: Picuino en 15 de Febrero de 2017, 17:29:46
Los 32 bits son otro mundo. Ahí está claro que la opción es ARM.
Por lo que tengo entendido Kinetis es muy bueno en periféricos, que es lo que también hace tan buenos a los PIC.

Pero si quieres programar en 8 bits con conocimientos justitos, creo que lo mejor es Arduino. Incluso para los que tienen más conocimientos.

Saludos.
Título: Re:Timer para tiempos largos?
Publicado por: manwenwe en 15 de Febrero de 2017, 17:37:07
Mira pues yo lo veo justo al revés. Para 8bit Microchip es bueno por la cantidad de opciones, la escalabilidad y la robustez. Para 32bit Kinetis y compañia son mejores calidad/precio y además tienen herramientas de desarrollo mucho mejores. Aún así yo uso PIC32MZ por pereza :P.

Solo mi opinión....
Título: Re:Timer para tiempos largos?
Publicado por: Picuino en 15 de Febrero de 2017, 18:26:52
Cada uno maneja lo que conoce mejor, eso nos pasa a todos.

En este hilo D1to quiere temporizar horas y no sabe cómo, ni conocía los RTC.

Los periféricos, timers, memoria, velocidad, etc no importan para nada en este caso.
Las librerías sencillas para RTC, herramientas gratuítas de programación, soporte de usuario y programas de ejemplo, la sencillez de programación o las herramientas hardware baratas y sencillas de encontrar son lo más importante y en eso Arduino gana por goleada.

Un saludo.
Título: Re:Timer para tiempos largos?
Publicado por: Picuino en 15 de Febrero de 2017, 18:36:43
Un ejemplo de lo mismo con una librería de multitarea cooperativa que estoy probando:

Código: C
  1. #include <SCoop.h>
  2.  
  3. const unsigned long minutos = 60*1000;
  4. const unsigned long horas = 3600*1000;
  5.  
  6. void setup() {
  7.   pinMode(2, OUTPUT);
  8.   pinMode(3, OUTPUT);
  9.   mySCoop.start();
  10. }
  11.  
  12. void loop() {
  13.   yield();
  14. }
  15.  
  16. defineTask(scoopTask1)
  17. void scoopTask1::setup() {
  18. }
  19. void scoopTask1::loop() {
  20.   digitalWrite(2, HIGH);
  21.   digitalWrite(3, LOW);
  22.   sleep(2*horas);
  23.   digitalWrite(2, LOW);
  24.   digitalWrite(3, HIGH);
  25.   sleep(2*horas);
  26. }

Este ejemplo concreto lo he programado con 7 bloques en ardublock y luego he añadido las dos constantes en el código.
Es muy difícil hacerlo más sencillo.

Un saludo.
Título: Re:Timer para tiempos largos?
Publicado por: D1to en 15 de Febrero de 2017, 22:36:33
Muchas gracias una vez mas por todo su apoyo, esto de ponerme a hacer pequeños proyectos a modo de pasatiempo y practica, y ustedes ayudandome con cada tropiezo, me ha ayudado  a crecer. Ya mismo estoy trabajando en el codigo   :D  :D  :D