TODOPIC
Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: dariman en 10 de Abril de 2023, 20:21:58
-
Buenas tardes. Sigo siendo un principiante en esto de los micros y, para complicarla, en ASM.
Me he propuesto una tarea, para mi, titánica, pero en el proceso voy aprendiendo y esa es la meta al final de cuentas.
He aquí el problema: un pic recibe de un periférico datos de temperatura que puede llegar a los cuatros dígitos y los almacena en dos variables.
Como se pueden extraer esos dígitos uno a uno, para poder enviarlos a un lcd ?? O si hay otra forma de visualizarlos
Sé como convertirlos en caracteres para el lcd, lo que no encuentro es como sacarlos de a uno de los dos registros ya que entero no puedo por exceder los 255.
Por si sirve, es un pic 16f72 y un max31855
Espero se entienda la pregunta y puedan ayudarme, siempre en ASM. Gracias !!!
-
...
He aquí el problema: un pic recibe de un periférico datos de temperatura que puede llegar a los cuatros dígitos y los almacena en dos variables.
El MAX31855 es de 14bits --> Son 5 dígitos en decimal
Como se pueden extraer esos dígitos uno a uno, para poder enviarlos a un lcd ??
Si tu dato es de 16bits lo que necesitás es convertirlos a BCD y luego sumarles 0x30 ('0') para pasarlos a ascii.
Para aprender y de paso ahorrar trabajo, Microchip tiene unas librerías matemáticas en ASM --> De https://www.microchip.com/en-us/application-notes/an544 descargás las librerías y la AN544 con la descripción.
O si hay otra forma de visualizarlos
También podés sacar los datos leídos por el puerto serie, o si estás usando un simulador en una Watch Window.
Espero se entienda la pregunta
Incompleta, como si preguntaras a ChatGPT, pero se entiende.
-
Código en C para Arduino. Es sencillo pasarlo a otro microcontrolador.
#define BINARY_DIGITS 16
#define DECIMAL_DIGITS 5
void bin16_to_str(char *str, unsigned int bin) {
char maxdig, digcnt, bitcnt;
static char *p, carry;
// Clear string
p = str;
digcnt = DECIMAL_DIGITS + 1;
do { *p++ = 0; } while (--digcnt);
// Transform binary to BCD
bitcnt = BINARY_DIGITS;
maxdig = (DECIMAL_DIGITS - 1);
str += (DECIMAL_DIGITS - 1);
do {
// Shift left binary number with carry
carry = 0;
if (bin & (1L<<(BINARY_DIGITS-1)))
carry |= 1;
bin <<= 1;
// Shift left decimal number with carry
p = str;
digcnt = DECIMAL_DIGITS - maxdig;
do {
carry = (*p<<1) + carry;
if (carry >= 10) {
*p-- = carry - 10;
carry = 1;
if (digcnt == 1) {
maxdig--;
digcnt++;
}
}
else {
*p-- = carry;
carry = 0;
}
} while(--digcnt);
} while(--bitcnt);
// Transform BCD to ASCII
digcnt = DECIMAL_DIGITS;
do *str-- += '0'; while (--digcnt);
}
void setup() {
Serial.begin(9600);
}
void loop() {
unsigned long timeit;
unsigned long bin;
char strnum[DECIMAL_DIGITS + 1];
strnum[DECIMAL_DIGITS] = 0; // End of char
timeit = millis();
for(bin=0; bin<65500; bin++) {
bin16_to_str(strnum, bin);
}
timeit = millis() - timeit;
Serial.print("1 conversion in ");
Serial.print(timeit/65.5);
Serial.println(" microseconds");
delay(5000);
for(bin=0; bin<50000; bin++) {
bin16_to_str(strnum, bin);
Serial.println(strnum);
}
}
-
Aquí varias funciones para hacer lo mismo, en ensamblador:
http://www.piclist.com/techref/microchip/math/radix/index.htm
-
Gracias Picuino y Eduardo2 por su ayuda.
Voy a investigar las posibilidades que me dan y veré que logro.
En verdad se que me metí en camisas de once varas como se suele decir, pero bue, para aprender está bueno.
Lo incompleto del mensaje puede ser debido a que, como dije, soy muy novato en esto. Aunque hace un par de años que inicié, no tengo posibilidad de darle mucha continuidad y eso hace que avance muy despacio.
El querer lograrlo en ASM tiene un par de motivos, sobre todo honrar a un querido amigo desaparecido que era fanático del ASM y un capo con eso. Eso y mi poco tiempo, hace que no me desvíe aún a iniciarme en otro lenguaje como por ejemplo el c, a pesar de que todos me dicen que estoy yendo al revés.
Una vez más, mil gracias por su gran ayuda.
abrazotes