मैं एक 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 (जनवरी 24 2017) का उपयोग कर रहा हूं, जिसमें पार्ट सपोर्ट वर्जन 1.41 है।
मेरे मेकफाइल के प्रासंगिक भाग:
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 बिट्स ही है, है ना?