Autor Tema: PIC16F505, C o Ensamblador  (Leído 1975 veces)

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

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
PIC16F505, C o Ensamblador
« en: 07 de Febrero de 2016, 20:24:26 »
.

Tengo un diseño que en principio usa un PIC16F505 con 1K5 de memoria de programa, mi duda es si estos PIC tan pequeños se pueden programar en C con XC8 o hay que irse al ensamblador. Como alternativa para quedarme en C, podría pasarme a otro PIC16 con el mismo numero de pines pero con 7 ó 14K, estos supongo que si se podrán programar en C con XC8.

Lo mío son los PIC32, hace muchos años que no toco PICs pequeños, y entonces si que tenía que ser en ensamblador, pero es un lenguaje que tengo más que olvidado, por eso prefiero a ser posible programar en C.

El programa es muy sencillo, pero hacerlo en ensamblador sin dominar ese lenguaje se puede convertir en una pesadilla hasta lo más básico. Me he bajado algunos programas ejemplo que he encontrado, y más o menos los entiendo, pero modificarlo para adecuarlo a lo que necesito me puede llevar demasiado tiempo.


Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:PIC16F505, C o Ensamblador
« Respuesta #1 en: 07 de Febrero de 2016, 20:29:09 »
Solucion:

Comprar un mejor PIC, misma cantidad de pines y que posee miles de cosas mas ademas de memoria, mas frecuencia, etc , y tambien deben tener los pines remapeables.
Y Usar C. Por si hay que pasar el codigo a otro PIC.

Por ahi lo feo seria que el programa anterior estuviera en ASM. y es alli donde deberia hacer una ing. inversa al ASM y pasarlo al C. O seguir con ese PIC y seguir usando el ASM hasta que muera.
A no ser que necesites cosas de "Altimisima" velocidad de respuesta y quieras hacer algunas cosas en ASM, pero no vale la pena hacerlo a todo.

Por lo visto el PIC16F505 solo posee un timer y nada mas

Creo que la decision es incuestionable ...
« Última modificación: 07 de Febrero de 2016, 20:33:23 por KILLERJC »

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re:PIC16F505, C o Ensamblador
« Respuesta #2 en: 07 de Febrero de 2016, 20:45:50 »


Bueno, no hay programa anterior, es un diseño nuevo, los programas que he bajado son ejemplos para ver como se programa en ensamblador para ese micro, porque no sabía ni por donde empezar.

Mi programa lo tengo que hacer completamente nuevo, es algo tan simple como controlar 9 leds con varias secuencias de encendido, pero además quiero que al darle tensión cada vez ejecute una secuencia distinta al azar de entre varias. Para mi tratar de hacer eso en ensamblador es complejo, de ahí mi duda de poder utilizar C con este micro de 1K5 o me paso a un PIC16F1825 o un PIC16F1824 de 14K y 7K y los programo en C, que supongo que si los soportará XC8.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:PIC16F505, C o Ensamblador
« Respuesta #3 en: 07 de Febrero de 2016, 20:58:30 »
Si y XC8 es bastante simple. No hay que configurar mucho. Por lo que comentas incluso podes crear tablas para mostrar los leds,
Para hacer un valor realmente aleatorio lo unico que se me ocurre es que podrias tal ves dejar un pin al aire y leer el ADC ( que lo mas seguro ya tenga )

Y creo que por lo que comentas con el de 7K te deberia sobrar. A no ser que las tablas se vuelvan un poco grandes ( si es que haces todo por tablas y sale paralelo )

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re:PIC16F505, C o Ensamblador
« Respuesta #4 en: 07 de Febrero de 2016, 21:07:25 »
.

¿ No hay rutinas para generar números aleatorios en C para estos micros ?, en C nunca he necesitado generar números aleatorios, pero si recuerdo que en Basic existía una instrucción, algo como Random o Randomize que generaba números aleatorios.

Aunque sea una función que genere algo parecido a un número aleatorio o casi aleatorio ya me vale, el caso es que cada vez que se conecte el circuito se genere una secuencia de encendido de los leds distinta. Bucaré por Google, algo debe de haber para C. Pines libres ya no me quedan, los tengo todos usados para controlar los 9 led, tiene que ser por programa.


Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:PIC16F505, C o Ensamblador
« Respuesta #5 en: 07 de Febrero de 2016, 21:22:03 »
Sin una entrada que sea realmente aleatoria no es aletorio. Pero por ejemplo aca hay una AN de MCHP, con codigo, aunque es en ASM

http://www.microchip.com/wwwAppNotes/AppNotes.aspx?appnote=en011088

Código: ASM
  1. PseudoRandom
  2.   rlcf RandHi,W
  3.   xorwf RandHi,W
  4.   rlcf WREG, F
  5.   swapf RandHi, F
  6.   swapf RandLo,W
  7.   rlncf WREG, F
  8.   xorwf RandHi,W
  9.   swapf RandHi, F
  10.   andlw 0x01
  11.   rlcf RandLo, F
  12.   xorwf RandLo, F
  13.   rlcf RandHi, F
  14.   return

No veo demasiado problema en pasarlo a C. Esto genera si salidas "aleaorias", pero siempre van a seguir un orden desde el comienzo si es que no se agrega un valor aleatorio.
Al llamar esta funcion hay que cargar un valor de 16bits en RandHi y RandLo. Ese valor si o si debe ser aleatorio.

PD: Mirando el codigo de rand.c que posee XC8:


Código: C
  1. static  long    randx = 1;
  2.  
  3. void
  4. srand(unsigned x)
  5. {
  6.         randx = x;
  7. }
  8.  
  9. int
  10. rand(void)
  11. {
  12.         randx = randx*1103515245L;
  13.         randx += 12345;
  14.         return (int)((randx >> 16) & 0x7FFF);
  15. }

No parece para nada Random.
Tal ves como te digo, dejando un pin al aire libre, leyendo el ADC, pasarle ese valor a srandx y finalmente llamando a rand(), podrias hacerlo random.

Eso si habria que ver si realmente varia o no y cuanto.

srand(ReadADC());
int a = rand();
« Última modificación: 07 de Febrero de 2016, 21:29:16 por KILLERJC »

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re:PIC16F505, C o Ensamblador
« Respuesta #6 en: 07 de Febrero de 2016, 22:12:27 »


Lo probaré, pero tendrá que ser de un pin que está conectado a uno de los led, porque no tengo ninguno libre, supongo que si lo configuro en el arranque como entrada analógico, lo leo y lo vuelvo a configurar como salida no pasará nada.

A ver si esa "semilla" tiene algo de aleatoria y me permite generar un número más o menos al azar, sino va a ser imposible lanzar un efecto distinto cada vez que le de tensión al circuito. En PCs y otros equipos grandes veo que usan la hora como semilla, pero aquí no existe esa posibilidad.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:PIC16F505, C o Ensamblador
« Respuesta #7 en: 07 de Febrero de 2016, 23:00:26 »
Es que si te pones a pensar... no hay mucho que agarrar que sea "aleatorio", lo unico que se me ocurre es agarrar un registro en el BOR/POR que su valor sea "desconocido" _( pag. 33 datasheet ) pero no se que tan bien funcionara eso si es que varia mucho o nada.

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re:PIC16F505, C o Ensamblador
« Respuesta #8 en: 08 de Febrero de 2016, 00:07:56 »
.

Por algún sitio he leido que inyectándole una señal de ruido (¿ blanco ?) a una entrada del ADC, pero eso me complica el circuito, creo que con un FET se puede hacer un generador de ruido sencillo. O ahora que se me ha ocurrido, con un sensor de temperatura que permita leer hasta décimas de grado, con salida analógica, como el LM35, conectado al ADC.


Esto parece lo más simple que he encontrado para generar ruido blanco, con el que alimentar una entrada del ADC.

« Última modificación: 08 de Febrero de 2016, 00:11:36 por planeta9999 »


 

anything