Programación con MikroC

hola bampi13 en este ya esta corregido el error creo que era de configuración del adc
saludos
PHP:
unsigned int temp_res_1,temp_res_2;

void main() {
ADCON1 =192;
ADCON0 =128;
TRISA  =0xff;
TRISB  = 0;                 // PORTB is output
TRISC  = 0x00;              // Pins RC7, RC6 are outputs
PORTB=0;
PORTC=0;

do {
    temp_res_1 = ADC_Read(0);   // Get 10-bit results of AD conversion
    temp_res_2 = ADC_Read(1);   // Get 10-bit results of AD conversion
    

    if(temp_res_1>temp_res_2){
      PORTB.F0=1;
      PORTB.F1=0;
      PORTB.F2=0;
    }
    if(temp_res_1<temp_res_2){
      PORTB.F0=0;
      PORTB.F1=1;
      PORTB.F2=0;
     }
else if(temp_res_1==temp_res_2){
        PORTB.F0=0;
        PORTB.F1=0;
        PORTB.F2=1;
        }
  } while(1);
}
 
Modifique algo mas y ya me esta funcionanado ademas de que le agregue algunas cosas ,pero cuando lo programe el pic con es eprog , no funciona bn , pero en proteus si funciona bien , ahora lo unico que me falta es enviar esos datos de la temperatura via serial y noce como ahcerlo. aver si me echarian una manito con eso.

PHP:
int cnt,x,habitacion,ambiente,db;
void usuario()
{
if(PORTB.F6==1) //RB6 Usuario
{
PORTB.F5=0;
PORTB.F4=0;
PORTB.F3=1;
cnt++;
Delay_ms(1000);
}
else
{
PORTB.F5=1;
PORTB.F4=0;
PORTB.F3=0;
cnt=0;
}
while(cnt>10){
if(PORTB.F6==0 && PORTB.F7==0)
{
PORTB.F3=0;
PORTB.F4=1;
delay_ms(500);
PORTB.F4=0;
delay_ms(500);
}
else
{
PORTB.F4==0;
PORTB.F5==1;
}
if(PORTB.F6==0 && PORTB.F7==1)
{
x=1;
PORTB.F4=1;
delay_ms(1000);
}
if(PORTB.F7==0 && x==1)
{
PORTB.F4=0;
PORTB.F5=1;
cnt=0;
x=0;
}
}
}

ESTA PARTE ES LA QUE DESEO ENVIAR SERIALMENTE OSEA LOS CAMBIOSQUE PASEN POR EJEMPLO EN EL PRIMER IF QUE SI LA TEMPERATURA ESTA ENTRE 32 GRADOS Y 44 HAGA ESO , TENGO QUE ENVIAR ESO A LA PC Y CON VISUAL BASIC SABERLO PARA MOSTRARLO. EL PUNTO ES QUE NO CE COMO UTILISAR EL TX Y EL RX DE EL PIC 16F877A.

PHP:
void main()
{
ADCON1=0x8D;   //codigo para 4 entradas analogas
TRISA=15;     //usar 4 entradas
CMCON=0;     //activar analogas""
INTCON=0;  // apagar las interrupciones
TRISB=0b11000000;
PORTB=0;
while(1)
{
habitacion=ADC_Read(0);
ambiente=ADC_Read(1);
usuario();
if((habitacion>604 && habitacion<856)&& ambiente<habitacion)
{

while (db!=10)
{
usuario();
PORTB.F0=1;
PORTB.F1=0;
db++;
delay_ms(1000);
}
if(!(habitacion>438 && habitacion<456))
{
while(!(habitacion>438 && habitacion<456)){
usuario();
PORTB.F0=0;
PORTB.F1=1;
PORTB.F2=0;
habitacion=ADC_Read(0);
}
}
else {
usuario();
PORTB.F0=0;
PORTB.F1=0;
}
}
else{
usuario();
PORTB.F0=0;
PORTB.F1=0;
}

if(habitacion>856 && ambiente<habitacion)
{
while (!(habitacion>604 && habitacion<622)){
usuario();
PORTB.F0=0;
PORTB.F1=1;
habitacion=ADC_Read(0);
}
}
if((habitacion>604 && habitacion<622) && habitacion==ambiente)
{
usuario();
PORTB.F0=0;
PORTB.F1=0;
}
}
}
 
Última edición por un moderador:
Hola, amigos;

Estoy tratando de configurar el ENC28J60 en un PIC18F452 bajo MikroC. Funciona todo perfecto, el único problema es que el PIC se reinicia solito cuando llega a la rutina de adquisición de datos. Probé con un PIC16F877A y no se reinicia, pero cuando lo cambio al 18F452, si. A continuación les dejo el código simple que utilicé:


Código:
// Definición de pines para la conexión del LCD
sbit LCD_RS at RD0_bit;
sbit LCD_EN at RD1_bit;
sbit LCD_D7 at RD7_bit;
sbit LCD_D6 at RD6_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D4 at RD4_bit;

// Dirección de pines
sbit LCD_RS_Direction at TRISD0_bit;
sbit LCD_EN_Direction at TRISD1_bit;
sbit LCD_D7_Direction at TRISD7_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D4_Direction at TRISD4_bit;

//Tipo de Duplex Ethernet
#define Spi_Ethernet_HALFDUPLEX     0x00  // half duplex
#define Spi_Ethernet_FULLDUPLEX     0x01  // full duplex

// Definición de pines del ENC28J60
sfr sbit SPI_Ethernet_Rst at RC0_bit;
sfr sbit SPI_Ethernet_CS  at RC1_bit;
sfr sbit SPI_Ethernet_Rst_Direction at TRISC0_bit;
sfr sbit SPI_Ethernet_CS_Direction  at TRISC1_bit;
// end ethernet NIC definitions

// Variables de configuración de la red
unsigned char ethMac[6] = {0x00, 0x14, 0xA5, 0x76, 0x19, 0x3b};       // my MAC address
unsigned char ethIp[4]  = {10, 0, 0, 3};                       // my IP address
unsigned char ethMask[4] = {255, 255, 255, 0};                        // Mask
unsigned char ethGw[4] = {10, 0, 0, 1};                          // Gateway
unsigned char ethDns[4] = {10, 0, 0, 1};                         // DNS
unsigned char getRequest[15];                                         // HTTP request buffer
unsigned char dyna[30];                                               // buffer for dynamic response
unsigned long httpCounter = 0;                                        // counter of HTTP requests

int i = 0;

//Procesa peticiones TCP
unsigned int SPI_Ethernet_UserTCP(unsigned char *remoteHost, unsigned int remotePort, unsigned int localPort, unsigned int reqLength,char *canClose);
//Procesa peticiones UPD
unsigned int SPI_Ethernet_UserUDP(unsigned char *remoteHost, unsigned int remotePort, unsigned int destPort, unsigned int reqLength);

//Procesa peticiones TCP
unsigned int SPI_Ethernet_UserTCP(unsigned char *remoteHost, unsigned int remotePort, unsigned int localPort, unsigned int reqLength,char *canClose){
      return 0;
}

//Procesa peticiones UDP (ARP+ICMP)
unsigned int SPI_Ethernet_UserUDP(unsigned char *remoteHost, unsigned int remotePort, unsigned int destPort, unsigned int reqLength){
      return 0;
}


void main() {

     ADCON0 |= 0x0F;                 // turn off ADC convertors

     PORTA = 0;
     TRISA = 0xff;          // set PORTA as input for ADC

     TRISD = 0;                          //PORTD como salida
     PORTD = 0;


       /*
     * initialize ethernet board
     * start ENC28J60 with :
     * reset bit on RC0
     * CS bit on RC1
     * my MAC & IP address
     * full duplex
     */


     //Esto es simplemente para probar que el PIC está OK.
    for(i=0;i<=2;i++){
         PORTD.F2 = 1;
         Delay_ms(500);
         PORTD.F2 = 0;
         Delay_ms(500);
    }
    Spi1_Init();
    SPI_Ethernet_Init(ethMac, ethIp, Spi_Ethernet_FULLDUPLEX) ;
    SPI_Ethernet_confNetwork(ethMask, ethIp, ethDns);
    while(1){
         SPI_Ethernet_doPacket();   // Procesa los paquetes entrantes
    }

}

A alguien le pasó lo mismo? Verifiqué las tensiones para ver si se disparaba el Brown-out, pero está todo en condiciones; y como les dije, pasa solo con el PIC18F452.
Agradeceré cualquier ayuda.

Saludos :)
 
Hola cristiancrm mira sinceramente no encuentro otra explicacion a tu problema mas que ver si la pata MCLR esta a positivo... pero si encuentro algo mas te aviso...


Hola tigre9226 dime piensas hacer algo asi como una caja fuerte de 4 digitos con un keypad?? dime que es lo que quieres exactamente y que llevas hecho...


Saludos...
 
Hola a ver si alguien me puede ayudar estoy usando el mikroc y tengo que guardar datos que me entrega el sensor de temperatura ds18b20 en la eeprom 24lc256, pero tengo un problema no logro visualizar los datos en la memoria, tengo entendido que tengo que separar los datos del sensor, porque son 2 bits y la memoria es 1 bits, alguien sabe como puedo hacer eso?.
De antemano Gracias!
 
hola yo nuevamente aún no encuentro la soucion a mi problema,necesito guardar las medidas de temperaturas o las variaciones de temperatura que presenta el ds18b20 ojalá en una memoria eeprom externa como la 24lc256,pero no sé como hacerlo,esto es lo unico que me está atrasando con mi proyecto de título..estoy trabajando con mikroc y proteus para simular,por favor alguien que utilice el mikroc que me ayude.
De antemano gracias!
 
hola yo nuevamente aún no encuentro la soucion a mi problema,necesito guardar las medidas de temperaturas o las variaciones de temperatura que presenta el ds18b20 ojalá en una memoria eeprom externa como la 24lc256,pero no sé como hacerlo,esto es lo unico que me está atrasando con mi proyecto de título..estoy trabajando con mikroc y proteus para simular,por favor alguien que utilice el mikroc que me ayude.
De antemano gracias!
Cual es tu problema en concreto? el código?, El mikroC tiene librerías para manejar dispositivos con bus "OneWire" e "I2C" para el sensor y la memoria respectivamente.
 
Hola,gracias por responder,si la verdad es que he probado varios codigos y no me funcionan,utilizo i2c.
Lo otro es que como guardo la variable del sensor en la eeprom o sea como hago para que me lea los datos del sensor,eso no sé.
gracias


Mi principal problema es adquirir datos del sensor y guardarlos.
 
El MikroC tiene hasta un ejemplo de la "OneWire Library" con el mismo sensor incluido un circuito de prueba, has visto eso?...
De otro modo, creo que ya lo tendrías que implementar manualmente. En el foro hay ejemplos usando el mismo sensor.

saludos.
 
Sí, si vi el ejemplo,pero eso es solo para obtener la temperatura del lugar que quieras tomarla,yo eso ya lo tengo todo listo yo puedo ver la temperatura de los dormitorios,living etc,lo que necesito es guardar esos datos,por ejemplo en un block de notas que salga algo asi:
25ºC
26ºC
25ºC
27ºC
..........etc..con el fin de hacer graficos y comparar los cambios de temperaturas que hay.
 
Block de notas?, bueno es decir, lo que buscas es guardar por ejemplo 25 (se sobreentiende que son grados) en la memoria EEPROM externa?. Si es así, creo que te conviene guardarlos tal y como se obtienen del sensor, guardando en la memoria 2 bytes (creo 10bits de resolución) por cada valor obtenido.

En el programa, antes de guardar en la memoria se tendría que verificar que la nueva temperatura sea distinta a una anterior para evitar que se llene la memoria demasiado rápido.

Con block de notas entiendo que eso lo vas a mandar a una PC, en ese caso el PIC esperaría a que la memoria se llene con datos válidos para luego enviarlos a la PC pero está vez convertidos a un valor legible de temperatura (25°C, 26°C, etc)...
 
Una forma fácil de enviar datos del PIC a la PC es por medio del puerto serie, sobre eso hay bastante en el foro. Para tratar esos datos en la PC necesitaras un programa de PC, intenta con esto Manual Puerto serie RS232 controlado por Visual C# o este Como usar puerto Serie en VBA (Excel).

Cuando practiques la recepción de los datos usa el hyperterminal ¿Cómo configurar la hyperterminal para comunicación serial?.
Con lo del sensor, guarda en la memoria el dato válido (de 2 en 2 ya que cada lectura ocupa 2bytes) y cuando esta se llene la envías a la PC pero convertido en temperatura.

saludos.
 
Hola a todos :),
soy nuevo en el tema de ADC, y pues estoy tratando de utilizar un sensor de proximidad en un proyecto de la escuela.

Estuve viendo el codigo que corrigieron para darme una idea de como funcionaba el ADC, pero la verdad no comprendo los valores de ADCON1 y ADCON0.

/*
ADCON1=192; //<- valores
ADCON0=128; //<- valores
*/

No se si me pudieran explicar por que pusieron esos valores, para darme una idea del funcionamiento de ADCON1 y ADCON0.

Gracias a todos XD.
 
Estuve viendo el codigo que corrigieron para darme una idea de como funcionaba el ADC, pero la verdad no comprendo los valores de ADCON1 y ADCON0.

/*
ADCON1=192; //<- valores
ADCON0=128; //<- valores
*/

No se si me pudieran explicar por que pusieron esos valores, para darme una idea del funcionamiento de ADCON1 y ADCON0.
Siempre trabaja con la hoja de datos del dispositivo.
Por ejemplo para el PIC16F877A:
- En el registro ADCON1 se configura los pines que van a ser entradas análogas, la justificación del resultado y la velocidad de conversión.
- En el registro ADCON0 se configura la velocidad de conversión, el canal o pin del cual se a a obtener el valor a convertir, se obtiene o establece el estado del módulo y el encendido/apagado del módulo.

Entonces:
ADCON1=192; //<- En binario es 0b11000000 y viendo el registro en el datasheet se establece:
- La justificación del resultado es a la derecha.
- La velocidad de conversión es de (Fosc/4, Fosc/16, Fosc/64 o Interno RC).
- Todos los pines son entradas análogas.

ADCON0=128; //<- En binario es 0b10000000.
- Se complementa la velocidad establecida en ADCON1, entonces la velocidad escogida es Fosc/64.
- Se leerá el canal cero (0).
- Con la conversión detenida.
- Y el módulo apagado.
 
Muchas gracias ByAxel, la verdad me sirvio mucho lo que me acabas de decir. Estuve checando la datasheet y ya todo tiene sentido XD WOOOTT!!!.

De nuevo muchisimas gracias :), y pues espero que todos esten bien :).
 
disculpen hay alguien que me podria ayudar es que quisiera saber como puedo programar en basic estuve ocupando el microcode pero no se si es solo la version que tengo pero solo me deja compilar 31 lineas la verdad quisiera saber si alguien me puede pasar una version que pueda compilar programas mas grandes o si me recomiendan algun otro programa
de antemano gracias
 
disculpen hay alguien que me podria ayudar es que quisiera saber como puedo programar en basic estuve ocupando el microcode pero no se si es solo la version que tengo pero solo me deja compilar 31 lineas la verdad quisiera saber si alguien me puede pasar una version que pueda compilar programas mas grandes o si me recomiendan algun otro programa
de antemano gracias

Bienvenido.
Revisa: Curso programacion de pic en bsic pro... los programas usados son el compilador PicBasicPro 2.6 y el IDE de MicrocodeStudio 4... ambos se complementan.

Otros (ni mejor ni peor)...
- Proton IDE Basic > http://www.protonbasic.co.uk/
- MiKroBasic > http://www.mikroe.com/eng/products/view/9/mikrobasic-pro-for-pic/
- PicSimulatorIDE > http://www.oshonsoft.com/pic.html

Las "Reglas del foro" impiden poner links con crack y esas cosas...

saludos.
 
Muchas gracias ByAxel es justo lo que me falta hacer,pero mi problema es el siguiente que yo utilizo la libreria on-wire y la lectura del sensor se guarda en distintas variables las que finalmente visualizo por la pantalla lcd,entonces como estoy utilizando la memoria i2c 24lc256 realizo el programa así:

I2C1_Init(100000); // initialize I2C communication
I2C1_Start(); // issue I2C start signal
I2C1_Wr(0xA0); // send byte via I2C (device address + W)
I2C1_Wr(0x00); // send byte (address of EEPROM location)
i2c1_wr(0x00);
i2c1_wr(temp); //esta variable hace que se visualize la temperatura en el lcd,pero en la eeprom no veo la temperatura correcta veo otra.
I2C1_Stop(); // issue I2C stop signal
Delay_100ms();

I2C1_Start(); // issue I2C start signal
I2C1_Wr(0xA0); // send byte via I2C (device address + W)
I2C1_Wr(0x00); // send byte (data address)
I2C1_Repeated_Start(); // issue I2C signal repeated start
I2C1_Wr(0xA1); // send byte (device address + R)
PORTA = I2C1_Rd(0u); // Read the data (NO acknowledge), en este puerto ta conectado el ds18b20
I2C1_Stop(); // issue I2C stop signal

yo creo que no estoy guardando lo que se debe guardar y no sé como hacerlo.
Por favor si alguien mas me puede ayudar se lo agradeceré inmensamente.
 
Atrás
Arriba