TODOPIC

Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: elRicky_Pic en 13 de Agosto de 2005, 11:41:00

Título: Mi primer programa (ayuda??)
Publicado por: elRicky_Pic en 13 de Agosto de 2005, 11:41:00
Hola a todos, la verdad que la página todopic es una maza Muchas risas

Estube leyendo todo y con el manual de picbasic me lanzé a hacer un programita para un invento que quiero hacer, les cuento mas o menos.

La idea es hacer que mi auto (un mustang 1980) arranque con una tarjeta chip y un botón de start en vez de la tipica llave. Al mejor estilo Laguna 2

Tengo algo de idea de electrónica y hice el programa que correría en un PIC16F84 (el que está en la sección de apuntes).

El pic tiene que hacer varias cosas como en etapas:

Primero.
Esperar a que se inserte una tarjeta (el socalo tiene un contacto que se cierra cuando se mete una tarjeta) y cuando la tarjeta es insertada leer el contenido (es una tarjeta chip de telefono común, una memoria de 256bits o algo asi).

Una vez leida la tarjeta si está todo bien (si el código que tengo dentro del pic es igual al que tiene la tarjeta) ahi se prenderia una patita del pic que accionaria un relé que activa el contacto del auto.

Si el codigo no es igual, el pic quedaría esperando a que saquen la tarjeta , y solo ahi volveria al estado inicial (esperar que metan una tarjeta para leerla y compararla)

Segundo.
Cuando la tarjeta da OK y el auto esta en contacto, el pic se tiene que quedar esperando a que se presione el botón start. El botón lo que tiene que hacer es arrancar el BURRO , como si estubieramos girando la llave a tope.

Lo que se me ocurrió fue de meterle un cable al distribuidor del auto (el que da la chispa hacia las bujias) y de ahi medir las "RPM" del motor, asi si ese numero supera un determinado umbral de RPMS significaria que el motor arranco (el burro por ejemplo da 300 rpms, si cuando se presiona start las rpm suben a 500 es que el motor esta generando esas 200 extra, osea, no necesita mas al burro).

Además, como es un auto viejo hay que acelerarlo un poco, asi que tambien quiero ponerle un servo de esos de radio control (futaba o algo asi) para que en el momento de apretar start el pic se encargue de "sebar" un poco el auto.


Una vez que el auto arrancó el botón start no sirve mas, o sea, no cumple mas funciones.

Tercero.
Como el auto tendria un servo, y el pic sabria a que RPMS está el motor, tenia pensado hacer que el pic se encargue de regular el auto, para que no se apague en bajas vueltas.

y cuarto y ultimo.
(que todabia no lo programé, aunque dudo que algo del programa que hice funcione bien :S) poner un botón que al estar andando en el auto memorize las RPM que tengo y cuando suelte el acelerador el pic se encargue de acelerar el auto para mantener esas RPM (velocidad crucero pero por vueltas del motor y no por velocidad)

Bueno, aca va el codigo, hice toda la introduccion porque estoy haciendo un proyecto sobre esto y a mas de uno le puede ser de utilidad, estaria bueno que se prendan varios y hagamos de nuestros viejos autos unas joyas tecnológicas Muchas risas

"****************************************************************
"*  Name    : UNTITLED.BAS                                      *
"*  Author  : [select VIEW...EDITOR OPTIONS]                    *
"*  Notice  : Copyright (c) 2005 [select VIEW...EDITOR OPTIONS] *
"*          : All Rights Reserved                               *
"*  Date    : 13/08/2005                                        *
"*  Version : 1.0                                               *
"*  Notes   :                                                   *
"*          :                                                   *
"****************************************************************
CARDCLOCK var PORTB.1
CARDRESET var PORTB.2
CARDREAD  var PORTA.2
CARDEXIST var PORTA.3
START     var PORTA.1
DISTRIB   var PORTA.0
ACELERA   var PORTB.5
CONTACTO  var PORTB.3
BURRO     var PORTB.4
LEDA      var PORTB.6
LEDB      var PORTB.7

BUFFER_CARDDATA var bit[96] "el codigo de seguridad del auto.
UMBRAL con 4 "umbral de rpm del burro
REGULACION con 65 "umbral de frecuencia que indica el minimo numero de RPMS que soporta el motor antes de apagarse.
REGCON con 10 "incremento de frecuencia para el servo. se usa para buscar el punto de regulacion
ARRACON con 100 "valor del nivel de acelerador para el arranque

RPM as Byte
REGULA as byte
REGULA=REGCON
BUFFER_CARDDATA[0]=HIGH
BUFFER_CARDDATA[1]=HIGH
BUFFER_CARDDATA[2]=LOW
BUFFER_CARDDATA[3]=HIGH ".... ASi hasta el 96 (los primeros 96 bits de la tarjeta chip son unicos y no hay dos iguales
CARD_ERROR var bit

tarjeta:
   "rutina que espera a que se inserte una tarjeta y la compara con el valor obtenido.
   if CARDEXIST = High then
      " se introdujo una tarjeta
      HIGH CARDRESET "Ponemos en alto el reset
      HIGH CARDCLOCK "Damos un pulso de clock para q tome el reset
      LOW CARDRESET  "Bajamos el pulso de reset
      LOW CARDCLOCK  "Bajamos el pulso de clock.

      FOR i=1 TO 96 """ cuenta de 1 a 96
         HIGH CARDCLOCK "Damos un pulso de clock
         if BUFFER_CARDDATA < > CARDREAD then" leemos el dato
            "no coincide
            gosub tarjeta_invalida
         endif
         LOW CARDCLOCK "Bajamos el puslo de clock
      NEXT i " vuelve y efectúa la próxima cuenta

      "Se chequeo todo y parece estar bien, la tarjeta es buena.
      HIGH LEDB
      HIGH CONTACTO   
      gosub iniciar_motor
   endif   
goto tarjeta


tarjeta_invalida:
   "rutina que espera a que se cambie la tarjeta (quite) para desbloquear el sistema (cuando se ingresa una tarjeta invalida)
   if CARDEXIST < > LOW then
      TOGGLE LEDB
      PAUSE 300
   else
      LOW LEDB
      goto tarjeta:
   endif

goto tarjeta_invalida


iniciar_motor:
   if START = High then   "se presiono start
      "posicionamos el acelerador y esperamos 2 segundos.
      PULSOUT ACELERA,ARRACON " hay que determinal el valor real para el nivel de acelerador.
      PAUSE 2000
      "iniciamos el motor
      HIGH BURRO
      HIGH LEDA
      HIGH LEDB
      gosub start_engine
      "volvemos de start_engine. chequeamos si el motor sigue prendido.
      gosub check_engine
      "el motor esta encendido.
      HIGH LEDA
      LOW LEDB
      "vamos a la rutina de control de regulacion del motor
      gosub control_regulacion


start_engine:
   "vamos biendo si el motor arranca.
   COUNT DISTRIB,500,RPM   
   if(UMBRAL>=RPM)   then
      "las RPM son mayores a las que el burro puede hacer andar al motor, eso significa que arranco
      LOW BURRO "ya no es necesario que el burro gire
      RESUME
   endif
   TOGGLE LEDA
   TOGGLE LEDB
gosub start_engine:

check_engine:
   COUNT DISTRIB,1000,RPM   
   if(UMBRAL>=RPM)   then
      "si hay rpms y son mayores a umbral significa que el motor esta prendido.
      RESUME
   endif
   "si no resumio es porque el motor se paro.
   LOW LEDA
   HIGH LEDB
   LOW ACELERA
   gosub iniciar_motor


control_regulacion:
   COUNT DISTRIB,1000,RPM   
   if(REGULACION<RPM)   then
      "Si las rpm son menores que el umbral de regulacion aceleramos un poco.
      
      PULSOUT ACELERA,REGULA " hay que determinal el valor real para el nivel de acelerador.
   else
      "borramos el nivel de aceleracion.
      REGULA=0
      LOW REGULACION "lo sacamos para que cuando el auto acelere, no el servo no trate de trabar el acelerador.
   endif
   REGULA=REGULA+REGCON
   if CARDEXIST = LOW then "si sacan la tarjeta del socalo apagamos el motor
      LOW LEDA
      LOW LEDB
      LOW ACELERA
      LOW CONTACTO
      gosub tarjeta
   endif
gosub control_regulacion
Título: RE: Mi primer programa (ayuda??)
Publicado por: ricbevi en 18 de Agosto de 2005, 07:18:00

Hola "Tocayo".....pensaste en la posibilidad ¿que pasaria si no arranca despues de cierto tiempo el motor?(tendrias que ponerle un limite de tiempo ademas de las RPM ya que si no "burro y bat. Kaput"....te recomiendo que ataques (sobre todo de un proyecto complejo y "De los primeros"Giño por partes y luego las unas hasta llegar a lo que realmente queres (desarrolo modular)....Tambien existen simuladores que lo podes cargar con el ".hex" y asi ir puliendolo...Ej:"Pic Simulato IDE".

Saludos.

Ric.
Título: RE: Mi primer programa (ayuda??)
Publicado por: elRicky_Pic en 18 de Agosto de 2005, 23:43:00
Hola, si, me pege varias piñas intentando hacerlo andar Muchas risas

Ahora ya pulí bastánte el codigo (por lo menos compila Muchas risas) y le saque el servo porque se me complica conseguirlo y de ultima en un nuevo proyecto se lo agregaré.


En realidad, el burro está controlado por el botón start, asi que mientras tenga presionado el botón solamente debería funcionar.

El código quedo mucho mas chico ahora :

OPTION_REG=%00100000
"ENTRADAS
TARJETA        var   PORTB.3
WSTART          var   PORTB.2
DCARD          var   PORTB.1
DISTRIBUIDOR    var   PORTA.4 "clock de timer0
"SALIDAS
CCARD          var   PORTA.0
RCARD          var   PORTA.1
CONTACTO       var   PORTA.2
BURRO          var   PORTA.3
LUCES          var   PORTB.4
LEDGREEN       var   PORTB.5
LEDRED          var   PORTB.6
LEDENGINE       var   PORTB.7
DEBUGLED        VAR PORTB.0
rpms      var    byte
res      var    bit
POS   var   BIT[96]
i var byte
valor var byte
FASTREAD VAR byte
FULLREAD var BYTE
READSPEED VAR BYTE
CONT var bit "estado del contador de RPM
CONT=0
FULLREAD=5 "modo de lectura completa.
fastread=2  "modo de lectura rapida.
READSPEED=FULLREAD
valor=5
FOR i=0 TO 95
    POS=0
NEXT i



"inicializamos todo
LOW CCARD
LOW RCARD
LOW CONTACTO
LOW BURRO
LOW LUCES
LOW LEDGREEN
LOW LEDRED
LOW LEDENGINE
LOW DEBUGLED
INPUT DISTRIBUIDOR
INPUT WSTART
INPUT DCARD
INPUT TARJETA

"avisamos que estamos listos para iniciar.
HIGH LEDRED
HIGH DEBUGLED
HIGH LEDGREEN
pause 30
LOW LEDRED
LOW LEDGREEN
LOW DEBUGLED
goto programa
 

"rutina de interrupcion que se activa con el cambio de estado de tarjeta
checkcard:
   IF tarjeta=1 THEN  "La interrupcion indica que se inserto una tarjeta
      "ínicializamos la tarjeta
      HIGH CCARD
      HIGH RCARD
      PAUSE 10
      LOW CCARD
      LOW RCARD
      "leemos toda la tarjeta
      FOR i=0 TO READSPEED
         res=0 "asumimos el error por defecto.
         HIGH CCARD
         PAUSE 5
         LOW CCARD
         PAUSE 5
         IF DCARD = POS THEN
            res=1 "comparacion correcta.
         ENDIF
         IF res=0 THEN "si hay error en la comparacion de codigos
            LOW CONTACTO   "sin contacto
            LOW BURRO   "sin burro
            LOW LUCES   "sin luces reglamentarias
            LOW LEDGREEN   "led de estado ok, apagado
            LOW LEDENGINE   "led de motor encendido apagado
            HIGH LEDRED   "led de error de lectura prendido
            RETURN
         ENDIF
      NEXT i
      "si llegamos aca es porque la tarjeta es buena.
        READSPEED=FASTREAD
      HIGH CONTACTO
      LOW LEDRED
      HIGH LEDGREEN
   ELSE "en este caso, se quito la tarjeta.
        READSPEED=FULLREAD
      LOW CONTACTO   "sin contacto
      LOW BURRO   "sin burro
      LOW LUCES   "sin luces reglamentarias
      LOW LEDGREEN   "led de estado ok, apagado
      LOW LEDENGINE   "led de motor encendido apagado
      LOW LEDRED   "led de error de lectura apagado
      RETURN
   ENDIF
RETURN




programa:
   "vamos chequeando si el motor esta apagado.
    IF CONTACTO=1 THEN
        gosub vueltas
    ELSE
       LOW LEDRED
    ENDIF
   GOSUB starteng
    GOSUB checkcard
goto programa

vueltas:
    GOSUB RPMCOUNT "calculo las rpm
   IF rpms <> 0 THEN
      HIGH LEDENGINE
   ELSE
      LOW LEDENGINE
   ENDIF
return


starteng:
   IF CONTACTO=0 THEN" el vehiculo no esta en contacto, abortamos
      RETURN
   ENDIF
   IF WSTART=1 THEN
      IF LEDENGINE=0 THEN " el motor esta apagado, es viable el uso de este boton
         HIGH BURRO
      ENDIF
   ENDIF
   IF WSTART=0 THEN "se solto el boton, detenemos al burro.
      LOW BURRO
   ENDIF
RETURN

RPMCOUNT:
    TMR0=0
    PAUSE 100
    RPMS=TMR0
    for i=0 to rpms
        HIGH DEBUGLED
        pause 1
        LOW DEBUGLED
    NEXT i
RETURN



Pero me estoy volviendo un poco loco con el tema de como medir las RPM.

Estube leyendo el datasheet del pic y es medio gerogrifico pero mas o menos estoy entendiendo algunas cosas.

Se me ocurrió para medir las RPM que TMR0 use de clock el distribuidor, asi en un determinado tiempo cuento la cantidad de clocks que obtubo TMR0 y con eso ya se la frecuencia del motor.

El problema es que no hay forma de que salga andando (lo estoy probando con el virtualbreadboard porque grabar el pic cada vez que toco algo se pone complicado :S )

Volviendo al tema del TMR0 y RA4 de clock, segun el datasheet dice que tengo que activar el bit 5 en 1 para que se use esa pata en vez del oscilador interno.

yo puse
OPTION_REG=%00100000


y para contar las rpm despues
RPMCOUNT:
    TMR0=0 " pongo el timer en 0
    PAUSE 100 "espero 100ms
    RPMS=TMR0 "guardo la cuenta
    for i=0 to rpms  "esto es para ver cuanto contó el micro , siempre cuenta igual Enfurruñado aunque no le ponga nada en RB4
        HIGH DEBUGLED
        pause 1
        LOW DEBUGLED
    NEXT i
RETURN



y en el VirtualBreadBoard probé con un ascilador conectado y desconectado y siempre TMR0 cuando lo reinicio, espero 100 ms y lo cuento, da el mismo resultado.

La verdad necesitaría ayuda con eso, tambien probé con interrupciones y mil cosas mas que tampoco funcionaron, seguro me estoy perdiendo de algo que me está faltando activar o algo por el estilo.


Saludos y Mil gracias
Título: RE: Mi primer programa (ayuda??)
Publicado por: ricbevi en 19 de Agosto de 2005, 06:46:00
Hola nuevamente mira yo hace mucho hice un Tacometro con LCD(re-paquete y caro...He...He) y use la instrucion Counter pin,tiempo asi:
             
                 DIM WRD as WORD             " VARIABLE CONTADOR DE PULSOS ENTRADA
      DIM RPM as WORD            " VARIABLE DE LAS RPM
       SYMBOL Pin = PORTA.0   " ASIGNA LA ENTRADA AL PORTA.0
LOOP:        WRD = COUNTER Pin , 1000   " LA VARIABLE WRD AHORA CONTIENE EL
                                                                "   VALOR DE  LA ENTRADA EN 1seg
       RPM = WRD*C                 "C factor de multi segun numero de cilindros
                                                           "4Cil 4Tiempo c=30 6cil c=20 8cil c=15
                     .....................
Lamentablemente nunca use el TMR0 asi que no puedo colaborar.

Saludos.

Ric.
Título: Re: Mi primer programa (ayuda??)
Publicado por: santty1000 en 03 de Noviembre de 2008, 21:02:34
Saludos,
Quiero hacer un contador de rpm con lcd  por favor si me puedes  ayudar ya que  tu has hecho uno,  lo pienso poner en una moto, me podrias dar detalles de como  funciona el tuyo
Gracias  por tu ayuda :-/
Título: Re: Mi primer programa (ayuda??)
Publicado por: navaismo en 03 de Noviembre de 2008, 21:07:53
El tema lleva mas de 3 años muerto, su codigo esta comentado por lo que por ahi puedes empezar y lo otro puedes usar el buscador del foro ya que ese tema ha sido tratado mas veces.