У мене досить дивна проблема з 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 Compiler 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 біт, правда?