Hola a todos, la verdad que la página todopic es una maza

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

"****************************************************************
"* 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