Tengo un problema bastante extraño con XC8 en un microcontrolador PIC18F27K40. En un PIC16F1778 funciona . He definido:
void uart_putch(unsigned char byte) {
while (!PIR3bits.TX1IF);
TX1REG = byte;
}
Cuando, en mi mainbucle, llamo uart_putch('a');, esto funciona bien. Sin embargo, cuando defino const char c = 'a';y llamo uart_putch(c);, no funciona. Imprime algo, aunque no un a- Creo que son 0x00personajes, de los cuales obtengo hexdump -x /dev/ttyUSB0. Esto no es un problema con el puerto serie en mi computadora; Miré con un alcance y la señal es diferente (la izquierda funciona, la derecha no):
El código es simple:
void main(void) {
init(); // Sets up ports and UART control registers
while (1) {
uart_putch('a'); // or c
}
}
Lo que no funciona bien es el uso de cualquiera de las funciones de cadena ( puts, printf, etc.), que creo que está relacionado - por lo que en esta pregunta que hice un ejemplo básico mínimo, con los personajes.
El ensamblado generado cuando uso una variable ctiene:
_c:
db low(061h)
global __end_of_c
_main:
; ...
movlw low((_c))
movwf tblptrl
if 1 ;There is more than 1 active tblptr byte
movlw high((_c))
movwf tblptrh
endif
if 1 ;There are 3 active tblptr bytes
movlw low highword((_c))
movwf tblptru
endif
tblrd *
movf tablat,w
call _putch
Y con una constante que tiene en el _mainbloque:
movlw (061h)&0ffh
call _putch
Estoy usando MPLAB XC8 C Compiler V1.41 (24 de enero de 2017), con la versión de soporte parcial 1.41.
Las partes relevantes de mi Makefile:
CC:=xc8
CFLAGS:=-I. --chip=18F27K40 -Q -Wall
SRC:=main.c uart.c
DEP:=uart.h
PRS:=$(subst .c,.p1,$(SRC))
OBJ:=main.hex
all: $(OBJ)
$(OBJ): $(PRS)
$(CC) $(CFLAGS) $^
$(PRS): %.p1: %.c $(DEP)
$(CC) $(CFLAGS) -o$@ --pass1 $<
Cualquier ayuda para que esto funcione será muy apreciada.
unsigned char, char, const unsigned chary const char.
byteTx? Me preocupa que bytepueda definirse en otro lugar como un tipo de datos. (Parece que eso generaría un diagnóstico del compilador, pero claramente algo extraño está sucediendo aquí.) Y como otra prueba, ¿se putch(0x61)comporta mal de la misma manera que putch('a')? Me pregunto si la instrucción de lectura de tabla está leyendo datos de 8 bits o de 16 bits. El registro PIC W solo tiene 8 bits, ¿verdad?

