COMUNIDAD DE ELECTRONICOS
Hola eres nuevo,
registrate y disfruta el nuevo foro
de electronica en donde podras dar y recibir informacion de electronica,
y asi mismo hacer tus preguntas para recibir una respueta.
Recuerda que si eres tecnico,Ingeniero o estudiante hay un rango
especial para ti, es gratis solo registrate.
DISFRUTALO

ayuda como ejecutar dos rutinas simultaneamente en pic 16f877a

Ir abajo

ayuda como ejecutar dos rutinas simultaneamente en pic 16f877a

Mensaje por emely jose el 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

emely jose
Principiante
Principiante

Masculino Mensajes : 2
Fecha de inscripción : 20/10/2014
Edad : 31

Volver arriba Ir abajo

Re: ayuda como ejecutar dos rutinas simultaneamente en pic 16f877a

Mensaje por zermeca el 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!
avatar
zermeca
Ingeniero

Masculino Mensajes : 3
Fecha de inscripción : 09/10/2014
Edad : 29

Volver arriba Ir abajo

Re: ayuda como ejecutar dos rutinas simultaneamente en pic 16f877a

Mensaje por desencriptador el 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.
avatar
desencriptador
SUB ADMINISTRADOR
SUB ADMINISTRADOR

Masculino Mensajes : 91
Fecha de inscripción : 05/05/2013
Edad : 63
Localización : Ciudadela, Provincia de Buenos Aires, República Argentina

http://desencriptador.forumotion.com/

Volver arriba Ir abajo

Re: ayuda como ejecutar dos rutinas simultaneamente en pic 16f877a

Mensaje por pepinho345 el 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

pepinho345
Principiante
Principiante

Masculino Mensajes : 4
Fecha de inscripción : 06/07/2015
Edad : 40

Volver arriba Ir abajo

Re: ayuda como ejecutar dos rutinas simultaneamente en pic 16f877a

Mensaje por Contenido patrocinado


Contenido patrocinado


Volver arriba Ir abajo

Volver arriba

- Temas similares

 
Permisos de este foro:
No puedes responder a temas en este foro.