Eu tenho um problema bastante estranho com o XC8 em um microcontrolador PIC18F27K40. Em um PIC16F1778, ele funciona . Eu defini:
void uart_putch(unsigned char byte) {
while (!PIR3bits.TX1IF);
TX1REG = byte;
}
Quando, no meu mainloop, eu ligo uart_putch('a');, isso funciona bem. No entanto, quando eu defino const char c = 'a';e ligo uart_putch(c);, ele não funciona. Ele imprime algo, embora não seja a- eu acho que eles são 0x00personagens, dos quais eu recebo hexdump -x /dev/ttyUSB0. Este não é um problema com a porta serial no meu computador; Eu olhei com um escopo e o sinal é diferente (a esquerda funciona, a direita não):
O código é simples:
void main(void) {
init(); // Sets up ports and UART control registers
while (1) {
uart_putch('a'); // or c
}
}
O que não quer trabalhar é usando qualquer uma das funções de cordas ( puts, printf, etc.), que acho que está relacionado - assim nessa questão eu fiz um exemplo de trabalho mínimo com caracteres.
O assembly gerado quando uso uma variável cpossui:
_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
E com uma constante que tem no _mainbloco:
movlw (061h)&0ffh
call _putch
Estou usando o Compilador MPLAB XC8 C V1.41 (24 de janeiro de 2017), com a versão de suporte da parte 1.41.
As partes relevantes do meu 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 $<
Qualquer ajuda para conseguir esse trabalho seria muito apreciada.
unsigned char, char, const unsigned chare const char.
byteTx? Estou preocupado que bytepossa ser definido em outro lugar como um tipo de dados. (Parece que isso geraria um diagnóstico do compilador, mas claramente algo estranho está acontecendo aqui.) E como outro teste, ele se putch(0x61)comporta mal da mesma maneira que putch('a')? Gostaria de saber se a instrução de leitura da tabela está lendo dados de 8 ou 16 bits. O registro PIC W é de apenas 8 bits, certo?

