Saya memiliki masalah yang agak aneh dengan XC8 pada mikrokontroler PIC18F27K40. Pada PIC16F1778 berfungsi . Saya telah mendefinisikan:
void uart_putch(unsigned char byte) {
while (!PIR3bits.TX1IF);
TX1REG = byte;
}
Ketika, dalam main
lingkaran saya , saya sebut uart_putch('a');
, ini berfungsi dengan baik. Namun, ketika saya mendefinisikan const char c = 'a';
dan menelepon uart_putch(c);
, itu tidak berfungsi. Ini mencetak sesuatu, meskipun bukan a
- saya pikir mereka adalah 0x00
karakter, yang saya dapatkan dari hexdump -x /dev/ttyUSB0
. Ini bukan masalah dengan port serial di komputer saya; Saya melihat dengan cakupan dan sinyalnya berbeda (kiri berfungsi, kanan tidak):
Kode ini sederhana:
void main(void) {
init(); // Sets up ports and UART control registers
while (1) {
uart_putch('a'); // or c
}
}
Apa yang tidak berfungsi adalah menggunakan salah satu fungsi string ( puts
,, printf
dll.), Yang saya pikir terkait - jadi dalam pertanyaan ini saya membuat contoh kerja minimal dengan karakter.
Rakitan yang dihasilkan saat saya menggunakan variabel c
memiliki:
_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
Dan dengan konstanta yang ada di _main
blok:
movlw (061h)&0ffh
call _putch
Saya menggunakan MPLAB XC8 C Compiler V1.41 (24 Januari 2017), dengan bagian dukungan versi 1.41.
Bagian yang relevan dari Makefile saya:
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 $<
Setiap bantuan untuk mendapatkan pekerjaan ini akan sangat dihargai.
unsigned char
, char
, const unsigned char
dan const char
.
byteTx
? Saya khawatir yang byte
mungkin didefinisikan di tempat lain sebagai tipe data. (Sepertinya itu akan menghasilkan diagnostik kompiler, tetapi jelas sesuatu yang aneh sedang terjadi di sini.) Dan sebagai tes lain, apakah putch(0x61)
berperilaku salah dengan cara yang sama putch('a')
? Saya bertanya-tanya apakah instruksi membaca tabel membaca data 8-bit atau 16-bit. Register PIC W hanya 8 bit, kan?