Ах да - это ж мой диплом.
Так вот с дуру подписался на данную тему (в принципе задачка фигня, т.к. руки не из попы и с МК чуть чуть дружу).
За 3 с небольшим дня сделал всю (почти всю) "механо-электрическую часть" и занялся программированием - и тут то оказался подвох.
Пример кода, который шел с гироскопом отказывается работать (или я идиот и не правильно что то делаю).
В добавок в коде куча не понятных мне команд + подключена библиотека в которой куча разных адресов (видимо необходимые для работы гироскопа, но откуда взятые непонятно).
Так вот -
1. Имеющиеся девайсы -Отладочная плата EasyPICv7 с МК pic18f45k22 на борту. ( http://www.mikroe.com/easypic/)
Гироскоп L3GD20 (Подробная инфа с примерами кода - http://www.mikroe.com/click/gyro/)
2. ПО - mikroC PRO for PIC.
Задача -
1. Разобраться в коде прилагаемом к гироскопу до такой степени, чтобы суметь написать его самостоятельно. Тут без Вас товарищи никак (2 дня ковыряюсь с инфой но результата не густо).
2. В идеале - запустить код из комплекта гироскопа.
3. Если нет, то - Подключить Гироскоп через I2C к МК и тупо через UART отправить инфу с него на комп.
На данный момент после прошивки имеющимся кодом МК ведет себя следующим образом - отказывается реагировать на кнопку RESET, в UARTе полнейшая тишина.
Если прошить простой программкой типа : UART1_Write_Text ("Hello"); Инфа успешно доходит до ПК и отображается на компе, что свидетельствует о функциональности соединения.
В коде непонятно следующее:
#include"L3GD20_Driver.h"
#define TSHLD 50
sbit GYRO_CS at LATE0_bit; // Chip Select pin ------Все строки с оператором sbit (особенно первая)
sbit GYRO_CS_Dir at TRISE0_bit;
sbit DATA_RDY at PORTE.B1; // DataReady - DRDY/INT2 pin
sbit DATA_RDY_Dir at TRISE1_bit;
sbit GYRO_INT at PORTB.B0; // Interrupt - INT1 pin
sbit GYRO_INT_Dir at TRISB0_bit;
GData value; ----- непонял.
long int r0_x, r0_y, r0_z; ------объявление переменных
float sumX, sumY, sumZ; ------объявление переменных
char response; ------объявление переменных
void MCU_Init(){ -----------предварительная настройка МК
CM1CON = 0; // Turn off comparators ----Офаем компараторы
CM2CON = 0;
ANSELB = 0; // Configure pins as digital ------ Порты АБЦДЕ устанавливаем как цифровые
ANSELC = 0;
ANSELD = 0;
ANSELE = 0;
SLRCON = 0; ----------------непонял.
LATA = 0x00; // Reset LAT register values -----Сбрасываем все выводы портов АБЦДЕ в ноль
LATB = 0x00; -------------------(не понял почему это делается командой LAT, если не ошибаюсь в версии PRO это делается командой PORT)
LATC = 0x00;
LATD = 0x00;
LATE = 0x00;
TRISA = 0x00; // Configure pins as output --выподы портов ABCDE выставляем на выход
TRISC = 0x00;
TRISC = 0x00;
TRISD = 0x00;
TRISE = 0x00;
UART1_Init(115200); // Initialize UART -----Включаем юарт на скорости 115200 бод
Delay_ms(100); // Wait for UART module to stabilize Ждем 100мс
I2C1_Init(100000); // Initialize I2C --Включаем I2C (С I2C никогда в жизни не работал)
}
void UART_Write_New_Line(){
UART1_Write_Text("\r\n"); -------Если верно понял, то выполнив предыдущий код должен выкинуть в UART сообщение "\r\n" (непонимаю что оно означает)
}
void Gyro_Config(){
unsigned short response; -----------------Объявление перменных типа unsigned shor
unsigned short i;
unsigned short ID;
char txt[3]; ------------------Массив txt ????
r0_x = 0; ---------- значения
r0_y = 0; ---------Присваиваем значения
r0_z = 0;---------Присваиваем значения
response = 0;---------Присваиваем значения
response += L3GD20_Configure(L3GD20_CTRL_REG1, 0x1F); // Turn ON module (normal mode), enable X, Y and Z axis , ODR=95Hz, Cut-Off=25 --настройка гироскопа
response += L3GD20_Configure(L3GD20_CTRL_REG4, 0x00); // Full scale selection - 250dps --настройка гироскопа
response += L3GD20_Configure(L3GD20_CTRL_REG3, 0x08); // Enable Date-ready on DRDY/INT2 pin --настройка гироскопа
if (response == 3){ // Sum of all resposne values should be 3 ---в результате удачной настройки, переменной response присваивается 1. В иотоге response должна быть равна 3. Если это так то выполняется условие.
UART1_Write_Text("Gyro module initialized."); --Выводим в UArt "Gyro module initialized."
UART1_Write_Text("\r\n"); --Выводим в UArt "\r\n"
}
else{ ------иначе
UART1_Write_Text("Error: Gyro Config!"); --Выводим в UArt "Error: Gyro Config!"
UART1_Write_Text("\r\n"); --Выводим в UArt "\r\n"
}
ID = Identify_Gyro(); // Get ID from Gyroscope module ----ТУТ видимо считывается ID гироскопа
ByteToHex(ID, txt); // Convert byte value to HEX-String ----Преобразовывается из типа Byte в тип HEX и записывается в txt
UART1_Write_Text("GyroID: "); // ----выводится в UART надпись "GyroID: "
UART1_Write_Text(txt); // ----выводится в UART значение переменной txt
UART_Write_New_Line(); // ----переход на новую строку???
UART1_Write_Text("Calibration: Module should be in rest position."); --------выводится в UART надпись "Calibration: Module should be in rest position."
UART_Write_New_Line(); ----переход на новую строку???
for (i = 0 ; i < 64 ; i++ ){ // Collect 64 values in rest position ----Цикл от 0 до 63. Зачем хрен понять.
L3GD20_GetAngRateRaw(&value); ----непонятно
r0_x += value.X_AXIS; // Sum the values -- тут видимо к текущему значению прибовляется полученной значение с гироскопа.
r0_y += value.Y_AXIS; // for every
r0_z += value.Z_AXIS; // axis
}
r0_x >>= 6; // Find avreage reding in resting position ---непонятно
r0_y >>= 6; // and use them as correction values ---непонятно
r0_z >>= 6; // for all three axis ---непонятно
UART1_Write_Text("Calibration: Done!");
UART_Write_New_Line();
}
void DisplayAngleRate(char *str, float val){ ---непонятно
char txt[20];
UART1_Write_Text("| ");
UART1_Write_Text(str);
UART1_Write_Text(": ");
sprintf(txt, "%7.2f", val);
UART1_Write_Text(txt);
UART1_Write_Text(" deg |");
}
void NewLine(){
UART1_Write_Text("\r\n"); ---непонятно
}
void main() {
int Xval, Yval, Zval; - объявляем переменные
char display_flag = 0; - объявляем переменную и присваиваем ей ноль ??????
MCU_Init(); ---непонятно
Gyro_Init();---непонятно
Gyro_Config();---непонятно
NewLine(); ---непонятно
NewLine();---непонятно
sumX = 0;
sumY = 0;
sumZ = 0;
display_flag = 0; ---непонятно (он ведь и так ноль??)
while(1){
response = L3GD20_GetAngRateRaw(&value); // Colect new set of values -------Всё что ниже видимо тупо математика связанная с конкретными хар-ками гироскопа
if (response == 1){
if (abs(value.X_AXIS - r0_x) > TSHLD){ // If corrected value of X axis is over treshold level use the vale for integration
Xval = value.X_AXIS - r0_x; // Calculate Angular rate for X axis
sumX += Xval * 0.00875 / 94.8 * 3.0; // Multuply with dps factor for 250dps i's 8.75 mdps/sec (0,00875)
// frequecy of readig values from module ~95Hz(94.
display_flag = 1; // Raise the flag for data to be displayed via UART
}
if (abs(value.Y_AXIS - r0_y) > TSHLD){ // If corrected value of Y axis is over treshold level use the vale for integration
Yval = value.Y_AXIS - r0_y; // Calculate Angular rate for Y axis
sumY += Yval * 0.00875 / 94.8 * 3.0; // Multuply with dps factor for 250dps i's 8.75 mdps/sec (0,00875)
// frequecy of readig values from module ~95Hz(94.
display_flag = 1; // Raise the flag for data to be displayed via UART
}
if (abs(value.Z_AXIS - r0_z) > TSHLD){ // If corrected value of Z axis is over treshold level use the vale for integration
Zval = value.Z_AXIS - r0_z; // Calculate Angular rate for Z axis
sumZ += Zval * 0.00875 / 94.8 * 3.0; // Multuply with dps factor for 250dps i's 8.75 mdps/sec (0,00875)
// frequecy of readig values from module ~95Hz(94.
display_flag = 1; // Raise the flag for data to be displayed via UART
}
if(display_flag){ // If change was detected, send data via UART
DisplayAngleRate("sX", sumX); ---непонятно
DisplayAngleRate("sY", sumY); ---непонятно
DisplayAngleRate("sZ", sumZ); ---непонятно
NewLine();
display_flag = 0; // Reset flag variable
}
}
else
{
UART1_Write_Text("Error reading data!");
}
}
}
вот так выглядит это чудо на данный момент -
P.S. Всем заранее спасибо.


