C Việc thay đổi các loại biến K * E * I * L

G

GrandAlf

Guest
Tôi có một biến int rằng trong một số phần của chương trình có chứa một số lượng ít hơn 255.Tôi cần phải gửi này như là một byte đơn vào cổng nối tiếp (SBUF = xx).Chỉ cần trước khi truyền tôi sao chép nội dung cho một biến char và gửi mà thay vào đó ok, lúc đầu còn các số 1,2,3 nhận được, nhưng etc 4,5,6 không.Tôi có thể không trực tiếp sử dụng một biến char, như trong các phần khác của chương trình nó cần phải được 16bits.Cũng đã cố gắng gửi biến int trực tiếp.Cũng có và để mặt nạ ra byte trên, và với>> 4 và <<4 để chuyển bit.Không có những nỗ lực dường như hoạt động chính xác.Tôi xin được hầu hết các đánh giá cao lời khuyên nào.

 
Gì về việc này:

Công đoàn
(
unsigned char bytevar [2];
char charvar [2];
int wordvar;
int intvar;
) biến;

Nếu bạn muốn sử dụng nó như 16 variable.wordvar bit hoặc variable.intvar
Hoặc theo 8 varible.bytevar Bit [0] hay variable.bytevar [1] hay variable.charvar [0] hay variable.charvar [1]

Keil đặt các lowbyte của biến 16 bit trong bytevar [1] Công nghệ cao vào các Pic hiện nó theo cách khác vòng ...

hy vọng điều này sẽ giúp

 
Thanks C-Man,
Để cứu lại một lần nữa!.

Chỉ cần một điểm nhỏ, nếu K * eil đặt chỉ càng thấp byte khi sao chép, tại sao có thể không phải là một chỉ cần làm như sau?.

int a;
unsigned char b;
b = a;

 
Chỉ cần một nhận xét nhỏ: chuyển một byte là>> 8 hoặc <<8, không>> 4 hoặc <<4.
Có lẽ điều này giải thích ...

FD.

 
Chào,
điều này có ý kiến là không phải trình biên dịch cụ thể, nhưng có thể quan tâm thêm cho bạn nếu bạn cố gắng gửi các ký tự duy nhất trên cổng nối tiếp:
- Bạn có thể cast int của bạn để char unsigned khi gán biến để SBUF
- Có thể bạn có một vấn đề thời gian, một số MCUs có FIFO theo kiểu bộ đệm xmt để truyền ký tự và do đó cho phép để viết chars nhiều trong dãy trước khi họ đã gửi ra bằng cổng nối tiếp của bạn

hy vọng nó đã giúp,
Maddin

 
Thx FD, Just a typo Silly.

Maddin, Hãy suy nghĩ nó có thể là một prob thời gian như đã nhận được dữ liệu khác nhau.Có lẽ vì sử dụng SBUF trực tiếp?.

 
Việc giải thích của int và char, có nghĩa là cho dù chúng được ký kết hoặc unsiogned là trình biên dịch cụ thể tính năng này.
Is it the int ký kết bạn cố gắng để gửi?
Nếu số trong int ký là possitive cố gắng đúc như
(unsigned char) ((int) tnum) trước khi gửi đi.

Một cách tiếp cận, nhưng tôi không biết liệu máy là về cuối lớn hay nhỏ về cuối nhỏ

unsigned char * pchar = (unsigned char *) (& intnumber);
sau đó
sendByte (* pchar) - nếu nó được rất ít về cuối nhỏ
hoặc
sendByte (*( pchar)) nếu nó là về cuối lớn

 
GrandAlf đã viết:

Thx FD, Just a typo Silly.Maddin, Hãy suy nghĩ nó có thể là một prob thời gian như đã nhận được dữ liệu khác nhau.
Có lẽ vì sử dụng SBUF trực tiếp?.
 
GrandAlf nếu bạn sử dụng UART phần cứng của 8.051 bạn có thể phải đợi cho đến khi một nhân vật trước đó đã được gửi ra và truyền đệm trống.

Đây là một đoạn mã tôi đang sử dụng:

void serial_out (unsigned char nhân vật)
(
trong khi (! TI)
tiếp tục;

TI = FALSE;
SBUF = ký tự;
)

Thói quen này đợi cho đến khi các TI (truyền gián đoạn) flag được thiết lập có dấu hiệu cho thấy các nhân vật trước đó đã được gửi hoàn toàn.

hy vọng bạn có thể sử dụng nó, tốt nhất liên quan đến

 
Thx Artem,
Cả hai char và int là unsigned.Đã thử putchar (b);, nhưng nó khóa lập cpu.Vẫn còn học C, có lẽ tôi có thể sử dụng printf để gửi dữ liệu thô, thay vì sử dụng SBUF trực tiếp.

 
Như Laßt nghỉ mát cố gắng nắm bắt những giá trị mà bạn gửi đến cảng và Sese sản lượng lắp ráp là những gì.Điều này chắc chắn là cuối cùng, nếu không có gì sai với phần cứng.

 
Cảm ơn tất cả mọi người,
C-Man, tôi được sử dụng thường trình của bạn, nhưng thay đổi FALSE đến 0, như tôi không có nó được định nghĩa.Chương trình vẫn trong thói quen mãi mãi.Điều này dẫn tôi để nghi ngờ rằng lá cờ là không bao giờ đặt / unset.Phải có một số cài đặt đăng ký sai.Sẽ phải bit hơn đọc Tôi nghĩ.

 
GrandAlf gửi cho tôi mã của bạn, hoặc bởi PM hoặc gửi nó ở đây, tôi sẽ có một cái nhìn vào nó cho bạn ...

lời chúc mừng tốt đẹp nhất

 
Thats rất loại bạn C-Man,

Đây là mã mà tôi sử dụng để thiết lập các cổng nối tiếp, tôi chỉ truyền (mù) BTW, và không nhận được.

/ / Chức năng
void serial_init (void) (
SCON = 0x50; / / chế độ 1: 8-bit UART, cho phép thu
TMOD = 0x20; / / timer 1 mode 2: 8-Bit tải lại
TH1 = 0x98; / / tải lại giá trị 300 baud
TR1 = 1; / / timer 1 chạy
ES = 0; / / Vô hiệu hoá cổng nối tiếp gián đoạn
EA = 0; / / Vô hiệu hoá
RI = 1;
TI = 1;

 
Hãy thử mã này khởi tạo mới, thay vì mã đăng

TMOD = 0x20; / / timer 1 mode 2: 8-Bit tải lại
TH1 = 0x98; / / tải lại giá trị 300 baud
SCON = 0x52; / / chế độ 1: 8-bit UART, cho phép thu TI vẫn đặt
TR1 = 1; / / timer 1 chạy
ES = 0; / / Vô hiệu hoá cổng nối tiếp gián đoạn
EA = 0; / / Vô hiệu hoá

Tôi biết tôi đã cung cấp cho bạn những mã cũ nhưng sau khi kiểm tra mã của tôi, tôi thấy rằng tôi sử dụng một lá cờ thêm mà được trạng thái của cờ TI trong nối tiếp các ngắt thường lệ (và dĩ nhiên tôi đặt này cờ lúc quyền lực trên).

Tại điện trên bit TI được thiết lập có nghĩa là bạn có thể đặt một byte mới vào SBUF nhưng như mã initialisation cũ erases TI (nó nằm trong SCON) nó sẽ không bao giờ được đặt lại (nó sẽ được đặt nếu bạn đặt một byte vào SBUF mà không cần chờ đợi cho TI để có được H).

Tôi nghĩ rằng bạn chỉ có thể rõ ràng (và không thiết lập) TI và RI bằng phần mềm như nó được thiết lập bởi phần cứng.

Hy vọng điều này sẽ được làm việc với các mã này ...

lời chúc mừng tốt đẹp nhất

 
C-Man.

Vẫn còn khá nhiều cùng với cấu hình này.Tôi có thể gửi 1,2,3 và nhận chúng chính xác, nhưng 4 trở lên là không nhận được hoặc sai.Tôi khá chắc chắn rằng khi kết thúc nhận được là ok, rất khó để kiểm tra những gì đang được đưa ra là vì nó không ký tự in được.Cũng khó khăn để làm một mô phỏng mà không có một thay đổi lớn đến s / w, như tôi đã probs với các thiết bị ngoại vi và eeprom.

Lạ gì tuy nhiên, nếu tôi cố gắng sử dụng printf hoặc putchar insted của SBUF, các prog không trở về từ chức năng, do đó effectivly khóa MPU.Tôi sẽ sumise rằng những Chức đang chờ đợi cờ để được thay đổi, và điều này không xảy ra.

Tôi nghĩ rằng tôi sẽ phải tái viết một phần nhỏ của mã mà tôi có thể mô phỏng, và sau đó đi vào từ đó.

Tôi thực sự đánh giá cao tất cả các bạn lời khuyên, cảm ơn bạn rất nhiều.

 
Tôi nghĩ tôi đã thấy được vấn đề, có vẻ là với RTOS.Single nhiệm vụ là ok.Ít nhất là tôi có một cái gì đó để làm việc ngay bây giờ.Cảm ơn tất cả các chaps lời khuyên của bạn.

 

Welcome to EDABoard.com

Sponsor

Back
Top