Autor Tema: Calculo de paridad PIC 18F4550 en lenguaje C  (Leído 6685 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Elessar_Felagund

  • PIC10
  • *
  • Mensajes: 12
Calculo de paridad PIC 18F4550 en lenguaje C
« en: 21 de Abril de 2009, 09:47:04 »
Hola muy buenas a todos. :-/

Hace un mes que he empezado a estudiar programacion en C y de PICs para el proyecto que me han encargado en las practicas que estoy realizando en una empresa y aunque he conseguido avanzar un poco estoy un poco perdido en algunos puntos. :?

Trabajo en un proyecto con el PIC18F4550 que viene en la placa PICDEM FS USB. Estoy programando en C con MPLAB C18 C Compiler.

Por el puerto D tengo una entrada de datos en paralelo, 8 bits.

Lo que tengo que hacer es calcular la paridad de ese byte que recibo por el puerto D :shock:, esa paridad sera 1 si hay un numero impar de unos.

Una vez calculada la paridad tengo que poner ese bit de paridad en el bit 0 de otro byte y despues juntar esos dos bytes para formar una palabra de 16 bits, en los que el bit 0 sera el bit de paridad, los bits 1 a 7 se dejan a 0 y los bit 8 a 15 son los que he recibido por el puerto D. :(

Mi pregunta es si alguien me puede decir como calculo la paridad del primer byte, como pongo el valor de la paridad en el bit 0 del byte de paridad y como uno los dos bytes para formar una palabra de 16 bits.

Muchas gracias por vuestras respuestas. :-)

Nunca antes habia estudiado nada de programacion y esto de los PIC me parece un trabajo de chinos :? :shock: :(, asi es que agradezco enormemente vuestra ayuda porque imagino que para dominar el tema habreis tenido que dedicarle muchisimas horas de esfuerzo.

Un saludo.

Francisco.

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Calculo de paridad PIC 18F4550 en lenguaje C
« Respuesta #1 en: 21 de Abril de 2009, 18:04:24 »
Bueno, como tu problema es un caso particular de un tema mucho mas genérico que es el de las paridades, y su cálculo, voy a aprovechar y así escribo una de mis conocidas novelas, en esta ocasión dedicada a este tema.

Cuando esté listo vuelvo por aquí y te pongo el correspondiente enlace.  :mrgreen:

Nota: Los ejemplos los pondré en CCS C porque nunca he trabajado con el C18 pero intentaré ser lo mas claro posible, sobre todo en los conceptos.
« Última modificación: 21 de Abril de 2009, 18:06:56 por RedPic »
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Calculo de paridad PIC 18F4550 en lenguaje C
« Respuesta #2 en: 22 de Abril de 2009, 00:03:22 »
Esperando con muchas ansias  :mrgreen:
El papel lo aguanta todo

Desconectado Elessar_Felagund

  • PIC10
  • *
  • Mensajes: 12
Re: Calculo de paridad PIC 18F4550 en lenguaje C
« Respuesta #3 en: 22 de Abril de 2009, 04:08:18 »
Muchas gracias. :-) Aver si asi se me aclaran las ideas.

Desconectado Elessar_Felagund

  • PIC10
  • *
  • Mensajes: 12
Re: Calculo de paridad PIC 18F4550 en lenguaje C
« Respuesta #4 en: 23 de Abril de 2009, 04:53:04 »
Por cierto, mientras RedPic desarrolla el tema de calculo de paridad, alguien podria decirme la otra pregunta que dejé, como juntar dos bytes, me explico:

Tengo una variable "data1" (8 bits) que quiero juntar con otra "data2" (8 bits) para formar una variable "data16" (16 bits). No se como hacer eso en lenguaje C. :(

Si alguien pudiera responderme le estaria muy agradecido. :)

Saludos.

Desconectado cucu

  • PIC12
  • **
  • Mensajes: 74
Re: Calculo de paridad PIC 18F4550 en lenguaje C
« Respuesta #5 en: 23 de Abril de 2009, 05:41:49 »
Yo lo haría con uniones y estructuras:

typedef union _dosBytes
{
    struct _dosBytes_bits
    {
        BYTE LSB;
        BYTE MSB;
    } byte;
    WORD entero;
    BYTE v[2];
} dosBytes;

Así puedes tratar cada byte por separado (con v[0] y v[1]) o juntos (con entero).

Quizá también te interesa dividir cada byte en bits para poder calcular la paridad.

Espero que te sirva.

Saludos


Desconectado Elessar_Felagund

  • PIC10
  • *
  • Mensajes: 12
Re: Calculo de paridad PIC 18F4550 en lenguaje C
« Respuesta #6 en: 23 de Abril de 2009, 11:18:39 »
Sigo sin conseguirlo y por mas que busco no encuentro una manera que me funcione. A ver si no me he explicado bien:

mis variables son:

int primer_byte = 0x00;                 // Declaro e inicializo el primer byte de datos
int segundo_byte = 0x00;              // Declaro e inicializo el segundo byte de datos
int palabra_completa = 0x0000;     // Declaro e inicializo la variable  que sera la union de los dos
                                                   // bytes de datos para enviar los datos por SPI en 16 bits
.
.
.


primer_byte = 0x20;                  // Entrada de datos en el primer byte
segundo_byte = 0x33;               // Entrada de datos en el segundo byte

?????????????????????;               // Aqui se efectua la union de los dos bytes

palabra completa = 0x2033;       // Y esto es lo que tengo que obtener, la union de los dos bytes para enviar 16 bits por SPI


Pero no encuentro la manera de unir los dos bytes en lenguaje C en MPLAB.

Muchas gracias de nuevo.

Un saludo.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Calculo de paridad PIC 18F4550 en lenguaje C
« Respuesta #7 en: 23 de Abril de 2009, 15:33:08 »
Para unirla con C18 de Microchip

(ver manual pág 19, Integer Types)
http://ww1.microchip.com/downloads/en/DeviceDoc/C18_User_Guide_51288j.pdf

Código: [Seleccionar]
int primer_byte; 
int segundo_byte;
int palabra_completa; //según el manual C18, int es de 16 bits, por lo que sí caben 2 bytes

primer_byte = 0x20;
segundo_byte=0x33;

palabra_completa= (primer_byte<<8) | segundo_byte;

//palabra_completa ya valdrá 0x2033

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Calculo de paridad PIC 18F4550 en lenguaje C
« Respuesta #8 en: 24 de Abril de 2009, 00:09:39 »
Hola.

Se podria hacer algo asi como para crear un tipo de variable int64 por ejemplo? o ahi es mejor la union?

Saludos
El papel lo aguanta todo

Desconectado Elessar_Felagund

  • PIC10
  • *
  • Mensajes: 12
Re: Calculo de paridad PIC 18F4550 en lenguaje C
« Respuesta #9 en: 24 de Abril de 2009, 04:01:13 »
 :-/

Muchisismas gracias migsantiago, por fin me funciona. :-)

Desconectado Elessar_Felagund

  • PIC10
  • *
  • Mensajes: 12
Re: Calculo de paridad PIC 18F4550 en lenguaje C
« Respuesta #10 en: 29 de Abril de 2009, 04:12:26 »
Buenas de nuevo,

Respecto a mi duda inicial sobre como calcular la paridad creo que ya se como hacerlo, en el fondo es bien sencillo, solo tengo que sumar todos los 1 que hay en un byte y dividir el resultado por dos. Luego mirando el resto de la division, si el resto es cero es que habia un numero par de unos y si el resto es uno es que habia un numero impar de unos.

Lo que aun no se como hacer es como sumar los bits de un byte. :? Si alguien pudiera decirme como hacer esto en C con MPLAB... :mrgreen:

Muchas gracias. :-)

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: Calculo de paridad PIC 18F4550 en lenguaje C
« Respuesta #11 en: 29 de Abril de 2009, 05:35:39 »
Para unir 2 de 8 y convertirlos en 1 de 16 con la función MAKE16 lo haras enseguida. Esta en el manual de CCS.

Un saludo

Desconectado Elessar_Felagund

  • PIC10
  • *
  • Mensajes: 12
Re: Calculo de paridad PIC 18F4550 en lenguaje C
« Respuesta #12 en: 29 de Abril de 2009, 05:57:23 »
 :-/
Ya lo he conseguido sacar, quiza sea una forma un poco rudimentaria y haya otra manera mejor de hacer, pero asi me funciona.
Lo he hecho de la siguiente manera:


PORTD = 0x0F;                 // Doy un valor al puerto D, esto es para la simulacion, en la realidad el
                                       // puerto D tendria el valor de los datos que reciba por el en paralelo
segundo_byte = PORTD;

suma = PORTDbits.RD0 + PORTDbits.RD1 + PORTDbits.RD2 + PORTDbits.RD3 +           // Sumo todos los bits del puerto D
            PORTDbits.RD4 + PORTDbits.RD5 + PORTDbits.RD6 + PORTDbits.RD7;             // para ver cuantos 1 hay

if (suma%2 == 0)                    // Divido la suma entre 2 y si el resto de la suma es 0...
{
     primer_byte = 0x00;           // entonces es par y pongo el bit de paridad a 0
}
else                                        // Si no...
{
     primer_byte = 0x01;          // es que es impar y pongo el bit de paridad a 1
}

palabra_completa = ( primer_byte<<8 ) | segundo_byte;       // Y aqui uno mi byte de datos con el byte de paridad



Bueno, en este caso me ha sido mas facil porque he podido trabajar con los bits de un puerto, pero si lo hubiera tenido que hacer con los bits de una variable no se como hacerlo.

Si alguien sabe como puedo trabajar con los bits de una variable le estaria agradecido.

Ah, otra preguntilla, no es importante pero me gusta hacer las cosas en su orden. Si tengo una palabra formada de 2 bytes, por ejemplo:

palabra = 0xAABB

Cual seria el primer byte? seria AA o BB?

Muchas gracias por vuestra ayuda. Gracias a vosotros ya tengo el proyecto bastante avanzado. Espero aprender mas y que mas adelante en vez de hacer tantas preguntas responda las de otros.

Saludos.

Desconectado cucu

  • PIC12
  • **
  • Mensajes: 74
Re: Calculo de paridad PIC 18F4550 en lenguaje C
« Respuesta #13 en: 29 de Abril de 2009, 07:43:02 »
con estructuras y uniones

typedef union _byteCompleto
{
    struct _dosBytes
    {
       char bit0 :1;
       char bit1 :1;
       char bit2 :1;
       char bit3 :1;
       char bit4 :1;
       char bit5 :1;
       char bit6 :1;
       char bit7 :1;
       
    } bits;
    char completo;
} byteCompleto;


luego puedes hacer
 
 byteCompleto prueba;

 prueba.completo = 0xff ; //todos serían 1

o
 
prueba.bits.bit0 = 0; //solo el primer bit a 0
byteCompleto

Espero que te sirva (no lo he comprobado, pero creo que está bien)

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Calculo de paridad PIC 18F4550 en lenguaje C
« Respuesta #14 en: 29 de Abril de 2009, 10:42:35 »
Para contar bits que valen 1 en una variable de 4bytes:

Código: [Seleccionar]
int32 variable,copia;
int8 i;
int8 conteo=0;
...

copia=variable;
for(i=0;i<32;++i)
{
copia=copia>>1; //rota a la derecha una posición
if((bool)copia) //checa si el bit 0 es un 1
   ++conteo;
}

También hay otra forma más segura:

Código: [Seleccionar]
copia=variable;
for(i=0;i<32;++i)
{
copia=copia>>1; //rota a la derecha una posición
if(copia&0x01) //checa si el bit 0 es un 1
   ++conteo;
}

Sobre tu pregunta del orden de los bytes, depende para qué quieres saberlo. Si es para armar enteros de más bytes solo te falta saber cuál es el byte más significativo o el menos significativo. Si es para armar un entero con apuntadores el orden creo que cambia.


 

anything