bác nào biết chèn 1 đoạn code của asm vào Keil C ko chỉ giùm với.Mình mới chuyển từ ngôn ngữ máy sang Keil lên hơi bỡ ngỡ.Loay hoay mãi không viết được giao tiếp với Eeprom (trong asm hỗ trợ lệnh Movx) vậy trong Keil muốn sử dụng lệnh đó phải làm thế nào ?
Thông báo
Collapse
No announcement yet.
Kết hợp ASM với Keil C
Collapse
X
-
Tiện đây cho hỏi bạn nào có bản Keil full của Ngô Hải Bắc gửi cho mình được không.Hiện giờ mình đang dùng bản cũ quá nó không cho xem help, thank mọi người.
Gửi cho mình theo vanquang.qn.82@gmail.com
-
Cach chen ASM vào Keil như sau:
-Chọn Option của file C, trong tab Properties bạn tick sáng hai chọn:
+ Generate Asembler SRC File
+ Asembler SRC File
tức là từ xám trở thành đen ấy.
Bây giờ quay trở lại file c dó
Các mã ASM của bạn được viết giữa hai khóa sau:
#pragma ASM
// mã ASM của bạn
#pragma ENDASM
Ngoài ra trong C viẹc giao tiếp RAM, EEPROM song song đơn giản hơn ASM nhiều.
Bạn vẫn có thể dùng lẹnh MOVX trong đoạn ASM đó. Hoặc đơn giản bạn chỉ cần khai báo dữ liệu là XDATA la bạn có thể ghi đọc bình thường như các loại dữ liệu khác. Mọi việc trình dịch làm hộ bạn hết. Bạn cũng có thể dùng các Macro của Keil:
#include<absacc.h>
bạn có thể dùng các Macro sau:
unsigned char i;
unsigned int j;
- i=CBYTE[Addr] ; //doc 1 byte trong flash chip
- j=CWORD[Addr]; //doc 1 word trong flash chip
- i=D/P/XBYTE[Addr];
// DBYTE doc 1 byte trong on Chip RAM,
// PBYTE doc 1 byte trong Ram ngoài hình như theo trang gi đấy
//XBYTE doc 1 byte trong Ram ngoài
vvv..
với D/P/XBYTE nếu bạn gán D/P/XBYTE[Addr]=i; thì tức là bạn ghi vào Ram giá trị i.
nhớ include cái file o trên nhớ.
Còn gửi cho bạn file Keil ah:
OK nhưng toi chỉ dùng bản 2.0 tức là bản C Compiler 7.09 thôi không biết bạn có bản này hay cũ hơn.
Hi vọng đã giúp được bạn phần nào
Comment
-
Hay quá, Pentum_I nói khá đầy đủ rồi đó. van quang_qn chịu khó làm vài lần là đảm bảo thành thạo luôn. Lấy 1 ví dụ là hàm đọc và hàm viết tới xram:
unsinged char i;
unsinged char xdata Mtam[128];
//Hàm viết tới 128 ô nhớ của xram giá trị 255
void Viet_XRAM(void)
{
for(i=0;i<128
{
Mtam[i] = 255;
i++;
}
}
//Hàm đọc lại nội dung của 128 ô nhớ vừa viết và truyền về máy tính
void Doc_XRAM(void)
{
for(i=0;i<128
{
SBUF = Mtam[i];
Hdelay_ms(10); //trì hoãn khoảng 10 ms
i++;
}
}!e
Comment
-
Nguyên văn bởi vanquang_qnThank!
minh da lam dc roi rat cam on moi nguoi
to zemen:
Hdelay_ms(10); //trì hoãn khoảng 10 ms
cho minh hoi trong Keil lam sao de tinh toan dc khoang thoi gian delay that chinh xac!e
Comment
-
Nguyên văn bởi zemenQua đây cũng xin hỏi luôn pentum_I là khi ta dùng các macro như CBYTE, CWORD, #define, sbit ... thì IROM có tốn thêm byte bộ nhớ không?
Tốn hay không là do bạn
Riêng các định nghĩa
#define AAA gì gì đấy
sbit BBB= gì gì đấy;
chẳng tốn thêm byte nào trong code cả vì đây không phải là một lệnh nào cả. Nó gần như là các khai báo const mà thôi.
nếu dùng lệnh:
i=AAA; thì i=gì gì đấy; chẳng khác gì nhau. cái AAA và cái gì gì đấy là 1 mà thôi. Khi biên dịch thì trình biên dịch nó thấy thẳng giá trị chứ đâu có đưa vào code rồi lấy ra.
riêng định nghĩa macro:
define a () thay thế cho một đoạn lệnh ví dụ:
#define high(a) (a & 0xFF00)>>8 chẳng hạn
thì khi dùng macro này nó giống nhw 1 hàm high(a) có khi còn tốn ít byte code hơn cả ta viết ấy.
còn cái CBYTE với CWORD hay cái macro nào nữa theo tôi nó đã tối ưu về khoản này rồi. Vì CBYTE hay CWORD thì cái lệnh sau cùng có lẽ vẫn là MOVC A,A+@DPTR cả mà thôi.
Còn tốn hay không có lẽ chỉ do bạn cố bắt nó tính toán một cái địa chỉ với đủ các phép tính ví du:
i=CBYTE[a*c+d*5+f /q....] thì chắc là ốm nhỉ
tốt nhất bản thử xem cái file .SRC bạn sẽ thấy nó dịch các macro ra asm như thế nào.
Không biết tui nói có đúng không.Last edited by Pentium_I; 26-07-2006, 11:10.
Comment
-
có bạn cho hỏi, tại sao tất cả các project của mình làm nếu không chọn Generate Asembler SRC File thì đều chạy tốt, nhưng khi chọn Generate Asembler SRC File thì lại báo lỗi CODE-ADDRESS EXPECTED, và khong tạo dc file hex. đây là vấn đề mình đã tìm hiểu mà ko hiểu tại sao. cứ chọn vào cái đó là ko dịch và báo lỗi, cũng như các bạn mình cũng muốn chèn asm vào C nhưng ko làm dc
Comment
-
Nguyên văn bởi sinhluccó bạn cho hỏi, tại sao tất cả các project của mình làm nếu không chọn Generate Asembler SRC File thì đều chạy tốt, nhưng khi chọn Generate Asembler SRC File thì lại báo lỗi CODE-ADDRESS EXPECTED, và khong tạo dc file hex. đây là vấn đề mình đã tìm hiểu mà ko hiểu tại sao. cứ chọn vào cái đó là ko dịch và báo lỗi, cũng như các bạn mình cũng muốn chèn asm vào C nhưng ko làm dc
Comment
-
ồ hay quá, cảm ơn Pentum_I, tớ thấy Pentum_I nói có lí lắm. Tớ đang viết chương trình dài và chồng chéo quá nên lên cả chục kbyte. Do đó, chả nhớ nổi giá trị của các biến hằng, vì vậy phải dùng nhiếu macro để định nghĩa. Hơn nữa tớ chia chương trình làm nhiều file, mỗi file chứa một số hàm và macro. Việc chia file này lúc đầu báo khá nhiều lỗi và tớ phải tốn công sửa tới sửa lui, o biết có phải đó là lí do làm dài chương trình ra o?!e
Comment
-
tai sao ko asm gen SCR dc????
day la project cua minhAttached Files
Comment
-
Thong cam nho toi khong biet lam sao de post len dc
ban viet lai file.c voi noi dung nhu sau, roi so sanh lai voi cua ban
ban chu y cac dong mau do toi danh dau
voi lai ban phai tick ca
Generate Assembler SRC File
Assemble SRC File
thanh tick co mau den ay
sfr DuLieu = 0x90;
sbit clkIN = 0xA0;
sbit clkOUT = 0xA1;
sbit DongBo = 0xA2;
sfr CheDoDinhThoi = 0x89;
sfr ByteThapDinhThoi0 = 0x8A;
sfr ByteCaoDinhThoi0 = 0x8C;
sbit BatDinhThoi0 = 0x8C;
sbit Ngat = 0xAF;
//sbit NgatDinhthoi0 = 0xA9;
#define BeRong 4
#define ChieuCao 16
#define SoByteMang 64
#define NgatDu 5
#define SoDemDinhThoi 256
char code KhoiTao[SoByteMang] ={0x00,0x00,0x00,0x00,
0x00,0x01,0x00,0x00,
0x80,0x01,0x00,0x00,
0xc0,0x01,0x00,0x00,
0xe0,0x01,0x00,0x00,
0xb0,0xff,0xff,0x3f,
0x98,0xff,0xff,0x3f,
0x0c,0x00,0x00,0x30,
0x0c,0x00,0x00,0x30,
0x98,0xff,0xff,0x3f,
0xb0,0xff,0xff,0x3f,
0xe0,0x01,0x00,0x00,
0xc0,0x01,0x00,0x00,
0x80,0x01,0x00,0x00,
0x00,0x01,0x00,0x00,
0x00,0x00,0x00,0x00 };
char idata X[SoByteMang];
char bdata ThanhGhiTrungGian;
sbit BitThapNhat= ThanhGhiTrungGian ^ 0;
sbit BitCaoNhat = ThanhGhiTrungGian ^ 7;
bit BitRa;
bit BitVao;
int ChiSo,DemSoLanNgatT0;
int SoDongDaXuat;
#pragma NOAREGS
static void XuLiNgatDinhThoi0 (void)
{
int k;
if (++DemSoLanNgatT0==NgatDu)
{
DemSoLanNgatT0=0;
SoDongDaXuat++;
if (ChiSo==0) {DongBo = 1;}
else {DongBo = 0;}
for (k=1; k<=BeRong; k++)
{
DuLieu = X[ChiSo];
clkIN = 1;
clkIN = 0;
ChiSo++;
}
clkOUT = 1;
clkOUT = 0;
if (ChiSo > (SoByteMang-1)) {ChiSo=0;}
}
}
#pragma AREGS
void NgatDinhThoi0 (void) interrupt 1 using 1
{
XuLiNgatDinhThoi0 ();
}
void Quay1DiemCho1Hang (int SoHang)
{
int SoByte;
ThanhGhiTrungGian = X[SoHang*BeRong - 1];
BitVao = BitCaoNhat;
for (SoByte=0; SoByte<BeRong; SoByte++)
{
ThanhGhiTrungGian = X[(SoHang-1)*BeRong + SoByte];
BitRa = BitCaoNhat;
ThanhGhiTrungGian *=2;
if (BitVao) {ThanhGhiTrungGian++;}
BitVao = BitRa;
X[(SoHang-1)*BeRong + SoByte] = ThanhGhiTrungGian;
}
}
void main (void)
{
int Hang;
SoDongDaXuat=0;
ThanhGhiTrungGian = 0;
ChiSo = 0;
DemSoLanNgatT0 = 0;
for (Hang=0; Hang<=SoByteMang; Hang++)
{X[Hang] = KhoiTao[Hang];}
CheDoDinhThoi = (CheDoDinhThoi & 0xf0) | 0x02;
ByteCaoDinhThoi0 = 256 - SoDemDinhThoi;
ByteThapDinhThoi0 = ByteCaoDinhThoi0;
Ngat = 1;
// NgatDinhthoi0 = 1;
BatDinhThoi0 = 1;
while (1)
{
if (SoDongDaXuat==48)
{ SoDongDaXuat=0;
for ( Hang=1; Hang<=16; Hang++)
{Quay1DiemCho1Hang(Hang);}
};
};
}
Them nua
Ban nen add thêm 2 file Init.a51 và Startup.A51 vào nhớ.
Không biết tôi nói có đúng khôngLast edited by Pentium_I; 28-07-2006, 12:17.
Comment
Bài viết mới nhất
Collapse
-
Comment on Đồng hồ công tơ điện tửbởi qpdt03
-
Channel: Điện tử dành cho người mới bắt đầu
23-03-2024, 17:03 -
-
Comment on Đồng hồ công tơ điện tửbởi qpdt03
-
Channel: Điện tử dành cho người mới bắt đầu
23-03-2024, 17:03 -
-
Trả lời cho Đồng hồ công tơ điện tửbởi qpdt03Hình ảnh mạch của nó đây, mình mang đồng hồ điện tử ra đo giá trị điện trở dán ghi trên lưng các con điện trở trong mạch đều đúng, mà công tơ điện tử vẫn đo sai, không biết nó hỏng chỗ nào; đã ấn nút reset lại nhưng vẫn không đc. Nhờ các bác có kinh nghiệm giúp đỡ. Thanks!
-
Channel: Điện tử dành cho người mới bắt đầu
23-03-2024, 17:03 -
-
bởi qpdt03Mình mới mua 1 cái đồng hồ công tơ điện tử trên shopee; loại hiển thị 4 thông số V,A,W và tổng số Kwh nhưng về cắm thử đc 1 hôm thì chỉ số V báo 378v, cắm về 100v cũng báo 350v có bác nào biết cách sửa chữa nó không chỉ giúp mình nhé. Xin cảm ơn mọi người đã đọc bài.
-
Channel: Điện tử dành cho người mới bắt đầu
23-03-2024, 16:46 -
-
bởi notooth1Các bạn xem giúp mình đây là tụ phân cực hay không phân cực nhé.
...-
Channel: Hướng dẫn tìm thông tin linh kiện
20-03-2024, 18:06 -
-
bởi carl22Xin chào tất cả mọi người.
Tôi hiện đang chế tạo một máy phay CNC. Máy phay được điều khiển thông qua Raspberry Pi 3 b+ và Smoothieboard v1.1 với trình điều khiển động cơ bước ACT DM 542 và động cơ 1,8° 2A.
Trục X 1,8° 3 A chạy qua trình điều khiển động cơ bước vì bảng sinh tố chỉ...-
Channel: Cơ cấu chấp hành (Actuator)
20-03-2024, 15:48 -
-
bởi ningoleChào các bác! Em là newbie về điện tử đang muốn làm một cái đèn báo cho ổ cắm nhưng chưa rành về mạch mong các bác giúp đỡ!
Nhu cầu của e là muốn làm 1 đèn báo nguồn AC 220V:
Nguồn 220v -> Phích cắm -> nối với 1 ổ cắm....-
Channel: Điện tử dành cho người mới bắt đầu
20-03-2024, 11:09 -
-
Trả lời cho có cần thiết phải lắp mạch bms cho khối pin ?bởi bao98Tất nhiên là bạn cần nó!
BMS là một phần không thể thiếu trong hệ thống ắc quy của xe điện.
nếu bạn không cài đặt BMS, có thể xảy ra vấn đề về pin, thậm chí có thể dẫn đến tai nạn-
Channel: Điện tử dành cho người mới bắt đầu
19-03-2024, 22:51 -
-
Trả lời cho [đồ án] xung đột nguồn điện 12vbởi bao98Để tìm hiểu xem bộ điều hợp UART của bạn được kết nối với cổng USB nào trên Raspberry Pi, bạn có thể sử dụng lệnh ls /dev/ttyUSB* hoặc ls /dev/ttyACM* trong thiết bị đầu cuối. Điều này sẽ liệt kê các cổng USB có sẵn để liên lạc nối tiếp. Cáp có thể được xem ở đây. Bạn cũng có thể kết nối và...
-
Channel: Hỗ trợ học tập
19-03-2024, 22:38 -
-
Trả lời cho cho hỏi move điện là g?bởi DiennuocAQLà sự tiếp xúc giữa 2 tiếp điểm không được tốt gây ra. Ví dụ như đầu dây điện cắm vào chân attomat nhưng lâu ngày ốc siết lỏng dần ra, làm dòng điện chuyển tiếp không tốt, gây ra hệ thống điện chập chờn gọi là move ạ
-
Channel: Điện tử dành cho người mới bắt đầu
19-03-2024, 12:40 -
Comment