A
amith.srivatsa
Guest
Dear all,
Tôi chỉ cần thay đổi từ PIC16f690 để PIC16F876A.PIC được sử dụng cho ứng dụng điều khiển động cơ và nó sẽ gửi tín hiệu để H-cầu VNH2SP30.Code viết cho PIC16f690 làm việc tốt với không có lỗi.
Nhưng bây giờ, tôi nhận được một số lỗi, chủ yếu là không biết từ khóa, danh tánh không rõ khi tôi thử biên dịch mã tương tự nhưng lần này cho PIC16F876A.Tôi chỉ có thay đổi tập tin tiêu đề.Bất cứ ai có thể giúp tôi gỡ lỗi trong các lỗi này?
Mã này là dưới đây:
/ *
Biên dịch với CCS, xem http://ccsinfo.com/ để biết chi tiết.
Sample - Để thử nghiệm: Gửi tin qua I2C đến địa chỉ 0x50 dữ liệu này -> 0x02107F để đặt động cơ để "Chuyển tiếp" & tốc độ nửa.
Thiết lập: A5 pin: nối tiếp truyền thông
pin C0, C1: INA và INB cho Motor1 (trái)
pin C6, C7: INA và INB cho Motor2 (bên phải)
pin C2, C3: PWM cho động cơ 1 & 2 tương ứng (tốc độ điều khiển)
pinB4, B6: I2C giao tiếp, SDA & SCLLịch sử:
Phiên bản 2:
-Tự động Stop sau 600 ms chức năng để dừng động cơ khi không có lệnh I2C đã được gửi
vẫn có vấn đề với giá trị prescale và div nhưng đang làm việc
Phiên bản 1: Ngày 25 tháng 8 2009
- Để kiểm soát tốc độ và hướng của hai động cơ DC sử dụng hai toàn H-Bridge VNH2SP30 và PIC một
* /
# include <16F876A.h>
# device adc = 8
# Fuses NOWDT / / Không Watch Dog Timer
# Fuses INTRC_IO / / Internal RC OSC, không có CLKOUT
# Fuses NOPROTECT / / Mã không bảo vệ khỏi đọc
# Fuses BROWNOUT / / Thiết lập lại khi phát hiện brownout
# Fuses MCLR / / Master Clear pin bật
# Fuses NOCPD / / Không bảo vệ EE
# Fuses NOPUT / / No Power Up Timer
# Fuses IESO / / Internal External Switch Over chế độ kích hoạt
# Fuses FCMEN / / Fail-an toàn cho phép theo dõi đồng hồ
# use delay (clock = 8000000)
# use rs232 (baud = 19200, xmit = PIN_A5) / / sử dụng cho các com nối tiếp
# sử dụng I2C (Slave, sda = PIN_B4, SCL = PIN_B6) / / sử dụng cho I2C
/ *
Pin định nghĩa
* /
# define dẫn PIN_A4
# define PIN_C0 driver_a / / INA và INB cho motor1
# define PIN_C1 driver_b
# define PIN_C6 driver_c / / INA và INB cho motor2
# define PIN_C7 driver_d
# define LOẠI 0x01
# define VERSION "v1.4"
# define VERSION_MAJOR 1
# define VERSION_MINOR 4
# define GET_TYPE 0x00
# define GET_VERSION 0x01
# define SET_MOTOR 0x02
/ *
Biến
* /
int8 địa chỉ;
int8 nhà nước;
INT1 dataready = false;
INT1 đếm = false;
long int timerone = 0;
int tràn = 0;
int8 mode = 0;
int8 databyte1 = 0;
int8 databyte2 = 0;
/ *
Chức năng nguyên mẫu
* /
/ / Mô tả: Chức năng này cho phép hoặc vô hiệu hóa INA, INB imputs cho cả toàn VNH2SP30-cầu.
/ / Lập luận: Boolean cho phép
/ / Return: Không có
EnableDrivers void (INT1 cho phép);/ / Mô tả: Chức năng này đặt PWM theo tốc độ và INA, INB theo lệnh cho cả động cơ
/ / Lập luận: int8 config
/ / Int8 nhiệm vụ
/ / Return: Không có
void SetDCControl (int8 config, int8 thuế);
/ / Có một số vấn đề với module PWM, trước khi thay đổi pinout hãy rõ ràng.
void clear (void);/ / Describtion: chức năng này lần đọc địa chỉ
/ / Lập luận: không có
/ / Return: địa chỉ đầy đủ (8bit khôn ngoan)
int8 ReadAddress (void);
/ / Describtion: chức năng này được sử dụng để xử lý dữ liệu nhận được từ các xe bus I2C.
/ / Lập luận: đã nhận được byte 1 và nhận được byte 2
/ / Trở về: không có
void ProcessData (int8 byte1, int8 byte2);
/ / Interrupt dịch vụ thường lệ cho activty I2C
# int_SSP
void SSP_isr () (
output_high (đã dẫn);
/ / Bạn sẽ chỉ bị gián đoạn nếu địa chỉ là chính xác.
/ / Đầu tiên kiểm tra các chế độ: đọc hoặc viết
bang = i2c_isr_state ();
if (state <0x80) (/ / Master là việc gửi dữ liệu
if (state == 0) ()
if (state == 1)
(
mode = i2c_read ();
)
if (state == 2)
(
databyte1 = i2c_read ();
)
if (state == 3)
(
databyte2 = i2c_read ();
if (mode == SET_MOTOR)
(
dataready = true;
)
)
)
if (state == 0x80) / / master là đọc dữ liệu
(
if (mode == GET_TYPE)
(
i2c_write (LOẠI);
)
if (mode == GET_VERSION)
(
i2c_write (VERSION_MAJOR);
)
)
if (state == 0x81) / / master là đọc dữ liệu
(
i2c_write (VERSION_MINOR);
)
output_low (đã dẫn);
return;
)////////////////////////////////////////////////// //////////////////////////
void main () (
setup_adc_ports (NO_ANALOGS | VSS_VDD);
setup_adc (ADC_OFF);
setup_timer_0 (RTCC_INTERNAL | RTCC_DIV_1);
/ / setup_timer_1 (T1_DISABLED);
setup_timer_1 (T1_INTERNAL | T1_DIV_BY_8); / / timer1 cho dừng tự động sau khi 600ms chức năng
setup_timer_2 (T2_DIV_BY_16, 124, 1); / / 1000 Hz, tần số PWM
setup_comparator (NC_NC_NC_NC);
enable_interrupts (INT_SSP);
enable_interrupts (GLOBAL);
setup_oscillator (OSC_8MHZ);
printf ( "I2C động cơ xe với I2C \ n \ r ");// in để nối tiếp
printf ( "Phiên bản% s \ n \ r", VERSION);
EnableDrivers (false); / / True -> INA INB và tự động kích hoạt lúc khởi động, Sai -> Vice-versa
địa chỉ = ReadAddress ();
printf ( "Các địa chỉ = 'X%' \ n \ r", địa chỉ);
I2C_SlaveAddr (địa chỉ);
rõ ràng ();trong khi (1) (nếu (dataready == true) (
printf ( "Command = '% 02x' '% 02X' \ n \ r", databyte1, databyte2);
ProcessData (databyte1, databyte2);
set_timer1 (0);
overflow = 0;
đếm = true;
dataready = false;
)if ((đếm == true)) (
timerone = (get_timer1 () / 625);
nếu (timerone> = 97) (
overflow = 1;
)
if ((tràn bộ nhớ> = 5)) (
EnableDrivers (False);
printf ( "thứ sáu của hãng & rover đã dừng lại! \ n \ r");
overflow = 0;
đếm = false;
)
)delay_ms (10);
)
)
////////////////////////////////////////////////// //////////////////////////// *
Chức năng boddies
* /
void EnableDrivers (giá trị) (
nếu (giá trị) (
output_high (driver_a);
output_high (driver_b);
output_high (driver_c);
output_high (driver_d);
)
else (
output_low (driver_a);
output_low (driver_b);
output_low (driver_c);
output_low (driver_d);
)
)
void SetDCControl (int8 config, int duty) (
int secs = 3;
int i;
nhiệm vụ>> = 1;
set_pwm1_duty (thuế);
printf ( "Duty% u \ n \ r", nhiệm vụ);
switch (config)
(
trường hợp 0:
printf ( "Chuyển tiếp \ n \ r");
rõ ràng ();
setup_ccp1 (CCP_PWM | CCP_PWM_H_H | CCP_PULSE_STEERING_D | CCP_PULSE_STEERING_C); / / chuyển tiếp tương ứng với pin RC2 và RC3
output_high (driver_a);
output_low (driver_b);
output_high (driver_c);
output_low (driver_d);
break;
trường hợp 1:
for (i = 0; i <secs; i )
(
printf ( "Rẽ trái \ n \ r");
rõ ràng ();
setup_ccp1 (CCP_PWM | CCP_PWM_H_H | CCP_PULSE_STEERING_D | CCP_PULSE_STEERING_C); / / rẽ trái
output_high (driver_a);
output_low (driver_b);
output_low (driver_c);
output_high (driver_d);
)
dataready = false;
break;
Trường hợp 2:
printf ( "Rẽ phải \ n \ r");
rõ ràng ();
setup_ccp1 (CCP_PWM | CCP_PWM_H_H | CCP_PULSE_STEERING_D | CCP_PULSE_STEERING_C); / / lần lượt rightt
output_low (driver_a);
output_high (driver_b);
output_high (driver_c);
output_low (driver_d);
break;
trường hợp 3:
printf ( "Backward \ n \ r");
rõ ràng ();
setup_ccp1 (CCP_PWM | CCP_PWM_H_H | CCP_PULSE_STEERING_D | CCP_PULSE_STEERING_C); / / lạc hậu
output_low (driver_a);
output_high (driver_b);
output_low (driver_c);
output_high (driver_d);
break;
mặc định:
printf ( "Đối số không hợp lệ! \ n \ r");
rõ ràng ();
setup_ccp1 (CCP_PWM | CCP_PWM_H_H);
output_low (PIN_C2);
output_low (PIN_C3);
output_low (PIN_C4);
output_low (PIN_C5);
break;
)
)
void clear (void) (
setup_ccp1 (CCP_PWM | CCP_PWM_H_H | CCP_PULSE_STEERING_A | CCP_PULSE_STEERING_B | CCP_PULSE_STEERING_C | CCP_PULSE_STEERING_D);
output_low (PIN_C2);
output_low (PIN_C3);
output_low (PIN_C4);
output_low (PIN_C5);
)
int8 ReadAddress () (
int8 temp = 0xA0; / / địa chỉ cơ sở là 1010000 (I2C địa chỉ chỉ có 7 bit!)!, tương ứng với địa chỉ 0x50
return temp;
)
void ProcessData (int8 Data1, int8 Data2)
(
int8 Mode;
int8 Dẫn;
/ / Xác định chế độ được sử dụng
Mode = Data1;
Chế độ>> = 4;
switch (Mode)
(
trường hợp 1:
printf ( "Mode1 \ n \ r");
Dẫn = Data1 & 0x03; / / chỉ có LSB hai là cần thiết
SetDCControl (Chỉ Dẫn, Data2);
break;
mặc định:
printf ( "chế độ không rõ \ n \ r");
break;
)
return;
)
Last edited by amith.srivatsa ngày 03 Tháng Mười Hai 2009 17:53; edited 1 thời gian trong tổng số
Tôi chỉ cần thay đổi từ PIC16f690 để PIC16F876A.PIC được sử dụng cho ứng dụng điều khiển động cơ và nó sẽ gửi tín hiệu để H-cầu VNH2SP30.Code viết cho PIC16f690 làm việc tốt với không có lỗi.
Nhưng bây giờ, tôi nhận được một số lỗi, chủ yếu là không biết từ khóa, danh tánh không rõ khi tôi thử biên dịch mã tương tự nhưng lần này cho PIC16F876A.Tôi chỉ có thay đổi tập tin tiêu đề.Bất cứ ai có thể giúp tôi gỡ lỗi trong các lỗi này?
Mã này là dưới đây:
/ *
Biên dịch với CCS, xem http://ccsinfo.com/ để biết chi tiết.
Sample - Để thử nghiệm: Gửi tin qua I2C đến địa chỉ 0x50 dữ liệu này -> 0x02107F để đặt động cơ để "Chuyển tiếp" & tốc độ nửa.
Thiết lập: A5 pin: nối tiếp truyền thông
pin C0, C1: INA và INB cho Motor1 (trái)
pin C6, C7: INA và INB cho Motor2 (bên phải)
pin C2, C3: PWM cho động cơ 1 & 2 tương ứng (tốc độ điều khiển)
pinB4, B6: I2C giao tiếp, SDA & SCLLịch sử:
Phiên bản 2:
-Tự động Stop sau 600 ms chức năng để dừng động cơ khi không có lệnh I2C đã được gửi
vẫn có vấn đề với giá trị prescale và div nhưng đang làm việc
Phiên bản 1: Ngày 25 tháng 8 2009
- Để kiểm soát tốc độ và hướng của hai động cơ DC sử dụng hai toàn H-Bridge VNH2SP30 và PIC một
* /
# include <16F876A.h>
# device adc = 8
# Fuses NOWDT / / Không Watch Dog Timer
# Fuses INTRC_IO / / Internal RC OSC, không có CLKOUT
# Fuses NOPROTECT / / Mã không bảo vệ khỏi đọc
# Fuses BROWNOUT / / Thiết lập lại khi phát hiện brownout
# Fuses MCLR / / Master Clear pin bật
# Fuses NOCPD / / Không bảo vệ EE
# Fuses NOPUT / / No Power Up Timer
# Fuses IESO / / Internal External Switch Over chế độ kích hoạt
# Fuses FCMEN / / Fail-an toàn cho phép theo dõi đồng hồ
# use delay (clock = 8000000)
# use rs232 (baud = 19200, xmit = PIN_A5) / / sử dụng cho các com nối tiếp
# sử dụng I2C (Slave, sda = PIN_B4, SCL = PIN_B6) / / sử dụng cho I2C
/ *
Pin định nghĩa
* /
# define dẫn PIN_A4
# define PIN_C0 driver_a / / INA và INB cho motor1
# define PIN_C1 driver_b
# define PIN_C6 driver_c / / INA và INB cho motor2
# define PIN_C7 driver_d
# define LOẠI 0x01
# define VERSION "v1.4"
# define VERSION_MAJOR 1
# define VERSION_MINOR 4
# define GET_TYPE 0x00
# define GET_VERSION 0x01
# define SET_MOTOR 0x02
/ *
Biến
* /
int8 địa chỉ;
int8 nhà nước;
INT1 dataready = false;
INT1 đếm = false;
long int timerone = 0;
int tràn = 0;
int8 mode = 0;
int8 databyte1 = 0;
int8 databyte2 = 0;
/ *
Chức năng nguyên mẫu
* /
/ / Mô tả: Chức năng này cho phép hoặc vô hiệu hóa INA, INB imputs cho cả toàn VNH2SP30-cầu.
/ / Lập luận: Boolean cho phép
/ / Return: Không có
EnableDrivers void (INT1 cho phép);/ / Mô tả: Chức năng này đặt PWM theo tốc độ và INA, INB theo lệnh cho cả động cơ
/ / Lập luận: int8 config
/ / Int8 nhiệm vụ
/ / Return: Không có
void SetDCControl (int8 config, int8 thuế);
/ / Có một số vấn đề với module PWM, trước khi thay đổi pinout hãy rõ ràng.
void clear (void);/ / Describtion: chức năng này lần đọc địa chỉ
/ / Lập luận: không có
/ / Return: địa chỉ đầy đủ (8bit khôn ngoan)
int8 ReadAddress (void);
/ / Describtion: chức năng này được sử dụng để xử lý dữ liệu nhận được từ các xe bus I2C.
/ / Lập luận: đã nhận được byte 1 và nhận được byte 2
/ / Trở về: không có
void ProcessData (int8 byte1, int8 byte2);
/ / Interrupt dịch vụ thường lệ cho activty I2C
# int_SSP
void SSP_isr () (
output_high (đã dẫn);
/ / Bạn sẽ chỉ bị gián đoạn nếu địa chỉ là chính xác.
/ / Đầu tiên kiểm tra các chế độ: đọc hoặc viết
bang = i2c_isr_state ();
if (state <0x80) (/ / Master là việc gửi dữ liệu
if (state == 0) ()
if (state == 1)
(
mode = i2c_read ();
)
if (state == 2)
(
databyte1 = i2c_read ();
)
if (state == 3)
(
databyte2 = i2c_read ();
if (mode == SET_MOTOR)
(
dataready = true;
)
)
)
if (state == 0x80) / / master là đọc dữ liệu
(
if (mode == GET_TYPE)
(
i2c_write (LOẠI);
)
if (mode == GET_VERSION)
(
i2c_write (VERSION_MAJOR);
)
)
if (state == 0x81) / / master là đọc dữ liệu
(
i2c_write (VERSION_MINOR);
)
output_low (đã dẫn);
return;
)////////////////////////////////////////////////// //////////////////////////
void main () (
setup_adc_ports (NO_ANALOGS | VSS_VDD);
setup_adc (ADC_OFF);
setup_timer_0 (RTCC_INTERNAL | RTCC_DIV_1);
/ / setup_timer_1 (T1_DISABLED);
setup_timer_1 (T1_INTERNAL | T1_DIV_BY_8); / / timer1 cho dừng tự động sau khi 600ms chức năng
setup_timer_2 (T2_DIV_BY_16, 124, 1); / / 1000 Hz, tần số PWM
setup_comparator (NC_NC_NC_NC);
enable_interrupts (INT_SSP);
enable_interrupts (GLOBAL);
setup_oscillator (OSC_8MHZ);
printf ( "I2C động cơ xe với I2C \ n \ r ");// in để nối tiếp
printf ( "Phiên bản% s \ n \ r", VERSION);
EnableDrivers (false); / / True -> INA INB và tự động kích hoạt lúc khởi động, Sai -> Vice-versa
địa chỉ = ReadAddress ();
printf ( "Các địa chỉ = 'X%' \ n \ r", địa chỉ);
I2C_SlaveAddr (địa chỉ);
rõ ràng ();trong khi (1) (nếu (dataready == true) (
printf ( "Command = '% 02x' '% 02X' \ n \ r", databyte1, databyte2);
ProcessData (databyte1, databyte2);
set_timer1 (0);
overflow = 0;
đếm = true;
dataready = false;
)if ((đếm == true)) (
timerone = (get_timer1 () / 625);
nếu (timerone> = 97) (
overflow = 1;
)
if ((tràn bộ nhớ> = 5)) (
EnableDrivers (False);
printf ( "thứ sáu của hãng & rover đã dừng lại! \ n \ r");
overflow = 0;
đếm = false;
)
)delay_ms (10);
)
)
////////////////////////////////////////////////// //////////////////////////// *
Chức năng boddies
* /
void EnableDrivers (giá trị) (
nếu (giá trị) (
output_high (driver_a);
output_high (driver_b);
output_high (driver_c);
output_high (driver_d);
)
else (
output_low (driver_a);
output_low (driver_b);
output_low (driver_c);
output_low (driver_d);
)
)
void SetDCControl (int8 config, int duty) (
int secs = 3;
int i;
nhiệm vụ>> = 1;
set_pwm1_duty (thuế);
printf ( "Duty% u \ n \ r", nhiệm vụ);
switch (config)
(
trường hợp 0:
printf ( "Chuyển tiếp \ n \ r");
rõ ràng ();
setup_ccp1 (CCP_PWM | CCP_PWM_H_H | CCP_PULSE_STEERING_D | CCP_PULSE_STEERING_C); / / chuyển tiếp tương ứng với pin RC2 và RC3
output_high (driver_a);
output_low (driver_b);
output_high (driver_c);
output_low (driver_d);
break;
trường hợp 1:
for (i = 0; i <secs; i )
(
printf ( "Rẽ trái \ n \ r");
rõ ràng ();
setup_ccp1 (CCP_PWM | CCP_PWM_H_H | CCP_PULSE_STEERING_D | CCP_PULSE_STEERING_C); / / rẽ trái
output_high (driver_a);
output_low (driver_b);
output_low (driver_c);
output_high (driver_d);
)
dataready = false;
break;
Trường hợp 2:
printf ( "Rẽ phải \ n \ r");
rõ ràng ();
setup_ccp1 (CCP_PWM | CCP_PWM_H_H | CCP_PULSE_STEERING_D | CCP_PULSE_STEERING_C); / / lần lượt rightt
output_low (driver_a);
output_high (driver_b);
output_high (driver_c);
output_low (driver_d);
break;
trường hợp 3:
printf ( "Backward \ n \ r");
rõ ràng ();
setup_ccp1 (CCP_PWM | CCP_PWM_H_H | CCP_PULSE_STEERING_D | CCP_PULSE_STEERING_C); / / lạc hậu
output_low (driver_a);
output_high (driver_b);
output_low (driver_c);
output_high (driver_d);
break;
mặc định:
printf ( "Đối số không hợp lệ! \ n \ r");
rõ ràng ();
setup_ccp1 (CCP_PWM | CCP_PWM_H_H);
output_low (PIN_C2);
output_low (PIN_C3);
output_low (PIN_C4);
output_low (PIN_C5);
break;
)
)
void clear (void) (
setup_ccp1 (CCP_PWM | CCP_PWM_H_H | CCP_PULSE_STEERING_A | CCP_PULSE_STEERING_B | CCP_PULSE_STEERING_C | CCP_PULSE_STEERING_D);
output_low (PIN_C2);
output_low (PIN_C3);
output_low (PIN_C4);
output_low (PIN_C5);
)
int8 ReadAddress () (
int8 temp = 0xA0; / / địa chỉ cơ sở là 1010000 (I2C địa chỉ chỉ có 7 bit!)!, tương ứng với địa chỉ 0x50
return temp;
)
void ProcessData (int8 Data1, int8 Data2)
(
int8 Mode;
int8 Dẫn;
/ / Xác định chế độ được sử dụng
Mode = Data1;
Chế độ>> = 4;
switch (Mode)
(
trường hợp 1:
printf ( "Mode1 \ n \ r");
Dẫn = Data1 & 0x03; / / chỉ có LSB hai là cần thiết
SetDCControl (Chỉ Dẫn, Data2);
break;
mặc định:
printf ( "chế độ không rõ \ n \ r");
break;
)
return;
)
Last edited by amith.srivatsa ngày 03 Tháng Mười Hai 2009 17:53; edited 1 thời gian trong tổng số