J'ai un problème assez étrange avec XC8 sur un microcontrôleur PIC18F27K40. Sur un PIC16F1778 cela fonctionne . J'ai défini:
void uart_putch(unsigned char byte) {
while (!PIR3bits.TX1IF);
TX1REG = byte;
}
Lorsque, dans ma main
boucle, j'appelle uart_putch('a');
, cela fonctionne bien. Cependant, lorsque je définis const char c = 'a';
et appelle uart_putch(c);
, cela ne fonctionne pas. Il imprime quelque chose, mais pas un a
- je pense que ce sont des 0x00
personnages dont je tire hexdump -x /dev/ttyUSB0
. Ce n'est pas un problème avec le port série de mon ordinateur; J'ai regardé avec une lunette et le signal est différent (gauche fonctionne, droite non):
Le code est simple:
void main(void) {
init(); // Sets up ports and UART control registers
while (1) {
uart_putch('a'); // or c
}
}
Ce qui ne fonctionne pas non plus est en utilisant l' une des fonctions de chaîne ( puts
, printf
, etc.), qui je pense est lié - donc dans cette question que je fait un exemple de travail minimal avec des caractères.
L'assembly généré lorsque j'utilise une variable c
a:
_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
Et avec une constante, il a dans le _main
bloc:
movlw (061h)&0ffh
call _putch
J'utilise le compilateur MPLAB XC8 C V1.41 (24 janvier 2017), avec la prise en charge partielle de la version 1.41.
Les parties pertinentes de mon 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 $<
Toute aide pour le faire fonctionner serait très appréciée.
unsigned char
, char
, const unsigned char
et const char
.
byteTx
place? Je crains que cela byte
ne soit défini ailleurs comme un type de données. (On dirait que cela générerait un diagnostic du compilateur, mais clairement quelque chose d'étrange se passe ici.) Et comme un autre test, se putch(0x61)
comporte-t-il de la même manière que putch('a')
? Je me demande si l'instruction de lecture de table lit des données 8 bits ou 16 bits. Le registre PIC W n'est que de 8 bits, non?