Tôi có một vấn đề khá lạ với XC8 trên vi điều khiển PIC18F27K40. Trên PIC16F1778, nó hoạt động . Tôi đã xác định:
void uart_putch(unsigned char byte) {
while (!PIR3bits.TX1IF);
TX1REG = byte;
}
Khi, trong main
vòng lặp của tôi , tôi gọi uart_putch('a');
, điều này hoạt động tốt. Tuy nhiên, khi tôi xác định const char c = 'a';
và gọi uart_putch(c);
, nó không hoạt động. Nó in một cái gì đó, mặc dù không phải là a
- tôi nghĩ chúng là những 0x00
nhân vật mà tôi có được hexdump -x /dev/ttyUSB0
. Đây không phải là vấn đề với cổng nối tiếp trên máy tính của tôi; Tôi đã xem xét một phạm vi và tín hiệu là khác nhau (hoạt động bên trái, bên phải không):
Mã rất đơn giản:
void main(void) {
init(); // Sets up ports and UART control registers
while (1) {
uart_putch('a'); // or c
}
}
Những gì không hoạt động hoặc là sử dụng bất kỳ hàm chuỗi nào ( puts
, printf
v.v.), mà tôi nghĩ là có liên quan - vì vậy trong câu hỏi này tôi đã làm một ví dụ làm việc tối thiểu với các ký tự.
Tập hợp được tạo khi tôi sử dụng một biến c
có:
_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
Và với một hằng số, nó có trong _main
khối:
movlw (061h)&0ffh
call _putch
Tôi đang sử dụng MPLAB XC8 C Compiler v1.41 (ngày 24 tháng 1 năm 2017), với phiên bản hỗ trợ một phần 1.41.
Các phần có liên quan trong Makefile của tôi:
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 $<
Bất kỳ trợ giúp để có được công việc này sẽ được rất nhiều đánh giá cao.
unsigned char
, char
, const unsigned char
và const char
.
byteTx
thay thế? Tôi lo ngại rằng byte
có thể được định nghĩa ở nơi khác là một loại dữ liệu. (Có vẻ như điều đó sẽ tạo ra chẩn đoán trình biên dịch, nhưng rõ ràng có điều gì đó kỳ lạ đang diễn ra ở đây.) Và như một thử nghiệm khác, liệu có putch(0x61)
hoạt động sai giống như putch('a')
vậy không? Tôi đang tự hỏi liệu hướng dẫn đọc bảng đang đọc dữ liệu 8 bit hay 16 bit. Đăng ký PIC W chỉ có 8 bit, phải không?