Em đang găp khó khăn các bác ơi, mong các bác giúp em chút. Em cần phải tính toán với số thực kiểu float, kết quả của phép tính phải được gửi lên máy tính và ngươc lại, đồng thời số thực này còn phải được ghi vào EEPROM. Làm thế nào để tách số thực 32bit này thành 8bit để truyền đi đươc. Các bác giúp em với.
Thông báo
Collapse
No announcement yet.
Truyền một số kiểu float trên UART của AVR
Collapse
X
-
hehe
float sothuc32bit;
unsigned int songuyen16bit_H, songuyen16bit_L;
unsigned short sobyteH_H, sobyteH_L, sobyteL_H, sobyteL_L;
songuyen16bit_H = sothuc32bit & 0x11111111111111110000000000000000
songuyen16bit_L = sothuc32bit & 0x00000000000000001111111111111111
sobyteH_H = songuyen16bit_H & 0x1111111100000000
sobyteH_L = songuyen16bit_H & 0x0000000011111111
sobyteL_H = songuyen16bit_L & 0x1111111100000000
sobyteL_L = songuyen16bit_L & 0x0000000011111111
-
Ngoài cách bác V nêu ở trên, bác thử 2 cách sau đây, nếu có được thì báo lại bà con nhé:
Cách 1: giả sử biến a là float, vậy *a là địa chỉ đầu tiên của biến a. Vậy:
Nghĩ là biến kiểu float sẽ có 4 byte *a,*(a+1),*(a+2),*(a+3). Bác chỉ việc gắp 4 thằng này vào buffer truyền là được.
Cách 2: khai báo kiểu float a at address.
Vậy sau khi truyền thì chỉ việc truyền data tại 4 vị trí address...address+3 là cũng ok.-------------------
Comment
-
truyen du lieu len may tinh
Toi dang lap trinh cho con ATMEGA16 tren CODE
VisionAVR nhung bi vuong 1 cho:
Toi muon gui truyen du lieu tu VXL len may tinh nhung
ko sao lam duoc.
neu co the gui cho toi 1 doan ma nguon de giai quyet
van de nay(co the vi du bang cach gui 1 ki tu len)
phan mem nhan tren may tinh la HyperTerminal.
Xin cam on va mong tra loi som.
tranybinh@yahoo.com
Comment
-
Ở đây có hai vấn đề bạn cần kiểm tra. Thứ nhất về phần cứng, bạn kiểm tra và đo xem đã đúng chưa, đã thông mạch chưa. Thứ hai là phần mềm, ở đây có hai phần, phần mềm trên máy tính để nhận Data từ cổng COM và phần mềm viết cho VXL. Về phần mềm viết trên VXL cho cổng nối tiếp bạn có thể tham khảo mã lệnh tại www.atmel.com. Chúc bạn thành công.
Comment
-
Phần cứng tôi đã kiểm tra bằng cách lập trình cho con 89S52 truyền dữ liệu lên máy tính rất ổn rồi.Phần mềm nhận dữ liệu tôi sử dụng HyperTerminal và cũng thử như trên cũng ổn rồi,nên tóm lại tôi nghĩ bị vướng ở phần lập trình cho VXL.Tôi đã tham khảo và sử dụng ham puchar va getchar để gửi và nhận dữ liệu,cũng như hỏi bạn bè nhưng chưa ai thực sự làm thực tế nên cũng chỉ trả lời tôi như thế.Mong trên diễn đàn có ai đã lắp mạch và thử được thành công thì giúp tôi.cảm ơn nhiều.
Comment
-
Nguyên văn bởi ybinhPhần cứng tôi đã kiểm tra bằng cách lập trình cho con 89S52 truyền dữ liệu lên máy tính rất ổn rồi.Phần mềm nhận dữ liệu tôi sử dụng HyperTerminal và cũng thử như trên cũng ổn rồi,nên tóm lại tôi nghĩ bị vướng ở phần lập trình cho VXL.Tôi đã tham khảo và sử dụng ham puchar va getchar để gửi và nhận dữ liệu,cũng như hỏi bạn bè nhưng chưa ai thực sự làm thực tế nên cũng chỉ trả lời tôi như thế.Mong trên diễn đàn có ai đã lắp mạch và thử được thành công thì giúp tôi.cảm ơn nhiều.
Neu ban dung codewizard de tao ma thi coi nhu ban khai bao da dung. Bay gio ban muon goi du lieu len may tinh chi can dung lenh sau:
UDR='A'
delay_ms(3); 2 lenh nay se goi mot chu A len hyper terminal
cach thu 2 la : printf("Hello"); nó sẽ in dòng chữ Hello len màn hình
nếu bạn dùng các hàm printf(), putchar(), getchar()... thì chú ý là trên phần mã tạo sẳn có dòng chữ #include <stdio.h> hay chưa
chúc bạn thành công.
Comment
-
Mở Codewizard ra, trước hết hãy chọn đúng chip và thạch anh. Sau chuyển vào tab USART sẽ có 2 ô để tích vào: transmitter và receiver. Bạn dùng cái nào thì tích vào cái đó. Khi tích vào thì sẽ hiện ra tiếp các thông số khác để chọn tiếp như baud rate, double speed mode (x2), khung dữ liệu, chế độ truyền. Giờ để thử thì bạn cứ chọn transimitter, không chọn interrupt, baud rate = 9600, khung truyền là 8data + 1stop + no parity. Xong rồi "Generate, Save and Exit". Trong main() chỉ cần dùng hàm putchar(0x30) rồi biên dịch, nạp chip. Trên PC bật hyper lên rồi cấu hình tốc độ và khung truyền giống như thế. Cấp nguồn cho mạch là có số 0 trên giao diện hyper ngay, đơn giản thôi mà.
Giang hồ hiểm ác, bảo trọng.
Comment
-
Nếu bạn chưa có kinh nghiệm làm việc với AVR, rất có thể bạn không biết cách cấu hình các fuse bytes cho chúng, do đó mà AVR của bạn mới mua về sẽ mặc định chạy với mạch dao động RC bên trong chứ không phải với thạch anh bên ngoài mặc dù trong thiết kế vẫn có thạch anh bên ngoài. Mình không nhớ rõ nhưng nếu dùng RC bên trong thì giá trị mặc định cho mega16 là 1MHz. Nó sẽ là nguyên nhân gây ra sai baud rate, ảnh hưởng đến hoạt động của USART.
Comment
-
Nguyên văn bởi CHIBANGCách 1: giả sử biến a là float, vậy *a là địa chỉ đầu tiên của biến a. Vậy:
Nghĩ là biến kiểu float sẽ có 4 byte *a,*(a+1),*(a+2),*(a+3). Bác chỉ việc gắp 4 thằng này vào buffer truyền là được.
Còn nếu khai báo biến a là kiểu con trỏ (VD : float *a) thì tại địa chỉ đầu tiên của a đã chứa giá trị số thực rồi ,khi đó *a+1 =NULL ,*a+2 =NULL,..
Comment
-
mình có cách này các ban tham khảo thử nhá!
mỗi lần truyền đi ta chỉ cần truyền 1 byte thôi.truyền 4 lần là được
float usart_data;
char n;
/*chương trình của bạn*/
while (1)
{
n=usart_data; //vì n là biến kiểu char nên chỉ lấy 8bit thấp
putchar(n); //xuất n đi
n=usart_data>>8; // n= 8 bit tiếp theo
putchar(n);
n=usart_data>>8; // n= 8 bit tiếp theo
putchar(n);
n=usart_data>>8; // n= 8 bit cao
putchar(n);
delay_ms(100);
};
/****************/
ta nhận dữ liệu như thế này nhá
vi dụ có 1 con ATMEGA khác nhận
/**************************/
char n=0;
float usart_data;tmp;
interrupt [USART_RXC] void usart_rx_isr(void)
{
char data;
data=UDR;
n++;
if(n=1)
tmp=data;
if(n=2)
tmp=data*255+data;
if(n=3)
tmp=data*255*255+data;
if(n=4){
tmp=data*255*255*255+data;
n=0;
usart_data=tmp;
}
}
Comment
-
Nguyên văn bởi ybinh Xem bài viếttrong codewizard phần USART có khá nhiều chức năng với các câu lệnh như trên bạn có thể hướng dẫn cho tôi cách khai báo,bởi vì tôi đã thử khá nhiều với các câu lệnh trên nhưng vẫn chưa được.
Xin cảm ơn.Phone: 0909319477
Email:
Comment
-
hihi. cái này em cũng đang làm. trong thư viện C #include <stdlib.h>
#include <string.h> có cái hàm ftoa (...) chuyển từ số thực sang chuỗi kí tự, khi chuyển sang chuỗi rồi thay vì gửi cả số float bốn byte to uỳnh ta chỉ gửi từng kí tự char một, trên máy tính khi nhận đc rồi chuyển ngược lại là ok. hihi
Comment
-
Cho các bạn.
Minh đã viết được một chuơng trình giao tiếp giữa PC và AVR. Nhưng mình còn một chỗ bị sai. Đó là khi mình truyền số 24 hoặc 25 hoặc 26 từ AVR lên PC thì PC sẽ nhận sai. Cho minh hỏi là tại sao vậy.
Các bạn chỉ cần quan tâm file CohenCoon 6.1day 4.5 và file INT 22 CC 2.5.
Các bạn sẽ mở không được file C# vì trong bài này mình có dùng một component là TeeChart. Nên chỉ thể xem code. Xin thông cảm
Trong file INT 22 CC 2.5 mình có viết một đoạn code:
if ( cur-res <27) && (cur-res > 24) cur_res = 27; là để loại bỏ số 24,25,26.
file CohenCoon 6.1 day 4.5 viết bằng C# trong Visual Studio 2005
File INT 22 CC 2.5 viết bằng codevision
Nếu bạn nào tìm thấy chỗ sai của mình xin email: vanhao.truong@gmail.com
Xin cám ơn
Comment
Bài viết mới nhất
Collapse
-
Trả lời cho Tìm linh kiện sửa loa vi tính.bởi nhathung1101Ra cửa hàng điện tử bất kỳ.
Dõng dạc hét lên:
- Cho 1 con 4558.
Có luôn. Nó chỉ là con Opamp cùi bắp thông thường thôi mà. Giá 2k hay 3k gì đó.
Nếu muốn âm thanh hay hơn, thì mua NE5535, mất 2 cốc beer thôi.-
Channel: Điện tử dành cho người mới bắt đầu
Hôm qua, 22:38 -
-
Trả lời cho Hỗ trợ tìm linh kiện mạch hạ áp 220V - 110Vbởi nhathung1101Mạch dùng được, nhưng phải kết hợp với Transistor NPN công suất bên ngoài. Loại chịu điện áp cao, dòng lớn.
Loại mạch này nhái theo cái loại IC họ STR trong mấy cái ti vi cổ lỗ ngày xưa thôi mà. Còn được gọi là "ổn áp...-
Channel: Hướng dẫn tìm thông tin linh kiện
Hôm qua, 22:28 -
-
Trả lời cho Tìm linh kiện sửa loa vi tính.bởi Nikon57
-
Channel: Điện tử dành cho người mới bắt đầu
Hôm qua, 21:36 -
-
bởi Nikon57Bộ loa vi tính Microlap cũ của tôi tầng tiền khuyêchs đại bị lỗi. Sau kiểm tra , nguyên nhân là do con chíp 4558D JRC 0077C chết nóng rực. Không thêt tìm được con IC đúng nguyên mã như vậy, để thay thế tôi có thể thay bawngfcon IC 4558 JRC 0058T được không? Mong các bác thành thạo cho ý kiến.
-
Channel: Điện tử dành cho người mới bắt đầu
Hôm qua, 21:36 -
-
Trả lời cho Hỗ trợ tìm linh kiện mạch hạ áp 220V - 110Vbởi dinhthuong80Mạch trên nếu dùng vào việc khác ( theo người thiết kế ra nó) thì cũng được: làm mạch tiền khuếch đại (pre-Amply) cho "con sò công suất" hay mạch công suất, để chạy cái loa cũng tạm ok.
Các chữ E,B,C trên mạch trên gắn...-
Channel: Hướng dẫn tìm thông tin linh kiện
Hôm qua, 16:47 -
-
Trả lời cho Hỗ trợ tìm linh kiện mạch hạ áp 220V - 110Vbởi iTronvây là mình đã hiểu lí do vì sao ông ấy lại đưa mình nguyên hộp có hơn chục cái mạch này trong đó...
-
Channel: Hướng dẫn tìm thông tin linh kiện
Hôm qua, 12:21 -
-
Trả lời cho Hỗ trợ tìm linh kiện mạch hạ áp 220V - 110Vbởi mèomướpDạ mạch này hông dùng được ạ. Chú sang chị hàng xóm mượn cái cuốc kiếm góc nào trong bản có nhìu người qua lại để trồng 1 cây cải ngồng, ngày ngày chú chịu khó qua đấy tưới chăm cho nó lớn ạ, vài tháng sau nó to chú mang ra chợ bán...
-
Channel: Hướng dẫn tìm thông tin linh kiện
Hôm qua, 12:13 -
-
bởi iTronEm được ông anh cho mạch như hình, nhờ ace trong diễn đàn xem giúp mạch này dùng ổn ko và dùng linh kiện công suất nào thì phù hợp.
Xin cảm ơn...-
Channel: Hướng dẫn tìm thông tin linh kiện
Hôm qua, 11:27 -
-
Trả lời cho Tiếng Anh cho người Việtbởi dinhthuong80Vì sản phẩm của họ dân mình có dùng, và có lẽ cũng không phải là không phổ biến, nên ĐT quyết định gởi thư điện tử tiếng Anh cho họ như sau, ( đã sửa vài từ như được góp ý, vì nếu lịch sự thì dù vòng vo cũng nên phản hồi, vì...
-
Channel: Tâm tình dân kỹ thuật
25-02-2025, 16:36 -
-
Trả lời cho Tiếng Anh cho người Việtbởi tuyennhanCái thư sai ngay câu chào Dear sir mới đúng Hi chỉ dùng cho người quen , các vấn đề về kỹ thuật nó không trả lời hoặc nói loanh quanh tránh ảnh hưởng đến công ty .
Giup1 người cần không giúp người không cần với lại văn mình vợ người nha đừng quên .-
Channel: Tâm tình dân kỹ thuật
23-02-2025, 07:44 -
Comment