|
| ayuda como ejecutar dos rutinas simultaneamente en pic 16f877a | |
| | Autor | Mensaje |
---|
emely jose Principiante
Mensajes : 2 Fecha de inscripción : 20/10/2014 Edad : 37
| Tema: ayuda como ejecutar dos rutinas simultaneamente en pic 16f877a Lun Oct 20, 2014 8:11 pm | |
| Les cuento.... hace un tiempo realice un controlador de temperatura para una incubadora de huevos de gallinas y si que me funciona muy bien hasta incluso he llegado a sacar pollitos. el problema que tengo es que al software que realice le quiero anexar una rutina que me permita controlar el volteo automático cada 8:25 horas sin que esta rutina me interfiera en el trabajo del censado de la temperatura, esto seria como correr dos programas al mismo tiempo ó que trabaje en un modo de segundo plano algo asi me imagino yo, no se si estoy equivocado....
cabe mencionar que uso el Proton IDE
aca les dejo el codigo del programa a ver si me puedes dar una mano ya que soy nuevo en esta area.
'************************************************* *************** '* Name : control de temperatura.BAS * '* Author : [EMELY SUMOZA] * '* Notice : Copyright (c) 2014 [SMILLER c.a] * '* : All Rights Reserved * '* Date : 20/06/2014 * '* Version : 1.0 * '* Notes : * '* : * '************************************************* ***************
Device 16F877A ' Define LCD registers and bits Declare Xtal=4 TRISA=0 CMCON = 7 ; Set PORTA and PORTE to digital ;-------------------------------------------------------------------------------
Declare LCD_Type 0 ; definimos el tipo de lcd que se va a utilizar Declare LCD_DTPort PORTA ; Definimos puertos a emplear Declare LCD_DTPin PORTA.0 ; puertos que se usaran como línea de datos Declare LCD_RSPin PORTB.2 ; puerto que va funcionar como RESET Declare LCD_ENPin PORTB.1 ; Definimos el puerto que va a ENABLE en el LCD
;-------------------------------------------------------------------------------
DQ VAR PORTB.0 ; One-wire data pin count_per_c VAR Byte ; Count per degree C ;-------------------------------------------------------------------------------
temperature VAR Word x VAR Byte x3 var Float Tempbaj VAR Float tempalt VAR Float ;------------------------------------------------------------ rF VAR PORTB.7 rC VAR PORTB.6 led VAR PORTA.4 enter VAR PORTB.5 bsubir VAR PORTB.4 bbajar VAR PORTB.3 ;------------------------------------------------------------------------------- DIn VAR Byte DIn = 0 x1 var Float x1 = 28.2 x2 var Float x2 = 28
EWrite Din,[x1] tempalt = ERead 0 EWrite Din,[X2] ;contenido inicial 0 de la EEPROM ;lee la EEPROM 0 y lo guarda en tempalt tempbaj = ERead 1 ;lee la EEPROM 1 y lo guarda en tempbaj ;------------------------------------------------------------------------------- Print $fe, 1,"BIENVENIDO" ;limpiar LCD y sacar texto Print $fe, $c1,"CARGANDO ." DelayMS 1500 Print $fe, 1,"BIENVENIDO " ;limpiar LCD y sacar texto Print $fe, $c1,"CARGANDO .." DelayMS 1000 Print $fe, 1,"BIENVENIDO" ;limpiar LCD y sacar texto Print $fe, $c1,"CARGANDO ...." DelayMS 1000 Print $fe, 1,"TEMPERATURA" ;limpiar LCD y sacar texto Print $fe, $c1,"CARGANDA " DelayMS 1000
;------------------------------------------------------------------------------- inicio: ;3 parpadeos del led que indica funciona For x =1 To 3 High led DelayMS 500 Low led DelayMS 300 Next ;------------------------------------------------------------------------------- mainloop: ;programa principal de censado de temperatura OWrite DQ, 1, [$CC, $44] ' inicia la convención de la temperatura High led DelayMS 100 Low led DelayMS 100
OWrite DQ, 1, [$CC, $BE] ' lee la temperatura ORead DQ, 0, [temperature.LowByte, temperature.HighByte] temperature = temperature */ 1600 x3=temperature/100 Print $fe, 1,"TEMPERATURA" Print $fe, $c1, Dec1 x3,06, 223,"C" ;----------------------------------------------------------------------- For x = 1 To 10 ;repetir 10 veces If enter =0 Then grabar1a
DelayMS 10 If X3 <= tempbaj Then calentar ;si X3 es <tempbaj ir a calentar If X3 >= tempalt Then enfriar ;si X3 es >tempALT ir a ENFRIAR
Low rC : Low rF ;apagar los 2 relés Next
GoTo mainloop ;continuar censando
calentar: High rC : Low rF GoTo mainloop
enfriar: High rF : Low rC GoTo mainloop
grabar1a: GoSub soltar
grabar1: Print $fe, 1, "Programar temp." Print $fe,$c0,"baja= ",Dec1 tempbaj ,223,"C" DelayMS 50 If bbajar=0 Then restar1 If bsubir=0 Then sumar1 If enter=0 Then grabarA GoTo grabar1
restar1: GoSub soltar ;programa antirrebote de tecla If tempbaj < 1 Then grabar1 tempbaj= tempbaj -0.1 GoTo grabar1
sumar1: GoSub soltar If tempbaj > 100 Then grabar1 tempbaj= tempbaj + 0.1 GoTo grabar1
;................................................. ................. grabarA: GoSub soltar EWrite 1,[x1] ;escribir en la dirección 0 de la EEPROM ;................................................. ..................
grabar2: Print $fe, 1, "Programar temp." Print $fe,$c0,"alta= ",Dec1 tempalt ,223,"C" DelayMS 100 If bbajar=0 Then restar2 If bsubir=0 Then sumar2 If enter=0 Then grabarB GoTo grabar2
restar2: GoSub soltar If tempalt < 5 Then grabar2 tempalt= tempalt -0.1 GoTo grabar2
sumar2: GoSub soltar If tempalt > 50 Then grabar2 tempalt= tempalt + 0.1 GoTo grabar2
;................................................. ............... grabarB: GoSub soltar EWrite 0,[x2];escribir en la dirección 1 de la EEPROM GoTo inicio ;................................................. ...............
soltar: ;programa antirrebote de tecla
High led: High PORTB.7 DelayMS 150 Low led
soltar2: If bbajar=0 Then soltar2 If bsubir=0 Then soltar2 If enter=0 Then soltar2 DelayMS 100 Return End | |
| | | zermeca Ingeniero
Mensajes : 3 Fecha de inscripción : 09/10/2014 Edad : 36
| Tema: Re: ayuda como ejecutar dos rutinas simultaneamente en pic 16f877a Jue Oct 30, 2014 3:44 am | |
| Lo más recomendable seria que utilizaras un reloj de tiempo real, por dar algún ejemplo el DS1307 es muy económico y fácil de usar es por comunicación I2C. Lo que se me ocurre de forma simple seria revisar cada 5 minutos la hora en el DS1307 (o cualquier otro reloj) y aplicar alguna operación modulo con el tiempo deseado y su respectivo condicional para activar la acción de volteo. el tiempo lo tendrías que calcular incrementando alguna variable cada cierta interrupción ocurrida con el Timer1 del PIC16F877A ya que es de 16 bits y puedes fácilmente incrementar una variable “Acumulador_de_tiempo” cada 100ms. No sé qué tan difícil sea trabajar interrupciones con el IDE que manejas pero por lo que observo parece usar lenguaje BASIC, solo manejo C y ASM en PIC. Espero que te ayude en algo mis vagas ideas…
Saludos! | |
| | | desencriptador SUB ADMINISTRADOR
Mensajes : 95 Fecha de inscripción : 05/05/2013 Edad : 70 Localización : Ciudadela, Provincia de Buenos Aires, República Argentina
| Tema: Re: ayuda como ejecutar dos rutinas simultaneamente en pic 16f877a Miér Nov 19, 2014 7:10 am | |
| - zermeca escribió:
- Lo más recomendable seria que utilizaras un reloj de tiempo real, por dar algún ejemplo el DS1307 es muy económico y fácil de usar es por comunicación I2C.
Lo que se me ocurre de forma simple seria revisar cada 5 minutos la hora en el DS1307 (o cualquier otro reloj) y aplicar alguna operación modulo con el tiempo deseado y su respectivo condicional para activar la acción de volteo. el tiempo lo tendrías que calcular incrementando alguna variable cada cierta interrupción ocurrida con el Timer1 del PIC16F877A ya que es de 16 bits y puedes fácilmente incrementar una variable “Acumulador_de_tiempo” cada 100ms. No sé qué tan difícil sea trabajar interrupciones con el IDE que manejas pero por lo que observo parece usar lenguaje BASIC, solo manejo C y ASM en PIC. Espero que te ayude en algo mis vagas ideas…
Saludos! Hace unos días, al leer esto, comencé a buscar, y había llegado a la misma conclusión, utilizar un reloj, o un temporizador para medir el intervalo, así que tus ideas no creo que sean tan vagas, un abrazo cordial. | |
| | | pepinho345 Principiante
Mensajes : 4 Fecha de inscripción : 06/07/2015 Edad : 46
| Tema: Re: ayuda como ejecutar dos rutinas simultaneamente en pic 16f877a Miér Jul 08, 2015 4:15 am | |
| un saludo de antemano. tope esta pajina en particular mirando distintosprogramas echos con el microbasic que me imagino que utilizas ese compilador y bueo e llamo la atencion la manera que programais bueno decorte que claro que podrias controlar muchos mas sensores y terminales de salida emporizados. lo unico que tienes aque acostumbrarte es a tener otro tipo dr progamacion un poco mas estructurada, pero que eso no esta mal tansolo es que se esta empezando. aun asi la incubadora no solo a detener el control de la temperatura sino tambiem de la humedad y algo para ventilar o mas bien que permita que corra un poco el aire renovandolo con aire d fuera (pongamos que los huevos transmiran por la cascara) y la humedad deviera ser de un 80x ciento si no estoy mal. sobre instalar un relog no le veo mucha lojica tansolo necesitar un pequeño tiempo girando un motor de 2 a 4segundos (no se a que velocidad gira) a intervalos de 2 a 4 horas. para eso podrias aprovecharte de tmr1 y crear un relog interno apartir del oscilador del pic que aunque tengas un marjen de error de 2 segundos ala hora no va a pasar nada- otra cosa que tienes es que el prgrama esta muy dedicado ala lectura analogica, realmente con 10 lecturas A/D por segundo de la temperatura ya es una lectura muy rapida para lo que necesitas. esto seria una practica chorras que hice por provar el conversor A/D de un 16f819 - Código:
-
' primera protoboard display hecha con el serial paralelo 74hc595 ' para mostrar el digito y el cd4017 contador selector de display ' ' '+++++++++++++ '+++---A---+++ '+++++++++++++ '++++++E++++++ '++++-----++++ '+++-+++++-+++ '++D-+++++-F++ '+++-++G++-+++ '++++-----++++ '+++-+++++-+++ '++C-+++++-H++ '+++-++B++-+++ '++++-----++++ '+++++++++++++ ' tiempo var word temp var word reposo var byte reducetiem var byte segundero var reducetiem.5 estado Var byte m1 var estado.bit0 m2 var estado.bit1 m3 var estado.bit2 m4 var estado.bit3 serial var byte Lbit var serial.bit0 Hbit var serial.bit7 segundos var byte marcador var byte temp1 var byte temp2 var byte temp3 var byte indica var byte luz var byte reten var byte infra var byte pulso var byte boton var byte digito var byte digitos var byte [4] display var byte [15] ' status=%00000000' option_reg=%00000011' configuracion de interruciones primarias intcon=%00000000' configuracion de estatado de interrucciones primarias pie1=%00000000' pir1=%00000010' pie2=%00000000' pir2=%00000000' pcon=%00000000' eecon1=%00000100' osctune=%00011111' osccon=%01110100' t1con=%00110100' t2con=%00011001' ccp1con=%00000000' SSPSTAT=%00000000' sspcon=%00000000' adcon0=%01011001' adcon1=%00000000' ' trisa=%11111 ' define los bit del puerto entrada o salida trisb=%00000000 porta=%11111 ' define los bit del puerto portb=%00000000 display[0]=%01000001 ' 0 display[1]=%01011111 ' 1 display[2]=%10001001 ' 2 display[3]=%00001101 ' 3 display[4]=%00010111 ' 4 display[5]=%00100101 ' 5 display[6]=%00100001 ' 6 display[7]=%01001111 ' 7 display[8]=%00000001 ' 8 display[9]=%00000111 ' 9 display[10]=%11111111 ' espacio blanco display[11]=%10111111 ' - display[12]=%11100001 ' C display[13]=%10011011 ' grado display[14]=%10100001 ' E marcador=%11111111 ' tiempo=0 estado=0 segundos=0 reducetiem=0 digito=4 tmr0=0 reposo=30 m1=1 ON INTERRUPT GOTO interrucciones
intcon=%10100000 ' inicia el descuento ' programa:
if pir1.6=1 then gosub descomponer2 ' la conversion A/D a concluido goto programa ' ' decompone los digitos a mostrar ' descomponer2: temp=ADRESh ' paso los 10bit altos de la conversion AD a temp digitos[3]=temp/1000 ' unicades de mil temp=temp//1000 digitos[2]=temp/100 ' centenas temp=temp//100 digitos[1]=temp/10 ' decenas digitos[0]=temp//10 ' unidad pir1.6=0 ' borra la marca de conversion A/D acabada q aprovecho para desconponer return ' ' decompone los digitos a mostrar ' descomponer: temp=tiempo/60 ' descompongo horas digitos[3]=temp/10 ' decenas de horas digitos[2]=temp//10 ' unidades de hora temp=tiempo//60 ' descompongo minutos digitos[1]=temp/10 ' decenas de minuto digitos[0]=temp//10 ' unidad de minuto marcador.4=0 ' borro marca desconponer return ' ' ' control de interrucciones ' ' mostrar digitos pantalla display serial ' 74hc595 cambio digito 4017 ' DISABLE interrucciones: ' ' control del modulo display ' if intcon.2=1 then ' interruccion tmr0 tmr0=0 digito=digito+1 if digito>4 then ' termino un barido del display portb.4=1 ' activa reset 4017 digito=0 endif ' if digito=4 then serial=marcador ' ultimo display marcas else serial=display[digitos[digito]] ' digitos display endif ' portb.6=0 ' arma el 74hc595 y 4017 for temp1=0 to 7 portb.5=0 ' clk 74hc595 portb.7=Hbit ' data bit serial portb.5=1 ' clk 74hc595 serial=serial<<1 ' desplazamiento byte y estraer bit para serial next temp1 portb.6=1 ' dispara el byte 74hc595 y 4017 incrementa columna portb.4=0 ' desactiva reset 4017 ' reducetiem=reducetiem-1 if reducetiem=0 then ' reducco la lectura analogina 1;40 tmr0 reducetiem=40 ' reducimos la lectura A/D adcon0.2=1 ' actuva una conversion A/D endif intcon.2=0 ' borro marca interrucion tmr0 endif ' ' ' salto: resume enable es algo improvisado. pongamos que es de un circuito que ice con una pantalla display mitica de dcd y bueno la ice con esos materiales por tenerlos amano sino envez del 4017 uviera usado un multiplexor o un integrado para segmentos display que es mas sencillo o mejor dicho, bi tengo que tener al pic corriendo digito a digito en este caso use la interruccion tmr0 y activo la entrada A/D cada 40 veces que entro o 40 digitos (por un decir) cuando usas la interrucion tmr0 hay muchos otros comandos de basic que no puedes usar por conflitos internos entre ellos los comandos de pausa. - Código:
-
-- tambien me fije que defines cmcon=7 que seria igual cmcon=%00000111 (es mas facil verlo en binario directamente asi puedes compararlo con el datasheet del pic) esa instruccion no esiste en el 16f87x por no disponer de comparadores operacionales o porlomenos no lo traia la documentacion del pic, cmcon=%00000111 seria igual a tener todas la tomas de entradas de los operacionales derivadas a Vss y las patillas del poeracional libres de contacto con ellas para ser entradas analogicas o digitales o salidas digitales. (vamos para inutilizar los comparadores operacionales) la verdad que suelo enrrollarme mucho. la verdad que lo bueno de la programacion es que es como escrivir un libro si una hoja sale fatal y no convence no pasa nada con tirarla ala papelera, borron y cuenta nueva, as de replantear el programa de otra manera mas multifuncional (se podria decir) bueno y te cansejava usar un sensor tipo DHT11 que son baratos y bastante util para leer la temperatura y humedad solo que este es via serial y un espolvorizador de agua electronico. yo lo ice asi al usar una xarcasa de un horno aislandolo con espuma aislante un pequeño circuito para que renovase el aire sin perder casi calor. y bueno para la umedad metia un cuenco de agua. por que solo controlaba la temperatura con un termostato a cada x horas movia un poco los huevos. y la verdad que lo que necesitasen humedad lo savia pero que traspirasen oxigeno no por eso el conducto de ventilacon aparte que reparte mejor el calor. la verdad que tenia que echarle yo al mio unguante un dia y mejorarlo con un pic aparte de automatizarlo todo. quw manera tines sencilla de acerlos girar y que cuando salieran se fueran callendo a una superficie mas baja. (dia tengo que ponerme aunque seria con una pantalla display a secas) y eso que le lio mucho un saludo y sigue practicando | |
| | | Contenido patrocinado
| Tema: Re: ayuda como ejecutar dos rutinas simultaneamente en pic 16f877a | |
| |
| | | | ayuda como ejecutar dos rutinas simultaneamente en pic 16f877a | |
|
Temas similares | |
|
| Permisos de este foro: | No puedes responder a temas en este foro.
| |
| |
| Miembros que empiezan más temas | |
Los posteadores más activos de la semana | |
Noviembre 2024 | Lun | Mar | Miér | Jue | Vie | Sáb | Dom |
---|
| | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | Calendario |
|
¿Quién está en línea? | En total hay 1 usuario en línea: 0 Registrados, 0 Ocultos y 1 Invitado
Ninguno
El record de usuarios en línea fue de 54 durante el Sáb Nov 09, 2024 8:42 pm
|
|