Ho un problema piuttosto strano con XC8 su un microcontrollore PIC18F27K40. Su un PIC16F1778 funziona . Ho definito:
void uart_putch(unsigned char byte) {
while (!PIR3bits.TX1IF);
TX1REG = byte;
}
Quando, nel mio main
ciclo, chiamo uart_putch('a');
, funziona benissimo. Tuttavia, quando definisco const char c = 'a';
e chiamo uart_putch(c);
, non funziona. Stampa qualcosa, sebbene non un a
- penso che siano 0x00
personaggi, da cui ottengo hexdump -x /dev/ttyUSB0
. Questo non è un problema con la porta seriale sul mio computer; Ho guardato con un ambito e il segnale è diverso (sinistra funziona, destra no):
Il codice è semplice:
void main(void) {
init(); // Sets up ports and UART control registers
while (1) {
uart_putch('a'); // or c
}
}
Che cosa non funziona né è utilizzando una delle funzioni stringa ( puts
, printf
, ecc), che credo sia correlata - così a questa domanda ho fatto un esempio di lavoro minimo con caratteri.
L'assembly generato quando uso una variabile c
ha:
_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 con una costante ha nel _main
blocco:
movlw (061h)&0ffh
call _putch
Sto usando MPLAB XC8 C Compiler V1.41 (24 gennaio 2017), con supporto per parti versione 1.41.
Le parti rilevanti del mio 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 $<
Qualsiasi aiuto per farlo funzionare sarebbe molto apprezzato.
unsigned char
, char
,const unsigned char
e const char
.
byteTx
? Temo che byte
potrebbe essere definito altrove come un tipo di dati. (Sembra che genererebbe una diagnostica del compilatore, ma chiaramente qualcosa di strano sta succedendo qui.) E come un altro test, si putch(0x61)
comporta male allo stesso modo diputch('a')
? Mi chiedo se l'istruzione di lettura della tabella legga i dati a 8 o 16 bit. Il registro PIC W ha solo 8 bit, giusto?