Webcampista.com

mucho más que un foro

Ayuda de los compañeros caravanistas

prueba el TL084, que es compatible patilla a patilla, son 4 operacionales, te sirve cualquiera, el LM324 también, por ejemplo.


Lo del C, asusta, no te quiero cambiar de idea, cuando empieces a hacer circuitos con complejidad y muchas lineas de código, volvemos a hablar. De todas maneras la foto que has puesto también la puedes sacar con el ensamblador, solo cambiaría la pagina del programa.

No tengo tiempo de "repasar" el código, a ver si Dedalo puede decirte algo.

PD: ¿abrimos un foro temático de microcontroladores?

PD2: y me acaban de echar del trabajo, lo que me faltaba para no salir de aquí en tol día...
 
Siento lo del curro Aunolose. Es mala noticia en los tiempos que corren, pero un tio preparado como tu no creo que tenga problemas en encontrar de nuevo algo...

Lo del LM 324 es porque lo llevo usando hace ya la tira de años y me he acostumbrado a el. El TL084 es identico pero ademas tiene entrada cmos, por lo que el consumo en su entrada es de unos pocos picoamperios, ademas la ganancia en lazo abierto es mucho mayor y la respuesta de frecuencia muchisimo mayor, es decir, es mucho mejor que el LM324 lo mires por donde lo mires, pero cuando pienso en un comparador pienso en el viejo automaticamente, la fuerza de la costumbre... jajajaja.

En lo de programar en C tengo que darte la razon, es mucho mas rapido de programar, pero por alguna extraña razon en los PIC me sigue gustando la programacion en ensamblador. Me da la impresion de tenerlo todo mas controlado.

El codigo lo voy a estudiar ahora a ver que veo. Lo primero que he visto es que haces un salto a "fin" y en la etiqueta fin no hay codigo. deberias poner:

Código:
fin: goto fin

porque en caso contrario el procesador ejecuta el codigo 3FFF (la rom esta borrada en ese punto). He mirado el codigo 3FFF en la tabla de opcodes y corresponde a la operacion ADDLW 0xFF, que equivale a sumarle FF al acumulador afectando a las banderas C, DC y Z, y lo seguiria ejecutando hasta que el PC de la vuelta el PIC volveria a empezar el programa desde reset (que esta en 0) despues de repetir esta operacion.
 
jajjaja, perdonad por el mensaje, por las posdatas, que queda muy raro y se puede entender mal, como así ha sido. :D

Todavía conservo el trabajo.

Me explico, ya ando bastante tiempo por el foro, si abrimos un foro temático sobre microcontroladores me pasaré por aquí aún más tiempo, y eso (si me pillan) puede suponer que me larguen del curro, por eso lo de "¿abrimos un foro temático...? -> y ya me acaban de echar del curro, lo que me faltaba para no salir de aquí",


No encuentro el goto fin, sino goto program, para cerrar el bucle.
 
Uffff ya pensaba que estabas ayudando al ZP a aumentar las listas del paro.....

volviendo al programa. Al principio comprueba si hay tension en el pin 9 de la piña y en caso contrario salta a la etiqueta FIN. Se supone que es porque el procesador esta alimentado pero no hay corriente, es decir, lo acaban de apagar y aun queda tension en los condensadores, por lo que se le envia a un bucle sin fin para dejarle "morir".

En su lugar se podria haber escrito el siguiente codigo:

Código:
SINFIN: BTFSS PIN9
            GOTO SINFIN
... aqui continua el codigo

de esa forma el procesador se queda comprobando si hay tension en el pin 9 y en caso de que aparezca de nuevo la tension sigue funcionando y si falta tension en el pin 9 se queda muerto aqui.
 
jajjaja, perdonad por el mensaje, por las posdatas, que queda muy raro y se puede entender mal, como así ha sido. :D

Todavía conservo el trabajo.

Me explico, ya ando bastante tiempo por el foro, si abrimos un foro temático sobre microcontroladores me pasaré por aquí aún más tiempo, y eso (si me pillan) puede suponer que me larguen del curro, por eso lo de "¿abrimos un foro temático...? -> y ya me acaban de echar del curro, lo que me faltaba para no salir de aquí",


No encuentro el goto fin, sino goto program, para cerrar el bucle.


Ufff!!!! que susto me habias dado...... pensaba que habias pasado a la misma cola que estoy yo......

Lo de abrir un hilo temático no estaria mal, y si lo tenemos ordenadito...... puede ser un buen libro de consulta......
 
Uffff ya pensaba que estabas ayudando al ZP a aumentar las listas del paro.....

volviendo al programa. Al principio comprueba si hay tension en el pin 9 de la piña y en caso contrario salta a la etiqueta FIN. Se supone que es porque el procesador esta alimentado pero no hay corriente, es decir, lo acaban de apagar y aun queda tension en los condensadores, por lo que se le envia a un bucle sin fin para dejarle "morir".

En su lugar se podria haber escrito el siguiente codigo:

Código:
SINFIN: BTFSS PIN9
            GOTO SINFIN
... aqui continua el codigo
de esa forma el procesador se queda comprobando si hay tension en el pin 9 y en caso de que aparezca de nuevo la tension sigue funcionando y si falta tension en el pin 9 se queda muerto aqui.


Oido cocina, y cambiado......
 
Hoy sus dejo que me voy a todopic, haber si consigo info, para haceme ni quemador y entrnador de pics....
 
Ya esta el hilo donde tenía que estar.....
 
Yo me presto a ser beta tester... si necesitais algun probador del sistema en una Cv. ;)
 
Hoy he estado leyendo detenidamente el programa y lo encuentro bastante desordenado. Haz un bucle limpio que se repita de forma indefinida, asi no corres el peligro de que el programa se quede colgado por el hecho de que alguna condicion no se cumpla.

Por ejemplo:
(0) inicializas los puertos (y si fuese necesario tambien las variables).

1) compruebas que las condiciones son las que necesitas para que funcione el atc, en caso de que una de las condiciones no se cumpla apagas el ATC y saltas al paso (2). si todas ellas se cumplen conectas el ATC y saltas al paso (2).

2) compruebas todas las condiciones para que se conecte la nevera, si alguna de ellas falla apagas la nevera y saltas al paso (3). Si todas ellas se cumplen conectas la nevera y pasas al paso (3).

3) compruebas que se cumplen las condiciones para encender el alumbrado, si alguna de las condiciones falla apagas el alumbrado y saltas al paso (4). En caso de que todo funcione enciendes las luces y saltas al paso (4).

Lo mismo que en los tres pasos anteriores para cualquier otra cosa que debas encender o apagar. Si ya no hay mas reles es hora de hacer una temporizacion y despues volver al punto (1) y volver a comprobar todo otra vez.

De esa forma, estas comprobando todo continuamente y no te quedas en una tarea colgado, lo que impediria que otra tarea se quede sin hacer.
 
Estoy de acuerdo con Dedalo, no hay bloquear cosas independientes.

Salvo en el tema del ATC, a este le daría alimentación siempre, ya tiene el "centralita" para saber lo que hace. estando apagado no creo que consuma mucho, y te aseguras de que, pase lo que le pase al circuito, está alimentado cuando hace falta.

Voy a leerme otra vez las especificaciones, a ver si entiendo por que quieres quitar el ATC ¿te refieres estando parado?
 
Vale, ya lo he releído: no quieres alimentar nada hasta que no este el coche en marcha. Vale, aceptamos barco. pero ojo, el rele del ATC debe soportar también mucha corriente.
 
Se me acaba de ocurrir una idea de las de escandalo...

Un sistema multi-thread en un PIC.

Haces un mini-programa que comprueba las condiciones del ATC, si las condiciones se cumplen el ATC se enciende y si no se cumplen el ATC se apaga. Al terminar esta comprobacion (que no deberia llevar mas de 50 us) retornas pero con la instruccion IRET, retorno de interrupcion.

Otro mini-programa como el anterior pero con la gestion de la nevera.

Otro mas para la gestion de la luz interior. Otro para gestion del cargador, etc.

Programas una interrupcion para que se produzca cada 10 ms y pones un contador de forma que cada vez que se produzca una interrupcion incrementas el contador, y luego segun el numero del contador saltas a uno de los mini-programas anteriores. El programa principal inicializa los puertos y despues se queda comprobando la tension en el pin 9, si la tension desaparece simplemente deshabilita las interrupciones, apaga todo y cuelga el PIC con un bucle infinito.

El efecto obtenido es que esos mini-programas estan continuamente funcionando, como si fuese un sistema multitarea.
 
Jejejejejeje

Has corrido más que yo dedalo.......

Estoy empezando ha dar las interupciones, y para no tener el tema con bucles infinitos, que acaban desbordando el TMR0 con la consiguiente interrupción interna, se me ocurre que el testigo del motor entre en RB0/int, y sea cualquier cambio de este el que haga pasar por esos pequeños programitas, active y desactive lo que tenga que activar y desactibar y vuelta a dormir (SLEEP) hasta que cambie de estado....

os parece???????
 
Yo me presto a ser beta tester... si necesitais algun probador del sistema en una Cv. ;)

jejejejejeje

me parece que llegas tarde......

la primera la de mi padre.
la segunda la de mi suega
la tercera la de gendou

y por el medio seguro que va la de aunolose.

jejejejejejeje
 
Vale, ya lo he releído: no quieres alimentar nada hasta que no este el coche en marcha. Vale, aceptamos barco. pero ojo, el rele del ATC debe soportar también mucha corriente.


Exacto el tema de activarlo, comprobar y actuar, es por que en este caso si no lo alimento primero para tener una señal de retorno el pic no sabe si esta o no esta, y como es un accesorio que no llevan todas las caravanas, tampoco conviene tener un rele abierto sin consumo.....

En cuanto a lo del rele, hasta que se me acaben, tengo unos cuantos de 20 y 40 A de potencia provinientes de automoción......
 
Aunolose...... pa cuando el subforo temático????????


que alguien lo tendrá que abrir
 
Jejejejejeje

Has corrido más que yo dedalo.......

Estoy empezando ha dar las interupciones, y para no tener el tema con bucles infinitos, que acaban desbordando el TMR0 con la consiguiente interrupción interna, se me ocurre que el testigo del motor entre en RB0/int, y sea cualquier cambio de este el que haga pasar por esos pequeños programitas, active y desactive lo que tenga que activar y desactibar y vuelta a dormir (SLEEP) hasta que cambie de estado....

os parece???????

Me parece mas interesante programar una interrupcion periodica interna con el TMR0 que te sirva como base de tiempos y realizar la comprobacion de forma ciclica. Se trataria de "despertar" el PIC cada cierto tiempo, que haga su trabajo y volverlo a dormir hasta el siguiente ciclo. Recuerda que el programa principal debe ser un bucle infinito sobre una instruccion SLEEP, asi cada vez que se "despierte" el PIC ejecuta la interrupcion, y al retornar con RETI el bucle hace que se vuelva a repetir la instruccion SLEEP y se vuelve a dormir.
 
Creí que era para uso personal, ya veo que estás pensando comercializarlo :D

Las interrupciones de los PIC no son como las del 8051, me explico, no están vectorizadas (toma explicación :D ) quiero decir que dentro de la interrupción tienes que mirar lo que ha interrumpido, es decir, lo mismo que si lo haces en un bucle infinito, si a eso añades que la pila es muy pequeña, no le veo ventajas de hacerlo así.

Usar la instrucción SLEEP en cambio ya me parece mejor, y creo que en ese caso no te escapas de las interrupciones, aunque me suena que se puede hacer "sin usarlas" es decir, está en sleep, la interrupción lo despierta, en la interrupción tienes un RETI y vuelves al programa "normal", dentro del bucle, cuando acabas, vuelves al SLEEP. de esta manera te ahorras lo de la pila, lo del espacio de programa que no pise la interrupción, etc.


(dejame que lo diga otra vez, y prometo no hacerlo más: el compilador de C se encarga de solucionar esos problemas :???: )
 
Amigo Navegante, buenas tardes. Nos acabas de demostra a todos dos cosas importantes, la primera que eres un electrónico de aupa, o al menos esa impresión nos has dejado, yo que soy nulo en esto de la electrónica, no tengo ni idea de que puede ser esto, espero que sea la bomba y que empieces a fabricar en serie para todos nosotros. Pero la otra parte que nos has enseñado es que eres el rey del suspense, nos tienes a todos en vilo como si fuera la mejor pelicula de suspense.
Asi que a esperar a que nos cuentes de que va el artefacto que te has preparado.

Animo y a seguir inventando.
 
Vamos a ver...

El programa seria muy cortito, prepara los puertos, programa la interrupcion y despues un bucle infinito sobre una uinstruccion SLEEP. Por lo del espacio en la pila no hay porque preocuparse. el PIC tiene 8 niveles de profundidad de pila y no creo que en un programa como este se utilicen ni tres.

Como el programa principal no va a tocar ningun registro no hay que preocuparse por guardar el contexto.
 
Aqui una muestra de como puede ser ese codigo.

Uno de los procesos se deberia dedicar a encontrar situaciones de error, como por ejemplo el freno puesto y el motor en marcha, o la bateria de la CV baja

Código:
;===============================================================================
; Programa de gestion de la energia en la CV
;===============================================================================
;===============================================================================
; Distribucion de la RAM y definiciones de bits
;===============================================================================
 
PROCESO  EQU 0x10   ; Contador de proceso atendido
PROCTEMP EQU 0x12   ; Temporal proceso atendido
TIEMPO  EQU 0x11   ; Contador de tiempo
 
#DEFINE  PIÑA PORTA,0x00  ; Pin 9 de la piña (piña conectada)
#DEFINE  MOTOR PORTA,0x01  ; Pin 12 de la piña (motor en marcha)
#DEFINE  BATERIA PORTA,0x02  ; Bateria de la CV conectada
#DEFINE  FRENO PORTA,0x03  ; Micro en el freno de la CV
#DEFINE  BATBAJA PORTA,0x04  ; Pin 9 de la piña (piña conectada)
 
;===============================================================================
; Vector de reset
;===============================================================================
        ORG 0x0000
        GOTO RESET   ; Saltamos a la rutina de reset
;===============================================================================
; Vector de interrupcion
;===============================================================================
        ORG 0x0004
;===============================================================================
; Interrupcion TMR0. Se produce una interrupcion cada 256 uS
; con un cuarzo de 4 MHz. Con un contador reducimos la ejecucion
; de la INT solo a una vez cada 65 ms,
;===============================================================================
INT_TMR:
        BTFSS INTCON,T0IF  ; Si no es T0IF
        GOTO FIN_INT   ; salimos de la rutina de interrupcion
        DECFSZ TIEMPO,F  ; Si no es momento
        GOTO FIN_INT   ; salimos de la rutina de interrupcion
;===============================================================================
; Seleccion del proceso a ejecutar
;===============================================================================
        INCF PROCESO,W  ; Proceso siguiente
        ANDLW 0x07   ; limitamos el numero de procesos a 8
        MOVWF PROCESO
        MOVWF PROCTEMP  ; Guardamos el proc. actual
 
;===============================================================================
; Proceso 1  ATC
;===============================================================================
PROC_1:
        DECFSZ PROCTEMP,F  ; Si no es el 1
        GOTO PROC_2   ; Pasamos al siguiente
        BTFSS PIÑA   ; Si al piña esta conectada...
        GOTO NO_ATC
        BTFSS MOTOR   ; El motor esta en marcha...
        GOTO NO_ATC
        BTFSC FRENO   ; El freno esta quitado...
        GOTO NO_ATC
        BSF RELE_ATC  ; se conecta el ATC
        GOTO FIN_INT   ; y terminamos
NO_ATC:
        BCF RELE_ATC  ; caso contrario desconecta el ATC
        GOTO FIN_INT   ; y terminamos
 
;===============================================================================
; Proceso 2  ALUMBRADO desde la piña
;===============================================================================
PROC_2:
        DECFSZ PROCTEMP,F  ; Si no es el 2
        GOTO PROC_3   ; Pasamos al siguiente
        BTFSS PIÑA   ; Si al piña esta conectada...
        GOTO NO_ALP
        BTFSC MOTOR   ; y el motor esta parado...
        GOTO NO_ALP
        BSF RELE_ALP  ; se conecta el alumbrado a la piña
        GOTO FIN_INT   ; y terminamos
NO_ALP:
        BCF RELE_ALP  ; caso contrario desconecta el alumbrado
        GOTO FIN_INT   ; y terminamos
 
;===============================================================================
; Proceso 3  ALUMBRADO desce la bateria de la CV
;===============================================================================
PROC_3:
        DECFSZ PROCTEMP,F  ; Si no es el 3
        GOTO PROC_4   ; Pasamos al siguiente
        BTFSC PIÑA   ; Si al piña esta desconectada...
        GOTO NO_ALB
        BTFSS BATERIA   ; y la bateria de la CV esta conectada...
        GOTO NO_ALB
        BTFSC BATBAJA   ; y la bateria no esta baja...
        GOTO NO_ALB
        BSF RELE_ALB  ; se conecta el alumbrado a la piña
        GOTO FIN_INT   ; y terminamos
NO_ALB:
        BCF RELE_ALB  ; caso contrario desconecta el alumbrado
        GOTO FIN_INT   ; y terminamos
;===============================================================================
; Proceso 4  MOVEDOR
;===============================================================================
PROC_4:
        DECFSZ PROCTEMP,F  ; Si no es el 4
        GOTO PROC_5   ; Pasamos al siguiente
        BTFSC PIÑA   ; Si al piña esta desconectada...
        GOTO NO_MOV
        BTFSS BATERIA   ; la bateria de la CV esta conectada...
        GOTO NO_MOV
        BTFSC BATBAJA   ; la bateria no esta baja...
        GOTO NO_MOV
        BTFSC FRENO   ; y no esta puesto el freno de la CV...
        GOTO NO_MOV
        BSF RELE_MOV  ; se conecta el movedor
        GOTO FIN_INT   ; y terminamos
NO_MOV:
        BCF RELE_MOV  ; caso contrario desconecta el movedor
        GOTO FIN_INT   ; y terminamos
;===============================================================================
; Proceso 5
;===============================================================================
PROC_5:
        DECFSZ PROCTEMP,F  ; Si no es el 5
        GOTO PROC_6   ; Pasamos al siguiente
 
 
; Aqui se pone el codigo correspondiente al proceso cinco
; Debe terminar con un salto a FIN_INT
        GOTO FIN_INT
 
;===============================================================================
; Proceso 6
;===============================================================================
PROC_6:
        DECFSZ PROCTEMP,F  ; Si no es el 6
        GOTO PROC_7   ; Pasamos al siguiente
 
; Aqui se pone el codigo correspondiente al proceso seis
; Debe terminar con un salto a FIN_INT
        GOTO FIN_INT
 
;===============================================================================
; Proceso 7
;===============================================================================
PROC_7:
        DECFSZ PROCTEMP,F  ; Si no es el 7
        GOTO PROC_8   ; Pasamos al siguiente
 
; Aqui se pone el codigo correspondiente al proceso siete
; Debe terminar con un salto a FIN_INT
        GOTO FIN_INT
 
;===============================================================================
; Proceso 8
;===============================================================================
PROC_8:
; Aqui se pone el codigo correspondiente al proceso cinco
; Debe terminar con un salto a FIN_INT
        GOTO FIN_INT
 
;===============================================================================
; Salir de la interrupcion
;===============================================================================
 
FIN_INT:
        BCF INTCON,T0IF  ; Restauramos los bits de interrupcion
        RETFIE    ; Terminamos interrupcion
 
;===============================================================================
; Preparacion de la interrupcion y bucle principal
;===============================================================================
RESET:
        MOVLW 0x00
        MOVWF PROCESO   ; El primer proceso a ejecutar es el 0
        BSF STATUS, RP0
        MOVLW 0x1F
        MOVWF TRISA   ; Puerto A es entrada en todos sus bits
        MOVLW 0x00
        MOVWF TRISB   ; Puerto B es salida en todos sus bits
        MOVLW b'11011111'  ; Ajuste del timer
        MOVWF OPTION_REG
        BCF STATUS,RP0
        MOVLW b'10100000'
        MOVWF INTCON   ; Habilitamos interrupcion del TMR0
BUCLE:
        SLEEP
        GOTO BUCLE   ; Sueño eterno...
 
END
 
Yo no creo que haga falta ni los procesos, que cada vez que interrumpa lo mire todo, si no tiene otra cosa que hacer.
Bueno es que por lo que consume y teniendo en cuenta que normalmente estará conectado al coche cuando sea remolcada la cv creo que estaría siempre en el bucle, sin SLEEP ni na, pues cualquier relé, si no es de los biestables, ya consume más que lo que va a hacer el PIC sin entrar en SLEEP.

Aunque por probar las interrupciones, vale.

Dedalo, recuerda que le gustaría escribirlo a él. :D
 
Arriba
© 2004-2024 Webcampista.com