#include <16F84A.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#use delay(clock=4000000)
#BYTE TRISA = 0x85 // Configuramos el TRISA
#BYTE TRISB = 0x86 // Configuramos el TRISB
#BYTE PORTA = 0x05 // Configuramos el PORTA
#BYTE PORTB = 0x06 // Configuramos el PORTB
void main
{
TRISA = 0xff;
TRISB = 0x00;
int x;
while (true)
{
x = 0;
if (x == 0)
{
output_high(pin_B7);
}
if (x == 1)
{
output_low(pin_B7);
}
while (x==0)
{
if (PORTA == 0X00 )
{
PORTB = (0xBF);
}
if (PORTA == 0X01)
{
PORTB = 0x86;
}
if (PORTA == 0X02)
{
PORTB = 0xDB;
}
if (PORTA == 0X03)
{
PORTB = 0xCF;
}
if (PORTA == 0X04)
{
PORTB = 0xE6;
}
}
while (x==1)
{
if (PORTA == 0X00)
{
PORTB = 0xBF;
}
if (PORTA == 0X01)
{
PORTB = 0x86;
}
if (PORTA == 0X02)
{
PORTB = 0xDB;
}
if (PORTA == 0X03)
{
PORTB = 0xCF;
}
if (PORTA == 0X04)
{
PORTB = 0xE6;
}
}
}
}
COnecta una resistencia de 10K en la patilla de MCLR y 5v. Si ya tienes eso checa esto.
En vez de usar hexadecimal para escribir y leer los puertos usa decimal o binario es mas sencillo o para hacerlo mas claro usa binario poniendo 0b10101010 donde los
ejemplo:
portb=0b01010101; donde | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 |
| RB7 | RB6 | RB5 | RB4 | RB3 | RB2 | RB1 | RB0 |
asi te podra ser mas facil ver que estas mandando prender y apagar.
Seria bueno ver el diagrama de proteus.
Hola,
pues si te estas iniciando, lo primero creo que ya lo has logrado, que es determinar mediante reglas el funcionamiento del programa. Ahora deberías llevarlo un poco más lejos y plantearlo en pseudocódigo:
mientras siempre
si tanque vacio
encender bomba
mostrar bomba encendida en display
mientras tanque no completamente lleno
refrescar estado de nivel de tanque en display
fin mientras
apagar bomba
sino
mostrar estado actual del tanque en display
fin si
fin mientras
Una vez que lo tienes en pseudocódigo es más sencillo llevarlo a un lenguaje, en este caso a C.
Saludos.
Saludos amigos de todopic, soy muy muy novato en este extenso mundo de los microcontroladores, apenas he desarrollado un par de programas en CSS 4.1 simulandolos en Proteus 8.
Ojala me puedan apoyar, intento desarrollar un pequeño proyecto, que a continuación describo:
Se trata de controlar una bomba de agua, que se encienda cuando un tánque se vacíe y que se detenga cuando este se llene, mostrando en un display de 7 segmentos 5 estados: 0=vacio, 1=1/4, 2=a la mitad, 3=3/4 y 4=lleno... y además se debe encender el punto decimal del display cuando la bomba está prendida y apagar cuando se apaga.
Resumiendo entonces se trata de 2 corridas: 1) cuando el tanque está vació y comienza a llenarse (bomba prendida) hasta que llega al estado lleno (bomba se apaga). 2) Cuando el tanque se está vaciando, la bomba no se prende hasta que se llegue al estado vacio.
Lo intente usando un switch, pero me fastidie pronto y ahora lo hice con estructuras if... Lo pego abajo. Pienso que el problema está en los puertos porque al hacer la simulación en proteus, los puertos de salida B, parecen muertos y no mandan nada al display... ya me desesperé, tal vez sea algo muy tonto de resolver, pero no es mi área, solo que quiero inciarme, mil gracias a todos los que gusten asesorarme.Código: [Seleccionar]
#include <16F84A.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#use delay(clock=4000000)
#BYTE TRISA = 0x85 // Configuramos el TRISA
#BYTE TRISB = 0x86 // Configuramos el TRISB
#BYTE PORTA = 0x05 // Configuramos el PORTA
#BYTE PORTB = 0x06 // Configuramos el PORTB
void main
{
TRISA = 0xff;
TRISB = 0x00;
int x;
while (true)
{
x = 0;
if (x == 0)
{
output_high(pin_B7);
}
if (x == 1)
{
output_low(pin_B7);
}
while (x==0)
{
if (PORTA == 0X00 )
{
PORTB = (0xBF);
}
if (PORTA == 0X01)
{
PORTB = 0x86;
}
if (PORTA == 0X02)
{
PORTB = 0xDB;
}
if (PORTA == 0X03)
{
PORTB = 0xCF;
}
if (PORTA == 0X04)
{
PORTB = 0xE6;
}
}
while (x==1)
{
if (PORTA == 0X00)
{
PORTB = 0xBF;
}
if (PORTA == 0X01)
{
PORTB = 0x86;
}
if (PORTA == 0X02)
{
PORTB = 0xDB;
}
if (PORTA == 0X03)
{
PORTB = 0xCF;
}
if (PORTA == 0X04)
{
PORTB = 0xE6;
}
}
}
}
Estoy usando la "x" como indicador de bomba prendida o bomba apagado. El programa me corre sin errores ni warnings, tal vez mi error también esta al hacer la simulación, si gustan subo el archivo de proteus también.
Gracias por todo amigos y saludos desde Mx. (((:-)))
Corroborrando lo de Darkman en ningún lado cambia el valor de x a 1; armate bien tu pseudocodigo y por el foro hay algunos manuales y tutoriales para que comiences a hacer mas aplicaciones saludos. :mrgreen:
Hola quantum27, te sugiero que inicies con lo basico, configurando puertos prendiendo y apagando leds, luego prueba con botones. Obviamente aun estas empezando y estas queriendo correr a ciegas, en el foro ya hay bastantes ejemplos de CCS.
ESTO TE SERVIRA (http://www.todopic.com.ar/foros/index.php?topic=14634.0)
Saludos!! :P
Hola quantum27, te sugiero que inicies con lo basico, configurando puertos prendiendo y apagando leds, luego prueba con botones. Obviamente aun estas empezando y estas queriendo correr a ciegas, en el foro ya hay bastantes ejemplos de CCS.
ESTO TE SERVIRA (http://www.todopic.com.ar/foros/index.php?topic=14634.0)
Saludos!! :P
No, no podré vivir tranquilo si no lo resuelvo... solo quiero que alguien me diga porque no fnciona el puerto b.... porque no me netrega nada, si la configuración parece correcta.
Hola.
Podes usar delay_ms para generar la pausa. Fijate en el manual de CCS (http://www.cursos.ucv.cl/eie48700/referencias/CCS_C_Manual.pdf) , pagina 33, "5-4 Funciones de retardo".
Un libro que te puede servir es este:(http://www.alfaomega.com.mx/magento/co/media/catalog/product/cache/1/image/5e06319eda06f020e43594a9c230972d/C/o/Compilador_C_CCS_simulador_proteus_1.png)
El autor es Eduardo Garcia Breijo y la editorial es Alfaomega. Aunque anda trucho por ahí para descargarlo, te recomiendo si es que podes, que lo compres. Esta bueno poder hojearlo para atras y adelante cuando estas haciendo pruebas y como libro de consulta cuando te olvidaste de como se hacia algo. No es un gran libro pero esta bueno tenerlo en la biblioteca.
Saludos.
#include <16F84A.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#use delay(clock=4000000)
#BYTE TRISA = 0x85 // Configuramos el TRISA
#BYTE TRISB = 0x86 // Configuramos el TRISB
#BYTE PORTA = 0x05 // Configuramos el PORTA
#BYTE PORTB = 0x06 // Configuramos el PORTB
void main()
{
TRISA = 0xff;
TRISB = 0x00;
bit_set(PORTB,7);
while (true)
{
while (bit_test(PORTB,7)==1)
{
if (PORTA == 0b00000)
{
output_B(0b10111111);
}
if (PORTA==0b00001)
{
output_B(0b10000110);
}
if (PORTA == 0b00011)
{
output_B(0b11011011);
}
if (PORTA == 0b00111)
{
output_B(0b11001111);
}
if (PORTA == 0b01111)
{
output_B(0b01100110);
}
}
while (bit_test(PORTB,7)==0)
{
if (PORTA == 0B01111)
{
output_B(0b01100110);
}
if (PORTA == 0b00111)
{
output_B(0b01001111);;
}
if (PORTA == 0b00011)
{
output_B(0b01011011);;
}
if (PORTA == 0b00001)
{
output_B(0b00000110);
}
if (PORTA == 0X00000)
{
output_B(0b10111111);
}
}
}
}