Autor Tema: Busco consejo sobre que lenguaje conviene aprender  (Leído 15894 veces)

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

Desconectado Chaly29

  • Moderador Global
  • DsPIC33
  • *****
  • Mensajes: 4315
Re: Busco consejo sobre que lenguaje conviene aprender
« Respuesta #30 en: 03 de Enero de 2015, 17:49:36 »
Hola Picuino, claro, es eso exactamente lo que estoy buscando, si bien puedo y lo e echo a la programación en .asm de un 18F, calcula que es un lío importante de instrucciones cuando estás queriendo realizar algún programa bastante complejo.

Ahora que estamos en fin de semana me voy a poner a full a ver lo que pasa!!

Al XC8 lo descargue de la misma página de microchip y tal como mencionas es la versión free, e leído que no optimiza tanto como la versión de pago, pero para aprender me va de maravillas. Y aunque todavía ni se como abrir un nuevo proyecto, pues ya lo investigaré esta noche con más tranquilidad y tiempo.

Nuevamente muchas gracias a todos por la ayuda.

Un saludo.

Atte. CARLOS.

La teoría es cuando se sabe todo y nada funciona. La práctica es cuando todo funciona y nadie sabe por qué.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re: Busco consejo sobre que lenguaje conviene aprender
« Respuesta #31 en: 04 de Enero de 2015, 15:45:26 »
Charly, también necesitas un IDE

Yo he usado el MPLAB IDE V8 y ahora uso el MPLAB X IDE
Yo prefiero el MPLAB v8 por ser mucho más intuitivo y rápido, pero está obsoleto y no soporta el PIC16F1719 con el que estoy trabajando.

Aprovecho para comentar las ventajas del PIC16F1719:
tiene Peripheral Pin Select y puedes conectar cualquier periférico a casi cualquier salida del micro. Esto facilita mucho la vida para hacer el PCB de un micro con 44 pines.
Tiene 3 módulos CLC (parecidos a un CPLD).
Oscilador NCO de precisión,
4 PWM,
5 Timers,
2 DAC,
ADC de 10bit,
detección de cruce por cero,
amplificadores operacionales,
interrupciones por cambio de estado de cualquier entrada,
nivel lógico seleccionable TTL/CMOS independiente para cada entrada,
trabaja a 32MHz internos,
memoria de 16kwords Flash para programa y 2kbytes de RAM,
Y un precio de 1.76 Euros para 10 unidades


Es un micro lleno de periféricos muy interesantes a un precio económico. Imagino que los nuevos desarrollos de Microchip irán por ese camino, de manera que nos quitarán las ganas de usar micros antiguos.
Esto requiere usar el MPLAB X:
http://www.microchip.com/pagehandler/en-us/family/mplabx

Un saludo.
« Última modificación: 04 de Enero de 2015, 15:49:58 por Picuino »

Desconectado Chaly29

  • Moderador Global
  • DsPIC33
  • *****
  • Mensajes: 4315
Re: Busco consejo sobre que lenguaje conviene aprender
« Respuesta #32 en: 04 de Enero de 2015, 17:17:51 »
Hola Picuino, hasta ahora al XC8 me parece que lo llevo bastante bien, obviamente falta muchísimo camino por recorrer, pero me resulta mucho más fácil que el CCS, incluso hay muchas instrucciones que son intuitivas gracias al previo conocimiento de .asm que poseo.

Yo siempre uso en .asm una pequeña rutina para manejar los LCD's, la e realizado en XC8 y si bien es más fácil y rápida de comprender, incluso de programar, la contra es que en .asm me ocupaba solo 180 posiciones de memoria de programa y en XC8 me ocupa 290, una diferencia importante.
Pero bueno, es un precio bajo a pagar (si logro llegar a manejar bien el C) por la comodidad y velocidad de programación.

Lo que no e podido hacer es el manejo de un solo bit dentro de una variable, ya sea setearlo, borrarlo o comprobarlo, pero bueno, seguiré intentando.

Gracias por la data. Un saludo.

Atte. CARLOS.

Pda. Todavía estamos muy lejos de poder conseguir un micro de esos acá en Argentina, van a tener que pasar unos cuantos años. Pero es bueno saberlo que están en camino.  ;-)

La teoría es cuando se sabe todo y nada funciona. La práctica es cuando todo funciona y nadie sabe por qué.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re: Busco consejo sobre que lenguaje conviene aprender
« Respuesta #33 en: 04 de Enero de 2015, 17:42:53 »
En el post anterior me refería al IDE, al entorno gráfico con el que manejas XC8. Hay varios, el actual es el MPLAB X, creo que el mejor para empezar.


En cuanto a poder manejar bits dentro de una variable, tienes dos formas.

Setear y resetear el bit 5 de un byte (el bit 0 es el de la derecha y el 7 el de la izquierda) con operaciones lógicas:

Código: [Seleccionar]

   unsigned char b;       // b es una variable de 8 bits sin signo
  
   b = 0b11001100;       // Ahora b  vale 11001100 (en binario)

   b |= 0b00100000;     // Ahora he hecho un OR con el bit 5 a uno y la variable vale 0b11101100
   b |= (1<<5);           // Lo mismo que antes. El número 0b00100000 lo he creado desplazando un uno hacia la izquierda 5 veces


   b &= 0b11011111;   // Ahora he hecho un AND con el bit 5 a cero y la variable vale otra vez 0b11001100
   b &= ~(1<<5);         // Lo mismo que antes, desplazando un uno cinco veces a la izquierda, y por último se invierte el numero (operación ~)


//
// Lo mismo de antes un poco más fácil:
//

   b = 0b11001100;       // Ahora b  vale 11001100 (en binario)

   b = b | 0b00100000;     // Ahora he hecho un OR con el bit 5 a uno y la variable vale 0b11101100
   b = b | (1<<5);           // Lo mismo que antes. El número 0b00100000 lo he creado desplazando un uno hacia la izquierda 5 veces


   b = b & 0b11011111;   // Ahora he hecho un AND con el bit 5 a cero y la variable vale otra vez 0b11001100
   b = b & ~(1<<5);         // Lo mismo que antes, desplazando un uno cinco veces a la izquierda, y por último se invierte el numero (operación ~)


Hay más formas, por ahora esta te puede valer.


Saludos.




P.D.: hay una forma más bonita para la vista de hacer un not binario sin utilizar el operador '~', con la operación XOR:

   b = b ^ 0b11111111;     // La variable b cambia todos sus bits de valor (NOT binario)

El símbolo ~ sale del teclado español pulsando [ALT]+126

Saludos.
« Última modificación: 04 de Enero de 2015, 17:51:33 por Picuino »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Busco consejo sobre que lenguaje conviene aprender
« Respuesta #34 en: 04 de Enero de 2015, 19:14:31 »
A mi me daria miedo hacer esto:

Citar
b &= ~(1<<5);

Por que no se como lo va a toma el compilador, si va a hacer esas rotaciones o no, no deberia PERO no me confio, y para mi es mas claro

el toggle:
var ^= 0x01
Puesta a 0
var &=~(0x01)  o var &= 0xFE
Y puesta a uno con el OR |=

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re: Busco consejo sobre que lenguaje conviene aprender
« Respuesta #35 en: 04 de Enero de 2015, 19:29:05 »
En C no se pueden hacer rotaciones, solo desplazamientos.
Cuando desplazas siempre se rellena con ceros, (creo que la excepción es al desplazar un número negativo a la derecha, que se rellena con unos)
El compilador se asegura de eso poniendo el carry a cero (o a uno en el caso de negativos) antes del desplazamiento.

En este caso, como es una constante, no hay problema. (1<<5)  es siempre igual a 0b00100000 = 32d
A mi me gusta utilizar este método porque queda más claro cual es el bit que pones a uno.


Puedes utilizar también una macro con este sistema:

#define SET_BIT(var, bit)       var |= (1<<bit)
#define RESET_BIT(var, bit)   var &= ~(1<<bit)


SET_BIT(b, 5);        // Esta instrucción pone a uno el bit 5 de la variable b
RESET_BIT(b, 5);    // Esta instrucción pone a cero el bit 5 de la variable b



Con respecto al microcontrolador 16F1719, ya he leído anteriormente que en Argentina hay problemas con las importaciones.
He encontrado el micro en Mouser Argentina:
http://ar.mouser.com/ProductDetail/Microchip-Technology/PIC16F1719-I-PT/?qs=sGAEpiMZZMvqv2n3s2xjsZgUB1jPAEqBP9PrLuWOhpXtotz6TvrcXQ%3d%3d
¿También en este caso hay problemas de suministro?


Saludos.
« Última modificación: 04 de Enero de 2015, 19:31:06 por Picuino »

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re: Busco consejo sobre que lenguaje conviene aprender
« Respuesta #36 en: 04 de Enero de 2015, 22:10:30 »

Lo que no e podido hacer es el manejo de un solo bit dentro de una variable, ya sea setearlo, borrarlo o comprobarlo, pero bueno, seguiré intentando.


Carlos, generalizo a lo que dice picuino y killer, eso lo enontras como Bit masking:
http://en.wikipedia.org/wiki/Mask_%28computing%29

hay otra técnica pero no puedo acordarme el nombre, seguro los muchachos lo van a agregar.

Saludos y exito con el C!
-
Leonardo Garberoglio

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re: Busco consejo sobre que lenguaje conviene aprender
« Respuesta #37 en: 04 de Enero de 2015, 22:14:15 »

Con respecto al microcontrolador 16F1719, ya he leído anteriormente que en Argentina hay problemas con las importaciones.
He encontrado el micro en Mouser Argentina:
http://ar.mouser.com/ProductDetail/Microchip-Technology/PIC16F1719-I-PT/?qs=sGAEpiMZZMvqv2n3s2xjsZgUB1jPAEqBP9PrLuWOhpXtotz6TvrcXQ%3d%3d
¿También en este caso hay problemas de suministro?

Entiendo que no existe mouser en Argentina, es solo un sitio web (el .ar), pero físicamente no tienen almacenes en Argentina.
El representante odicial de Microchip es Elemon y la unica forma de que traigan algo como eso es comprarles un reel entero...

Saludos!
-
Leonardo Garberoglio

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Busco consejo sobre que lenguaje conviene aprender
« Respuesta #38 en: 04 de Enero de 2015, 22:34:30 »

hay otra técnica pero no puedo acordarme el nombre, seguro los muchachos lo van a agregar.


Lo que creo que decis es el bit banding ( lo vi en los ARM ). Quoteo de wikipedia:

Citar
Bit-banding: Maps a complete word of memory onto a single bit in the bit-band region. For example, writing to an alias word will set or clear the corresponding bit in the bitband region. This allows every individual bit in the bit-banding region to be directly accessible from a word-aligned address, and individual bits to be toggled from C/C++ without performing a read-modify-write sequence of instructions

Es decir hay una region de memoria destinada a conservar la direccion y la posicion de bit, normalmente modificar un bit llevaria 3 instrucciones ( carga , modificacion(or/and) y guardado ) , aunque en realidad lleva unos 5 si no esta bien optimizado xD. En fin. con el otro directamente escribis en esa posicion de memoria y estarias escribiendo el bit directamente.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re: Busco consejo sobre que lenguaje conviene aprender
« Respuesta #39 en: 05 de Enero de 2015, 05:56:10 »
Hay otra técnica que consiste en poner nombre a los bits:

Código: [Seleccionar]

struct {
      unsigned flag0:1;
      unsigned flag1:1;
      unsigned flag2:1;
      unsigned flag3:1;
      unsigned flag4:1;
      unsigned flag5:1;
      unsigned flag6:1;
      unsigned flag7:1;
} variable;

void main(void) {

   variable.flag5 = 0;

}

Si quieres acceder a la vez a todos los bits, tienes que declarar una unión de bits + byte:

Código: [Seleccionar]

union {
   unsigned char byte;
   struct {
      unsigned flag0:1;
      unsigned flag1:1;
      unsigned flag2:1;
      unsigned flag3:1;
      unsigned flag4:1;
      unsigned flag5:1;
      unsigned flag6:1;
      unsigned flag7:1;
   };
} variable;

void main(void) {
   variable.byte = 0b11001100;
   variable.flag5 = 0;
}


Saludos.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re: Busco consejo sobre que lenguaje conviene aprender
« Respuesta #40 en: 05 de Enero de 2015, 08:42:22 »

Entiendo que no existe mouser en Argentina, es solo un sitio web (el .ar), pero físicamente no tienen almacenes en Argentina.
El representante odicial de Microchip es Elemon y la unica forma de que traigan algo como eso es comprarles un reel entero...


He visto que en la web de Elemon hay varios micros modernos de la serie PIC16 (PIC16F17xx,  PIC16F18xx,  etc)

La mayoría de esos micros necesitan para programarlos el compilador XC8 y el IDE MPLAB X, de manera que estas son las mejores opciones para comenzar, puesto que tienen más futuro y dan soporte a más micros.


Un saludo.

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re: Busco consejo sobre que lenguaje conviene aprender
« Respuesta #41 en: 05 de Enero de 2015, 09:06:25 »

Entiendo que no existe mouser en Argentina, es solo un sitio web (el .ar), pero físicamente no tienen almacenes en Argentina.
El representante odicial de Microchip es Elemon y la unica forma de que traigan algo como eso es comprarles un reel entero...


He visto que en la web de Elemon hay varios micros modernos de la serie PIC16 (PIC16F17xx,  PIC16F18xx,  etc)

La mayoría de esos micros necesitan para programarlos el compilador XC8 y el IDE MPLAB X, de manera que estas son las mejores opciones para comenzar, puesto que tienen más futuro y dan soporte a más micros.


Un saludo.

Este es el stock de elemon de esos micros:

Descripción   Cant. Ofre.   Precio Unitario   Stock
PIC16F1713-I/SP 28SPDIP 7KB Flash, 512B RAM PWM, COG, NCO, ZCD, CLC, PP   50   3,630   
PIC16F1786-I/SP 28SPDIP 14KB Flash, 1KB RAM, 256B EEPROM, ADC, DAC, PSMC, OPAmp   1   4,640   
PIC16F1789-I/P 40PDIP 28KB Flash, 2KB RAM, 256B EEPROM PSMC, OPAmp, FastComp, CCP   34   5,500   
PIC16F1823T-I/ML 3.5KB Flash, 128 bytes RAM, 14MLCC   0   2,680   
PIC16F1823-I/P 3.5KB Flash, 128 bytes RAM, 14PDIP   0   3,250   
PIC16F1823-I/SL 3.5KB Flash, 128 bytes RAM, 14SOIC   0   2,380   
PIC16F1825-I/P 14KB Flash, 1K bytes RAM 14PDIP   0   3,740   
PIC16F1825-E/P 14KB Flash, 1K bytes RAM 14PDIP   0   4,720   
PIC16F1825-E/SL 14KB Flash, 1K bytes RAM 14SOIC   0   4,290   
PIC16F1826-I/P 3.5KB Flash, 256 bytes RAM, 18PDIP   0   2,900   
PIC16F1826-E/P 3.5KB Flash, 256 bytes RAM, 18PDIP   0   3,750   
PIC16F1826T-I/SO 3.5KB Flash, 256 bytes RAM 18SOIC..T/R   0   3,020   
PIC16F1826-I/SO 3.5KB Flash, 256 bytes RAM, 18SOIC   100   2,070   
PIC16F1827-I/SO 7KB Flash, 384 bytes RAM 18SOIC   50   4,390   
PIC16F1829-I/P 14KB Flash, 1K bytes RAM 20PDIP   34   4,780   
PIC16F1829-I/ML 14KB Flash, 1K bytes RAM 28QFN   0   3,740   
PIC16F1847-I/P 14KB Flash, 1K bytes RAM, 18PDIP   18   4,660   

solo 3 de ellos hay stock "confiable"... igual, algo es algo!

sds.
-
Leonardo Garberoglio

Desconectado Chaly29

  • Moderador Global
  • DsPIC33
  • *****
  • Mensajes: 4315
Re: Busco consejo sobre que lenguaje conviene aprender
« Respuesta #42 en: 05 de Enero de 2015, 13:12:03 »
Hola elgarbe, Picuino y KILLERJC, gracias por los aportes, son todos de mucha utilidad (por lo menos para mí), pero temo que me e expresado mal cuando me e referido a "manejo de bit's", en realidad, lo que yo quería decir es a comprobar un bit dentro de un byte, algo así a la funciónes btfsc/btfss del .asm, pero por supuesto en el C y para con el dato en cuestión poder usar la función "if" del C.

Buen dato elgarbe, si bien conocía la empresa Elemon, no me había dado cuenta que tenía en stock esos micros, gracias por el dato.

Picuino, es así, acá en Argentina y en estos momentos tenemos muchísimos problemas con la importación y las tarifas de la misma, y aparte, como el modelo cambiario con el dolar no nos ayuda, pues los costos para importar se nos van por las nubes. Para que te des una idea, para traer algo desde Mouser de México/EEUU nos está costando alrededor de 100 dolares solo el costo del envío. Y al costo de lo que compres tienes que sumarle otro tanto en costo de aduana e impuestos. Una locura... todo esto con la excusa de querer "fomentar la industria nacional", como si en Argentina fuéramos a fabricar un PIC !!!

Sin más y ya con la calentura encima (por lo de las importaciones) agradezco enormemente los aportes que son de tanta utilidad para mí en estos momentos.

Un saludo.

Atte. CARLOS.

La teoría es cuando se sabe todo y nada funciona. La práctica es cuando todo funciona y nadie sabe por qué.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Busco consejo sobre que lenguaje conviene aprender
« Respuesta #43 en: 05 de Enero de 2015, 13:30:48 »
Hola elgarbe, Picuino y KILLERJC, gracias por los aportes, son todos de mucha utilidad (por lo menos para mí), pero temo que me e expresado mal cuando me e referido a "manejo de bit's", en realidad, lo que yo quería decir es a comprobar un bit dentro de un byte, algo así a la funciónes btfsc/btfss del .asm, pero por supuesto en el C y para con el dato en cuestión poder usar la función "if" del C.

Ahora si nos entendemos, estoy con que esto deberia funcionar. Aunque uno espera un resultado booleano 1 (true) o 0 (false), creo que se basa unicamente en la deteccion del 0, por lo tanto no varia si es 1,8 o 15 para tomarlo como true.

Código: [Seleccionar]
if ( var & 0x08 ) {
 Si el resultado de la operacion "var & 0x08" es 0 no va a entrar aca
 Si esta en un 1 ese bit va a entrar aca
}

Aclaracion, si eso no funciona, podria ser ((var & 0x08) == 0) o != 0, pero creo que deberia funcionar sin el condicional.
Que esto se reemplaze en un simple BTFSS/BTFSC ahi lo veo complejo.
Podes usar un #define FLAG_ALGO 0x08, asi queda mas claro y entendible el codigo. quedandote ( var & FLAG_ALGO )

Igual eso es para una variable, en los registros tenes definidos los bits y quedaria por ejemplo

if ( INTCONbit.TXIF ) { }

Y si quisieras que sea una logica negada es decir que entre cuando este en 0 al if, le antepones el ! , quedando if ( !INTCONbits.TXIF ) , lo mismo podes hacer con la variable, este si creo que se reemplazaria correctamente en ASM, pero bueno, son las contras del C.

EDIT:

Buscando por el tema del true/false:
To be more precise, false is zero and true is any non-zero.
Esto vale tambien para numeros negativos. Tambien un null puede ser un false
http://www.cplusplus.com/forum/articles/3483/
« Última modificación: 05 de Enero de 2015, 13:54:13 por KILLERJC »

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re: Busco consejo sobre que lenguaje conviene aprender
« Respuesta #44 en: 05 de Enero de 2015, 14:02:27 »
Hola elgarbe, Picuino y KILLERJC, gracias por los aportes, son todos de mucha utilidad (por lo menos para mí), pero temo que me e expresado mal cuando me e referido a "manejo de bit's", en realidad, lo que yo quería decir es a comprobar un bit dentro de un byte, algo así a la funciónes btfsc/btfss del .asm, pero por supuesto en el C y para con el dato en cuestión poder usar la función "if" del C.

Ahora si nos entendemos xD, estoy con que esto deberia funcionar. Aunque uno espera una resultado booleano 1 (true ) o 0 (false), creo que se basa unicamente en la deteccion del 0, por lo tanto no varia si es 1,8 o 15 para tomarlo como true.

Código: [Seleccionar]
if ( var & 0x08 ) {
 Si el resultado de la operacion "var & 0x08" es 0 no va a entrar aca
 Si esta en un 1 ese bit va a entrar aca
}

Aclaracion, si eso no funciona, podria ser ((var & 0x08) == 0) o != 0, pero creo que deberia funcionar sin el condicional.
Que esto se reemplaze en un simple BTFSS/BTFSC ahi lo veo complejo.
Podes usar un #define FLAG_ALGO 0x08, asi queda mas claro y entendible el codigo. quedandote ( var & FLAG_ALGO )

Igual eso es para una variable, en los registros tenes definidos los bits y quedaria por ejemplo

if ( INTCONbit.TXIF ) { }

Y si quisieras que sea una logica negada es decir que entre cuando este en 0 al if, le antepones el ! , quedando if ( !INTCONbits.TXIF ) , lo mismo podes hacer con la variable, este si creo que se reemplazaria correctamente en ASM, pero bueno, son las contras del C.

Complemento un poquito esto.
Ya que estas empezando y si el tiempo te lo permite, podrías buscar (ando corto de tiempo hoy, sino te pasaría algunos links) cuestiones de estandarizacion y de buenas prácticas (como esto http://users.ece.cmu.edu/~eno/coding/CCodingStandard.html) asi ya que aprendes lo haces bien desde el principio.

Entre las buenas practicas, para el ejemplo de killer sería:


#define LED_pin    (1<<5)      //Esto si el LED esta conectado al Bit 5 dentro del puerto

#define LED_pin2   PORTBbits.RB5    //Acá apuntas directamente al bit en memoria correspondiente al pin en cuestion

y luego sí poner

if ( var & LED_pin){}

if (LED_pin2) {}

Saludos!
-
Leonardo Garberoglio