Ich habe ein ziemlich seltsames Problem mit XC8 auf einem PIC18F27K40-Mikrocontroller. Auf einem PIC16F1778 funktioniert es . Ich habe definiert:
void uart_putch(unsigned char byte) {
while (!PIR3bits.TX1IF);
TX1REG = byte;
}
Wenn ich in meiner main
Schleife anrufe uart_putch('a');
, funktioniert dies einwandfrei. Wenn ich jedoch definiere const char c = 'a';
und aufrufe uart_putch(c);
, funktioniert es nicht. Es druckt etwas, wenn auch nicht a
- ich denke, es sind 0x00
Charaktere, von denen ich komme hexdump -x /dev/ttyUSB0
. Dies ist kein Problem mit der seriellen Schnittstelle meines Computers. Ich habe mit einem Zielfernrohr gesucht und das Signal ist anders (links funktioniert, rechts nicht):
Der Code ist einfach:
void main(void) {
init(); // Sets up ports and UART control registers
while (1) {
uart_putch('a'); // or c
}
}
Was entweder nicht funktioniert ist eine der String - Funktionen verwenden ( puts
, printf
usw.), die ich denke , ist in Verbindung stehend - so in dieser Frage habe ich ein minimales Arbeits Beispiel mit Zeichen.
Die generierte Assembly, wenn ich eine Variable verwende, c
hat:
_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
Und mit einer Konstante hat es im _main
Block:
movlw (061h)&0ffh
call _putch
Ich verwende MPLAB XC8 C Compiler V1.41 (24. Januar 2017) mit Teilunterstützungsversion 1.41.
Die relevanten Teile meines Makefiles:
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 $<
Jede Hilfe, um dies zum Laufen zu bringen, wäre sehr dankbar.
unsigned char
, char
, const unsigned char
und const char
.
byteTx
stattdessen das Argument umbenennen ? Ich mache mir Sorgen, dass byte
dies an anderer Stelle als Datentyp definiert werden könnte. (Scheint so, als würde dies eine Compiler-Diagnose generieren, aber hier passiert eindeutig etwas Seltsames.) Und verhält sich ein anderer Test putch(0x61)
genauso schlecht wie putch('a')
? Ich frage mich, ob der Tabellenlesebefehl 8-Bit- oder 16-Bit-Daten liest. Das PIC W-Register ist allerdings nur 8 Bit, oder?