Autor Tema: Microcursillo en C  (Leído 178992 veces)

0 Usuarios y 4 Visitantes están viendo este tema.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
RE: Microcursillo en C
« Respuesta #180 en: 15 de Diciembre de 2004, 11:25:00 »
Vientos YF-21. Mejor mándale el archivo y el DSN a Modulay a su mail de hotmail. El messenger de arroba no sirve.

Les pongo un programa que lee datos de la memoria 24LC65 y el PIC16F84A los va sacando por el puerto B.

Mi programa es el siguiente (ya corregido):



//Programa que usa protocolo I2C para leer datos de
//la EEPROM I2C 24LC65 de 64kb (8kx8)

//migsantiago



#include <16f84a.h>
#fuses XT, NOWDT, NOPROTECT
#use delay(clock=4000000)

#use fast_io (a)
#use fast_io (b)

#use i2c(MASTER, SDA=PIN_A1, SCL=PIN_A0,slow)


#define hi(x)  (*(&x+1))

//A la EEPROM hay que conectarle:
//A0=0
//A1=0
//A2=0
//Su dirección de llamada I2C será según 24LC65.pdf
// 1 0 1 0 A2 A1 A0
// es decir: 1010000 = 0x50

void main(void)
{

int dato_leido;
int16 retardo;
int16 address_eeprom; //8k palabras

retardo=500; //ms a tardar entre lectura y lectura
address_eeprom=0;

set_tris_a(0x00);
set_tris_b(0x00); //B salida
output_b(0x00); //Limpia B


while(1){

i2c_start(); //Inicia I2C
i2c_write(0xa0); //Direcciona 24LC65 RW=0
i2c_write(hi(address_eeprom)); //Le dice que quiere leer dirección 0x00...
i2c_write(address_eeprom); //00
i2c_start();
i2c_write(0xa1); //RW=1


for(address_eeprom=0;address_eeprom<=8191;address_eeprom++)
   {
   dato_leido = i2c_read(); //Lee actual dirección EEPROM
   output_b(dato_leido); //Saca dato leído en 24LC65
   delay_ms(retardo);
   }

i2c_stop();
}
}




Mi programa lee lo que está grabado en la 24LC65 y pasa dato por dato al puerto B del 16f84a, espera 500ms entre dato y dato. A la 24LC65 de Proteus le cargué la 24C64 porque no hay 65 y aparte le cargué un buffer de información en archivo BIN para que salgan datos.

La dirección con la que hay que llamar a la EEPROM es 1 0 1 0 A2 A1 A0. Para lo cual yo ya conecté A0, A1 y A2 a tierra, lo cual convierte a la dirección en 1010000, es decir, 0x50.

Configuré A0 como SCL y A1 como SDA n el 16f84a. En proteus conecté una PULL-UP a SDA y SCL para asegurar el 1 lógico.



Bueno, hablando de otras cosas... necesito su ayuda... ¿cómo le hago para que en la instrucción PUTS que se usa con RS232 uno pueda mandar RETROCESO?

Cada que PUTS termina de mandar una cadena, manda un ENTER. A mí no me sirve eso, quiero mandar un retroceso para que no baje de línea. También me gustaría que me explicaran porfas cómo le hago para mandar un caracter ASCII al RS232.

Y... otra duda... tengo el C++ para MS-DOS y antes lo corría en windows me y 98, pero he oído que ya no genera las salidas de puertos (outport e inport) en windows XP. ¿Cómo le hago para usar los puertos en XP?

Muchas gracias, espero ser claro en mis preguntas. :]

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
RE: Microcursillo en C
« Respuesta #181 en: 15 de Diciembre de 2004, 11:36:00 »
Escrito originalmente por pocher
Son estas:

RAND()
 
Syntax:
 re=rand()

Parameters:
 None

Returns:
 A pseudo-random integer.

Function:
 The rand function returns a sequence of pseudo-random integers in the range of 0 to RAND_MAX.



Supongo que para muchos de vosotros es un método conocido, pero a mí me ha sorprendido y me ha parecido conveniente publicarlo.

Se trata de un curioso método para generar números aleatorios que alguien ha posteado en la Piclist Latina. Sólo es válido para micros con conversor Analógico/Digital.

El método consiste en dejar la patilla del conversor al aire y hacer una lectura de su valor cuando sea necesario un número aleatorio. La verdad es que he tenido la oportunidad de ver en un osciloscopio la lectura de un A/D al aire y es de lo más aleatorio del mundo.

Bueno, ahí queda eso, por si alguien lo puede aprovechar.

Desconectado David_TGN

  • PIC10
  • *
  • Mensajes: 5
RE: Microcursillo en C
« Respuesta #182 en: 15 de Diciembre de 2004, 15:45:00 »
Hola a todos,

una pregunta,

en PIC 18F252 como detectais mediante la interrupción que tiene el timer0 4,8 microseg? y 0,8 microseg?

es posible hacerlo en C?

bueno,  gracias de antemano,

saludos,

David

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
RE: Microcursillo en C
« Respuesta #183 en: 15 de Diciembre de 2004, 18:13:00 »
Nocturno,no conocía ese método.Probaremos a ver que tal va.
migsantiago,he simulado tu archivo y no se iluminan los led.
A ver si alguien más lo puede probar:

http://personal.auna.com/asencio5/Ejemplos%20C/I2C/

A propósito ¿como funciona eso del archivo bin? me interesa el tema

David,si no me equivoco,para calcular el tiempo de interrupción del timer 0 (8 bits),sería una cosa así:

Frecuencia interrupción timer 0 = Fosc / [4 x preescaler x (256 - valor de carga)]

Siendo:
Fosc = frecuencia del cristal
preescaler = valor del preescaler
valor de carga = valor con el que cargas el timer tras cada interrupción

He colgado un ejemplo en el enlace que te puede venir bien:

http://personal.auna.com/asencio5/Ejemplos%20C/TIMER/

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
RE: Microcursillo en C
« Respuesta #184 en: 15 de Diciembre de 2004, 23:58:00 »
Pues yo también lo he probado y tampoco funciona.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
RE: Microcursillo en C
« Respuesta #185 en: 16 de Diciembre de 2004, 10:07:00 »
Pues la verdad no sé porque luego el Proteus anda haciendo cosas raras con los leds, pero se pueden ver las salidas encender, los cuadritos rojos y azules.

El archivo BIN es el archivo que supuestamente uno le carga en la vida real a la 24LC65, uno lo usa para programarla.

Si quieres ábrelo en WinPic800 y selecciona la memoria 24C64.

Le cargué la siguiente información:

0000: 0000 0001 0002 0003 0004 0005 0006 0007  ........
0008: 0008 0009 000A 000B 000C 000D 000E 000F  ........
0010: 0010 0011 0012 0013 0014 0015 0016 0017  ........
0018: 0018 0019 001A 001B 001C 001D 001E 001F  ........

En realidad son palabras de 8 bits, pero ICProg las muestra como de 16bits... loco

Si no cargara el archivo BIN en Proteus, las salidas en el puerto B del f84 serían puros 00 o puros FF, ya que la memoria no tendría cargado ningún archivo.

Las salidas que tendrán en el puertoB con el BIN cargado son (cada 500ms):

00 01 02 03 04 05 0607 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F

Si alguien llega a saber porque Proteus hace eso con los leds, por favor díganos como corregirlo. Sonrisa Gigante


Y porfas, también ayúdenme con mis dudas en el mensaje anterior. Enfurruñado




Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
RE: Microcursillo en C
« Respuesta #186 en: 16 de Diciembre de 2004, 12:40:00 »
Ahora mismo estoy en un PC q no tiene proteus,pero imagino q para asociar el .bin a la memoria basta con hacer lo mismo q se hace para asociar un hex al pic ¿no?
Con respecto a lo de las cadenas,o bien puedes modificar la librería q contiene dichas funciones,o bien te fabricas tus propias funciones,o bien te dedicas a mandar tus cadenas carácter a carácter con "putc".No se me ocurre alguna otra opción

Desconectado David_TGN

  • PIC10
  • *
  • Mensajes: 5
RE: Microcursillo en C
« Respuesta #187 en: 16 de Diciembre de 2004, 13:43:00 »
Escrito originalmente por Modulay
Nocturno,no conocía ese método.Probaremos a ver que tal va.
migsantiago,he simulado tu archivo y no se iluminan los led.
A ver si alguien más lo puede probar:

http://personal.auna.com/asencio5/Ejemplos%20C/I2C/

A propósito ¿como funciona eso del archivo bin? me interesa el tema

David,si no me equivoco,para calcular el tiempo de interrupción del timer 0 (8 bits),sería una cosa así:

Frecuencia interrupción timer 0 = Fosc / [4 x preescaler x (256 - valor de carga)]

Siendo:
Fosc = frecuencia del cristal
preescaler = valor del preescaler
valor de carga = valor con el que cargas el timer tras cada interrupción

He colgado un ejemplo en el enlace que te puede venir bien:

http://personal.auna.com/asencio5/Ejemplos%20C/TIMER/



Este sistema funciona para familia 16 paero para pic 18 en c? para timer 1 y timer 3?  

saludos

David

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
RE: Microcursillo en C
« Respuesta #188 en: 16 de Diciembre de 2004, 14:36:00 »
David,si a lo que te refieres es a la diferencia entre timer de 8 bits y timer de 16 bits simplemente es cambiar en la fórmula el 256 por un 65536 (16 bits).Esto es válido tanto para los 16 como para los 18,independientemente del lenguaje que uses.Se trata de un cálculo matemático.La forma de aplicarlo al pic ya es cosa de cada lenguaje.En la misma carpeta del ejemplo que puse hay otro ejemplo en C para el timer1

Desconectado YF-21

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 185
RE: Microcursillo en C
« Respuesta #189 en: 16 de Diciembre de 2004, 15:48:00 »
Aunque este mensaje deberia ir en simuladores, quisiera preguntar

¿Como se emulan las terminales del PC en proteus? o no se puede

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
RE: Microcursillo en C
« Respuesta #190 en: 17 de Diciembre de 2004, 11:00:00 »
YF-21, Modulay me hizo el archivo Proteus del RS232, yo no sabía que existía la hyperterminal en Proteus, si quieres chécalo:

http://personal.auna.com/asencio5/Ejemplos%20C/RS232/RS232_2%20por%20migsantiago.zip



Sí Modulay, el .BIN sólo se asocia a la EEPROM justo como los HEX o los COF se asocian a los PICS. Y ya corregí el programa porque en protoboard no me quedaba.

Tendré que checar la combinación de caracteres ASCII para el retroceso, porque en la tabla ASCII no viene, es una combinación de teclas, pero no me la sé.




Sobre lo del C++ de MS-DOS, ¿no saben si se pueden usar los puertos paralelo y serial en Windows XP?

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
RE: Microcursillo en C
« Respuesta #191 en: 18 de Diciembre de 2004, 00:45:00 »
No sé si funcionará, pero en MS-DOS el ASCII del retroceso era el 8 decimal, o sea, el octavo carácter de la tabla ASCII: CHR(8)

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
RE: Microcursillo en C
« Respuesta #192 en: 19 de Diciembre de 2004, 13:01:00 »
OK, gracias Nocturno, lo voy a checar.

Sobre lo de Turbo C de MS-DOS, ya compilé un programa que lee el puerto serial (lo que manda un PIC16f877a) y ya me muestra la información en pantalla... no sé como... pero pude usar el puerto serial sin que XP se pusiera rudo.

Tal vez sólo sea en mi compu, porque he leído que en otras no se puede.

Desconectado tornar

  • PIC18
  • ****
  • Mensajes: 342
RE: Microcursillo en C
« Respuesta #193 en: 20 de Diciembre de 2004, 09:54:00 »
Aqui os dejo un programilla que hice anoche, se trata del tipico juego de hacer parejas, tu introduces por teclado un numero del 1 al 6, y te sale un nombre, que tienes que enlazar con otro igual, cuando te aburras de jugar, pulsa 0 y puedes ver el numero de aciertos obtenidos.

Este programa ha sido probado por mi con el micropic trainer y micropic trainer plus, con las librerias KBD.C y LCD.C modificadas, por lo que no se si para que os funcione debereis cambiar algo.

#include <16f84a.h>
#fuses NOWDT,NOPROTECT,Xt
#use delay (clock=4000000)

#include <KBD.C>
#include <LCD.C>
#include <string.h>

main()
{
 char nombre[3][8];
 char k;
 int par[2]={8,9};
 int last[2]={0,0};
 int cont=0; //contador de aciertos

 strcpy(nombre[0],"Neo");
 strcpy(nombre[1],"Morpheo");
 strcpy(nombre[2],"Trinity");

 lcd_init();
 lcd_gotoxy(0,1);
 printf(lcd_putc,"--MATRIX LINKS--
");
 printf(lcd_putc,"num(1-6):");
 WHILE (1)
 {
  IF ((last[0]+last[1]>=2) && (par[0] != par[1])) //Condicion de derrota
  {
   par[0]=8;
   par[1]=9;
   last[0]=0;
   last[1]=0;
  }

  IF (par[0]==par[1]) //Condicion de Victoria
  {
   cont+=1;
   printf(lcd_putc,"GRATS");
   delay_ms(1000);
   par[0]=8;
   par[1]=9;
   last[0]=0;
   last[1]=0;
   lcd_putc("f");
   lcd_gotoxy(0,1);
   printf(lcd_putc,"--MATRIX LINKS--
");
   printf(lcd_putc,"num(1-6):");
  }

  lcd_gotoxy(10,2);
  k=kbd_getc();
  IF (k)
  {
   switch (k)
   {
    case "0": lcd_putc("f"); printf(lcd_putc,"  Has obtenido
   %d aciertos",cont);
              delay_ms(2000);
              sleep();
              break;
    case "1": printf(lcd_putc,"%s",nombre[0]); par[0]=1; last[0]+=1; delay_ms(1000); break;
    case "2": printf(lcd_putc,"%s",nombre[1]); par[0]=2; last[0]+=1; delay_ms(1000); break;
    case "3": printf(lcd_putc,"%s",nombre[2]); par[0]=3; last[0]+=1; delay_ms(1000); break;
    case "4": printf(lcd_putc,"%s",nombre[0]); par[1]=1; last[1]+=1; delay_ms(1000); break;
    case "5": printf(lcd_putc,"%s",nombre[1]); par[1]=2; last[1]+=1; delay_ms(1000); break;
    case "6": printf(lcd_putc,"%s",nombre[2]); par[1]=3; last[1]+=1; delay_ms(1000); break;
   }
   lcd_putc("f");
   lcd_gotoxy(0,1);
   printf(lcd_putc,"--MATRIX LINKS--
");
   printf(lcd_putc,"num(1-6):");
  }
 }
}


Desconectado YF-21

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 185
RE: Microcursillo en C
« Respuesta #194 en: 21 de Diciembre de 2004, 15:18:00 »
Regresando al tema de las preguntas ...

Ya me baje el datasheet del reloj, junto con subrutinas del picc que me encontre en el foro. He visto algunos diagramas de pic con el DS1307 y todos llevan una eeprom serial conectada al DS1307 pero yo no entiendo el motivo.

El ds1307 tiene memoria ram para el almacenaje de los datos, asi que no le veo el caso anexarle una eeprom serial (excepto cuando se pierda la energia se podria hacer el respaldo del tiempo en la eeprom,< pero grabarla cada segundo? (ademas creo que para eso esta la bateria (respaldo)).

Conclusion: Creo que es mejor usar el reloj sin eeprom externa, o no??

(Por cierto, aun no he conectado el reloj porque me falta el cristal Vacilando)