Bir PIC18F27K40 mikrodenetleyici üzerinde XC8 ile oldukça garip bir sorun var. Bir PIC16F1778 üzerinde çalışır . Ben tanımladım:
void uart_putch(unsigned char byte) {
while (!PIR3bits.TX1IF);
TX1REG = byte;
}
Ne zaman, benim de main
döngü, arayacağım uart_putch('a');
, bu cezayı çalışır. Ancak, tanımlayıp const char c = 'a';
aradığımda uart_putch(c);
işe yaramıyor. Bir şey yazdırmasa da, bir şey değil a
- sanırım onlar 0x00
karakterlerden oluşuyor hexdump -x /dev/ttyUSB0
. Bu, bilgisayarımdaki seri bağlantı noktasıyla ilgili bir sorun değil; Bir kapsam ile baktım ve sinyal farklı (sol işler, sağ değil):
Kod basit:
void main(void) {
init(); // Sets up ports and UART control registers
while (1) {
uart_putch('a'); // or c
}
}
Ne işe yaramıyor ilişkili olduğunu düşünüyorum dize işlevleri ( puts
, printf
vb.), Herhangi birini kullanmak - bu yüzden bu soruda karakterlerle minimal bir çalışma örneği yaptı.
Bir değişken kullandığımda oluşturulan derleme c
vardır:
_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
Ve bir sabitle _main
blokta var:
movlw (061h)&0ffh
call _putch
Parça desteği sürüm 1.41 ile MPLAB XC8 C Derleyici V1.41 (24 Ocak 2017) kullanıyorum.
Makefile'mın ilgili kısımları:
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 $<
Bu çalışmayı sağlamak için herhangi bir yardım çok takdir edilecektir.
unsigned char
, char
, const unsigned char
ve const char
.
byteTx
bunun yerine argümanı yeniden adlandırırsanız ne olur ? byte
Başka bir yerde bir veri türü olarak tanımlanmış olabilir endişeliyim . (Bu bir derleyici tanılama üretecek gibi görünüyor, ama açıkça burada garip bir şey oluyor.) Ve başka bir test olarak, putch(0x61)
yanlış davranış aynı şekilde putch('a')
mi? Tablo okuma talimatının 8 bit mi yoksa 16 bit veri mi okuduğunu merak ediyorum. PIC W kaydı sadece 8 bit, değil mi?