TODOPIC

Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: AuPata en 26 de Marzo de 2011, 19:06:27

Título: Leer y almacenar datos en MikroC
Publicado por: AuPata en 26 de Marzo de 2011, 19:06:27
Reciban todos un cordial saludo.

Soy nueva en el entorno de MikroC, y hasta el momento me ha parecido muy bueno. Me estoy enfrentando a un problema y es que deseo leer los datos que entran por un pin del micro, por ejemplo PORTB.F0, estos datos irlos almacenando, cuando reciba 8 bits armar una palabra y mostralo por un puerto con leds.

Será que alguien podría ayudarme con las instrucciones de lectura en MikroC, por favor??? Y con todo lo demás! muchisimas gracias

Título: Re: Leer y almacenar datos en MikroC
Publicado por: bigluis en 26 de Marzo de 2011, 20:00:32
Puedes hacer lo siguiente
Código: [Seleccionar]
for(i=8;i--;){       //Para i igual a 8 hasta i igual a 1;
   aux<<=1;          //Desplazamos 1 bit a la izquierda la variable aux
   aux.F0=PORTB.F0;  //El bit 0 de aux sera igual al bit 0 de PORTB
   }
PORTC=aux;

Aunque si no me equivoco lo que tu deseas hacer es transmisión SPI o Serial, por lo cual puedes utilizar el módulo de transmisión SPI que traen algunos PIC y resolver esto mejor.
Título: Re: Leer y almacenar datos en MikroC
Publicado por: AuPata en 26 de Marzo de 2011, 20:24:04
Gracias por sacar de tu tiempo y ayudarme!

Específicamente estoy trabajando sobre el siguiente ejemplo: por el pin E0 estoy enviando una trama de datos, en este caso 10011010, esto lo pongo como entrada en el pin A0, y lo que deseo es esperar a que por AO me lleguen los 8 bits, armar la "palabra"y por el puerto C puede ser escribir esto mismo, 10011010.  Pongo algunos leds testigo, y esto es lo que no he podido, coger los datos.

En lo que me enviaste aux es una variable? de que tipo?
Realmente es de gran ayuda para mi, muchisimas gracias!!!


int i, aux=0;

void salidatos(){
 PORTE.F0=0;
 PORTE.F1=0;
for (i=0; i<=2; i++)
{
PORTE.F1=1      ;

PORTE.F0 = 1;
Delay_ms(50);
PORTE.F0 = 0;
Delay_ms(50);
PORTE.F0 = 0;
Delay_ms(50);
PORTE.F0 = 1;
Delay_ms(50);
PORTE.F0 = 1;
Delay_ms(50);
PORTE.F0 = 0;
 Delay_ms(50);
PORTE.F0 = 1;
Delay_ms(50);
PORTE.F0 = 0;
 Delay_ms(50)   ;

PORTE .F1=0;
Delay_ms(100);
   }
   }
void main ( void )

{
TRISE = 0;
TRISC=0;
TRISA=1;

     PORTA.F0=1;

 Delay_ms(50);
     salidatos();



}
 
Título: Re: Leer y almacenar datos en MikroC
Publicado por: bigluis en 27 de Marzo de 2011, 19:25:13
El tipo de transmisión serie más simple que conosco es SPI (Serial Perpheral Interface), esta utliza 4 pines para realizar la transmisión, estos son:

En la todos los protocolos de transmisión serie siempre existe un dispositivo Master y un Dispositivo Slave, el dispositivo Master controla toda la transmisión el Slave unicamente recive ordenes.

Para realizar una transmisión el Master debe generar una señal de reloj mediante SCK y el slave recibirla, Mediante el pin SDO el Master envia los datos a transmitir y mediante el pin SDI recibe los datos del Slave.

La señal de reloj sirve para que ambos dispositivos se sincronicen y puedan entenderse, ya que cada bit se recibe o transmite en uno de los flancos del reloj.

Te recomiendo que busques un poco más de información.

En MikroC para transmitir un dato debes utilizar la función SPI_write(byte) y para leer un dato debes utilizar la función byte=SPI_read().

Título: Re: Leer y almacenar datos en MikroC
Publicado por: AuPata en 28 de Marzo de 2011, 12:40:25
De nuevo muchas gracias por las respuestas, realmente lo que estoy haciendo es trabajando con el sensor SHT 71, este es un sensor que trabaja con el protocolo wire to wire. Tiene dos pines de "control", así como mencionabas con SCK y uno de datos. Hasta el momento estoy programando para realizar el ejemplo de leer humedad que sale en el datasheet. http://www.sensirion.com/en/pdf/product_information/Datasheet-humidity-sensor-SHT7x.pdf . Página 7.

El sensor simulado en proteus, ya recibe datos, lo que no he podido hacer es que los lea y los escriba para poder hacer la ecuación, lo hice de esta manera, pero no me funciona, por eso decidí devolverme e intentar realizar el ejemplo que anteriormente pregunte.

Así se lee el dato que ingresa por el pin E0, mientras E1 es el sck!


Código: [Seleccionar]
unsigned short ReadGen(){//
unsigned short Read = 0;//
TRISE.F0 = 1; // DATA COMO ENTRADA

PORTE.F1 = 1;
Delay_us(50);
Read.F7 = PORTE.F0;
Delay_us(50);
PORTE.F1 = 0;
Delay_us(100);
PORTE.F1 = 1;
Delay_us(50);
Read.F6 = PORTE.F0;
Delay_us(50);
PORTE.F1 = 0;
Delay_us(100);
PORTE.F1 = 1;
Delay_us(50);
Read.F5 = PORTE.F0;
Delay_us(50);
PORTE.F1 = 0;
Delay_us(100);
PORTE.F1 = 1;
Delay_us(50);
Read.F4 = PORTE.F0;
Delay_us(50);
PORTE.F1 = 0;
Delay_us(100);
PORTE.F1 = 1;
Delay_us(50);
Read.F3 = PORTE.F0;
Delay_us(50);
PORTE.F1 = 0;
Delay_us(100);
PORTE.F1 = 1;
Delay_us(50);
Read.F2 = PORTE.F0;
Delay_us(50);
PORTE.F1 = 0;
Delay_us(100);
PORTE.F1 = 1;
Delay_us(50);
Read.F1 = PORTE.F0;
Delay_us(50);
PORTE.F1 = 0;
Delay_us(100);
PORTE.F1 = 1;
Delay_us(50);
Read.F0 = PORTE.F0;
Delay_us(50);
PORTE.F1 = 0;
Delay_us(100);
//TRISE.F0 = 0;
//PORTE.F0 = 0;
//PORTE.F1 = 1;
//Delay_us(100);
//PORTE.F1 = 0;
//Delay_us(100);
TRISE.F0 = 0;
return Read;
}]

Después de tener Read hago, PORTC=Read. Pero no me sale nada, de nuevo muchas gracias por la ayuda!
Título: Re: Leer y almacenar datos en MikroC
Publicado por: AuPata en 28 de Marzo de 2011, 12:41:09
De nuevo muchas gracias por las respuestas, realmente lo que estoy haciendo es trabajando con el sensor SHT 71, este es un sensor que trabaja con el protocolo wire to wire. Tiene dos pines de "control", así como mencionabas con SCK y uno de datos. Hasta el momento estoy programando para realizar el ejemplo de leer humedad que sale en el datasheet. http://www.sensirion.com/en/pdf/product_information/Datasheet-humidity-sensor-SHT7x.pdf . Página 7.

El sensor simulado en proteus, ya recibe datos, lo que no he podido hacer es que los lea y los escriba para poder hacer la ecuación, lo hice de esta manera, pero no me funciona, por eso decidí devolverme e intentar realizar el ejemplo que anteriormente pregunte.

Así se lee el dato que ingresa por el pin E0, mientras E1 es el sck!


Código: [Seleccionar]
unsigned short ReadGen(){//
unsigned short Read = 0;//
TRISE.F0 = 1; // DATA COMO ENTRADA

PORTE.F1 = 1;
Delay_us(50);
Read.F7 = PORTE.F0;
Delay_us(50);
PORTE.F1 = 0;
Delay_us(100);
PORTE.F1 = 1;
Delay_us(50);
Read.F6 = PORTE.F0;
Delay_us(50);
PORTE.F1 = 0;
Delay_us(100);
PORTE.F1 = 1;
Delay_us(50);
Read.F5 = PORTE.F0;
Delay_us(50);
PORTE.F1 = 0;
Delay_us(100);
PORTE.F1 = 1;
Delay_us(50);
Read.F4 = PORTE.F0;
Delay_us(50);
PORTE.F1 = 0;
Delay_us(100);
PORTE.F1 = 1;
Delay_us(50);
Read.F3 = PORTE.F0;
Delay_us(50);
PORTE.F1 = 0;
Delay_us(100);
PORTE.F1 = 1;
Delay_us(50);
Read.F2 = PORTE.F0;
Delay_us(50);
PORTE.F1 = 0;
Delay_us(100);
PORTE.F1 = 1;
Delay_us(50);
Read.F1 = PORTE.F0;
Delay_us(50);
PORTE.F1 = 0;
Delay_us(100);
PORTE.F1 = 1;
Delay_us(50);
Read.F0 = PORTE.F0;
Delay_us(50);
PORTE.F1 = 0;
Delay_us(100);
//TRISE.F0 = 0;
//PORTE.F0 = 0;
//PORTE.F1 = 1;
//Delay_us(100);
//PORTE.F1 = 0;
//Delay_us(100);
TRISE.F0 = 0;
return Read;
}]

Después de tener Read hago, PORTC=Read. Pero no me sale nada, de nuevo muchas gracias por la ayuda!
Título: Re: Leer y almacenar datos en MikroC
Publicado por: bigluis en 28 de Marzo de 2011, 18:36:44
Existen muchos tipos de transmisión serie, el otro tipo sumamente utilizado es la transmisión I2C, este tipo se caracteriza por utilizar solo dos pines para la transmisión, los cuales son SCK o SCL que transmite la señal de reloj y DATA o SDA que sirve para transmitir y recibir datos, es decir es un tipo de transmisión Half-duplex (si no me equivoco).

Algunos MCU como el PIC16F887 traen un módulo de transmisión I2C integrado que les permite realizar este tipo de comunicación, para programarlos con MikroC es necesario utilizar las siguientes funciones:

I2C1_init(const unsigned long clock);
Se utiliza para inicializar el módulo a una velocidad de reloj determinada por el valor clock que le ingreses.

unsigned short I2C1_Start(void);
Inicia la transmisión I2C y retrona 0 si no ocurre ningun error.

void I2C1_Repeated_Start(void);
Se utiliza si es necesario reiniciar la transmisión despues de haberla terminado.

unsigned short I2C1_Is_Idle(void);
Se utiliza para ver si otro dispositivo no ha iniciado transmisión I2C. Retorna 1 si esta libre de lo contrario retorna 0.

unsigned short I2C1_Rd(unsigned short ack);
Lee el dato recibido del dispositivo esclavo y envia una señal de no acuse si el parametro ack es 0, de lo contrario envia la señal de acuse.

unsigned short I2C1_Wr(unsigned short data_);
Escribe un dato en el dispositivo esclavo y retorna 0 si no hay errores.

Por los momentos solo escribire esto, te recomiendo que leas un poco mas sobre comunicación I2C, luego escribire algo mas ya que debo leer la hoja de datos del dispositivo para siguirte ayudanto.

Otra cosa que te recomiendo es que mires el ejemplo que trae la Ayuda de MikroC.
Título: Re: Leer y almacenar datos en MikroC
Publicado por: AuPata en 28 de Marzo de 2011, 19:45:45
Una vez más gracias por la ayuda!

En el datasheet mencionan lo siguiente:

The sensor cannot be addressed by I2C protocol, however, the sensor can be connected to an I2C bus without interference with other devices connected to the bus.

Mencionan que el protocolo es Wire to Wire.
Communication digital 2-wire interface.