Autor Tema: Instrucción pgm_read_byte en CCS C  (Leído 2213 veces)

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

Desconectado Pchuqui_1

  • PIC16
  • ***
  • Mensajes: 187
Instrucción pgm_read_byte en CCS C
« en: 10 de Diciembre de 2021, 15:18:21 »
Hola a todos. Buenas tardes.

Estoy transcribiendo una librería la cual tiene la siguiente función en codigo Arduino:  pgm_read_byte();. Lo que pude ver es que esta instrucción funciona como macro que lee una palabra guardada en una posición de memoria.  El código es el siguiente:

void drawchar(int8 x, int8 line, char c){
  for (int8 i =0; i<5; i++ ) {
    buffer[x + (line*128) ] = pgm_read_byte(font+(c*5)+i);
    x++;
  }
}

Mi idea es utilizar la función strcpy para reemplazarla. Esta función se utiliza para copiar una cadena de caracteres (fuente) en el lugar que ocupaba otra (destino). Pero no estoy seguro:


static int8 buffer[1024]{}
int8 font[]{}

void drawchar(int8 x, int8 line, char c){
  for (int8 i =0; i<5; i++ ) {
    buffer[x + (line*128) ] = strcpy (font, (c*5) + i);
    x++;
  }
}

Podrían darme su opinion? buffer y font

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Instrucción pgm_read_byte en CCS C
« Respuesta #1 en: 10 de Diciembre de 2021, 18:38:54 »
Código: C
  1. const font[]={};  // Declaro constante para que quede guardado en la Flash, aca estan las letras guardadas
  2.  
  3. void drawchar(int8 x, int8 line, char c){
  4.   for (int8 i =0; i<5; i++ ) {
  5.     buffer[x + (line*128) ] = font[(c*5) + i]; // Accedo al caracter que deseo
  6.     x++;
  7.   }
  8. }

Que el mismo compilador se encargue de como "leer" ese dato de la memoria de programa.

Desconectado AleSergi

  • PIC16
  • ***
  • Mensajes: 214
Re:Instrucción pgm_read_byte en CCS C
« Respuesta #2 en: 10 de Diciembre de 2021, 18:42:39 »
Hola, esa función en el lenguaje C de los microcontroladores AVR lo que hace es leer bytes que están grabados directamente en la memoria del programa por eso dice pgm_blablabla()  PROGRAM MEMORY, en el compilador ccs también existe algo parecido y es a lo que vos tenés que apuntar,  esto se hace así porque los bitmap de las letras ocupan mucha memoria y no los podrías guardar en la memoria RAM, Así que se guardan directamente en la memoria ROM del programa.

Desconectado Pchuqui_1

  • PIC16
  • ***
  • Mensajes: 187
Re:Instrucción pgm_read_byte en CCS C
« Respuesta #3 en: 10 de Diciembre de 2021, 18:44:43 »
Hola KillerJC. Gracias por la respuesta.

Perfecto, voy a probarlo a ver que resultados obtengo!

 ((:-))

Desconectado Pchuqui_1

  • PIC16
  • ***
  • Mensajes: 187
Re:Instrucción pgm_read_byte en CCS C
« Respuesta #4 en: 10 de Diciembre de 2021, 18:48:26 »
Ok. No se si lo mencioné antes pero estas dos funciones "static int8 buffer[1024]{}" "int8 font[]{}", son dos arrays. Tal cual dice AleSergi se guardan en la ROM del programa.

Desconectado Pchuqui_1

  • PIC16
  • ***
  • Mensajes: 187
Re:Instrucción pgm_read_byte en CCS C
« Respuesta #5 en: 10 de Diciembre de 2021, 20:15:37 »
Gracias por la ayuda. Consulta, los siguientes parametros son instrucciones en ardruino? _BV  y ~_BV? Como representan eso en codigo c?

if (color)
    buffer[x+ (y/8)*128] |= _BV(7-(y%8)); 
  else
    buffer[x+ (y/8)*128] &= ~_BV(7-(y%8));

Desconectado Geo

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 922
    • Mexchip
Re:Instrucción pgm_read_byte en CCS C
« Respuesta #6 en: 10 de Diciembre de 2021, 20:25:41 »
_BV es una macro de la libc de AVR:
https://manpages.debian.org/testing/avr-libc/_BV.3avr.en.html

Código: C
  1. #define _BV(bit) (1 << (bit))

puedes definir la macro en tu código y usarla tal cual o usar el código equivalente que sería algo como:
Código: C
  1. if (color)
  2.     buffer[x + (y / 8) * 128] |= (1 << (7 - (y % 8)));
  3. else
  4.     buffer[x + (y / 8) * 128] &= ~(1 << (7 - (y % 8)));
« Última modificación: 10 de Diciembre de 2021, 20:32:07 por Geo »
La imaginación es el límite.
Visita mi blog, en inglés o en español :).
Mini curso de introducción a VHDL en MEXCHIP :-/

Desconectado Pchuqui_1

  • PIC16
  • ***
  • Mensajes: 187
Re:Instrucción pgm_read_byte en CCS C
« Respuesta #7 en: 10 de Diciembre de 2021, 20:35:08 »
Convierte un bit en un byte, esa sería la definición, correcto?


Desconectado AleSergi

  • PIC16
  • ***
  • Mensajes: 214
Re:Instrucción pgm_read_byte en CCS C
« Respuesta #8 en: 10 de Diciembre de 2021, 20:58:24 »
No, exactamente esa definición _bv significa Bit Value , se utiliza mucho para trabajar con los Bits en este caso desplazar un bit a la izquierda.
(1<<n)

para aumentar tus conocimientos en lenguaje c, deberías visitar el enlace que te dejo, Allí hablan en una conversación larguísima, la gente que usa los compiladores avrgcc de la manipulación de Bits, que habrían existido, que existieron, que existen, que hubiesen existido, y que existirán, también sirve para otro microcontroladores y para todos los compiladores.

https://www.avrfreaks.net/forum/tut-c-bit-manipulation-aka-programming-101?page=all

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:Instrucción pgm_read_byte en CCS C
« Respuesta #9 en: 11 de Diciembre de 2021, 10:38:07 »
Convierte un bit en un byte, esa sería la definición, correcto?

FYI, Acerca de rotar un byte:

https://microchipdeveloper.com/tls2101:shift-operators

Acá el curso completo de C

https://microchipdeveloper.com/tls2101:start
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32