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
আমি এমপিএলবিএস এক্সসি 8 সি সংকলক ভি 1.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
ডেটা ধরণের হিসাবে অন্য কোথাও সংজ্ঞায়িত হতে পারে। (মনে হচ্ছে এটি একটি সংকলক ডায়াগনস্টিক জেনারেট করবে তবে স্পষ্টতই এখানে কিছু অদ্ভুত ঘটনা চলছে another) এবং অন্য পরীক্ষা putch(0x61)
হিসাবে, putch('a')
কী একইভাবে দুর্ব্যবহার করা হয় ? আমি ভাবছি যে টেবিল পড়ার নির্দেশটি 8-বিট বা 16-বিট ডেটা পড়ছে। পিআইসি ডাব্লু রেজিস্টার 8 টি বিট যদিও ঠিক আছে?