我在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
我正在使用MPLAB XC8 C编译器V1.41(2017年1月24日),部分支持版本1.41。
我的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 $<
任何帮助使此工作正常进行的工作将不胜感激。
byteTx
会怎样?我担心byte
可能在其他地方将其定义为数据类型。(似乎这样会生成一个编译器诊断程序,但显然在这里发生了奇怪的事情。)作为另一个测试,它的putch(0x61)
行为是否与putch('a')
?我想知道表读取指令是在读取8位还是16位数据。PIC W寄存器只有8位,对吧?