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 $<
これを機能させる手助けをいただければ幸いです。
unsigned char
、char
、const unsigned char
とconst char
。
byteTx
代わりに引数の名前を変更するとどうなりますか?byte
他の場所でデータ型として定義されているのではないかと心配しています。(コンパイラの診断を生成するように見えますが、明らかに何か奇妙なことがここで起こっています。)そして、別のテストとして、putch(0x61)
誤動作はputch('a')
?テーブル読み取り命令が8ビットまたは16ビットのどちらのデータを読み取るのかと思います。PIC Wレジスタはたった8ビットですよね?