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 main
bucle, 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 0x00
personajes, 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 c
tiene:
_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 _main
bloque:
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 char
y const char
.
byteTx
? Me preocupa que byte
pueda 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?