PIC18F27K40 마이크로 컨트롤러에서 XC8과 관련하여 다소 이상한 문제가 있습니다. PIC16F1778에서는 작동합니다 . 나는 정의했다 :
void uart_putch(unsigned char byte) {
while (!PIR3bits.TX1IF);
TX1REG = byte;
}
내 main
루프에서을 호출 uart_putch('a');
하면 정상적으로 작동합니다. 그러나를 정의 const char c = 'a';
하고 호출 uart_putch(c);
하면 작동하지 않습니다. 그것은 아니지만 무언가를 인쇄합니다 a
-나는 그들이 0x00
얻는 문자 라고 생각 hexdump -x /dev/ttyUSB0
합니다. 내 컴퓨터의 직렬 포트에는 문제가 없습니다. 나는 스코프를 보았고 신호가 다릅니다 (왼쪽 작동, 오른쪽 작동하지 않음).
코드는 간단하다 :
void main(void) {
init(); // Sets up ports and UART control registers
while (1) {
uart_putch('a'); // or c
}
}
작동하지 않는 것은 문자열 함수 ( puts
, printf
등)를 사용하는 것입니다.이 문제는 관련이 있다고 생각합니다.이 질문에서는 문자로 최소한의 작업 예제를 만들었습니다.
변수 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
그리고 상수로 _main
블록에 있습니다.
movlw (061h)&0ffh
call _putch
부품 지원 버전 1.41과 함께 MPLAB XC8 C 컴파일러 V1.41 (2017 년 1 월 24 일)을 사용하고 있습니다.
내 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 $<
이 작업을 수행하는 데 도움을 주시면 대단히 감사하겠습니다.
unsigned char
, char
, const unsigned char
와 const char
.
byteTx
? 나는 그 걱정 byte
의 다른 데이터 유형으로 정의 될 수 있습니다. (이것은 컴파일러 진단을 생성하는 것처럼 보이지만 분명히 이상한 일이 일어나고 있습니다.) 다른 테스트 putch(0x61)
와 마찬가지로 putch('a')
? 테이블 읽기 명령이 8 비트 또는 16 비트 데이터를 읽고 있는지 궁금합니다. 그래도 PIC W 레지스터는 8 비트에 불과합니다.