ฉันมีปัญหาที่ค่อนข้างแปลกด้วย XC8 ในไมโครคอนโทรลเลอร์ PIC18F27K40 ใน 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 (24 มกราคม 2017) พร้อมส่วนสนับสนุนรุ่น 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 บิตใช่ไหม?