Dars
-
Постов
237 -
Зарегистрирован
-
Посещение
Сообщения, опубликованные Dars
-
-
Опубликовано · Изменено пользователем Dars · Пожаловаться
Делаю балансирующего робота(типа игрушка,для души, вроде этого должно получится http://www.geology.smu.edu/~dpa-www/robo/nbot/), встал вопрос о том как его удерживать на двух колесах. Посмотрел в интеренете, обычно делают с помощью гироскопа(большая погрешность со временем,быстрая скорость) + акселлерометр(маленькая скорость,маленькая погрешность).Типа гироскопом меряют угол отклонения,а потом его акселлерометром калибруют. Посмотрел у AD,adxl202eb(2000 руб) + adxrs300eb(3000 руб).Цены совсем не радуют((( может кто подскажет как еще можно подешевле решить проблему? хатит ли одного акселлерометра для стабилизации положения??
-
Контроллер там стоит ХЗ какой, таблетка. Частота тоже левая, tsop1736 вообще не реагирует. Разбираться с алгоритмом считывания времени нет, решил замыкать кнопки полевиком!
-
В общем ситуация такая. Есть ИК пульт управления от Robosapien, там 21 кнопка. Мне надо управлять этим пультом с компа. Не могу понять можно микроконтроллером нажимать кнопки???Клавиатура похожа на матричную,но никаких резисторов и диодов нет!
-
Dars, смахивает на шаманство. А физический смысл каков?
Смысл чего? Кода? Если да, то смысл такой. Работая в четырехбитном режиме, чтобы записать 8 битную команду, надо сначала на (DB7...DB4), вывести старшие биты числа(Bit7...Bit4) а потом младшие(Bit3..0), короче по всем правилам два раза сделать запись. Для этого вызывается функция
LCD_WRITE_BYTE . Первый раз она передает функции LCD_WRITE_NIBL принятое значение. LCD_WRITE_NIBL записывает старшие 4 бита числа, в старшие 4 бита порта(в общем DB7=Bit7 числа, DB6=Bit6 числа).
char temp;
temp=PORTC;
temp |= (LCD_DATA & 0xF0);
temp &= (LCD_DATA | 0x0F);
LCD_PORT = temp;
Вот это присваивает старшим 4 битам порта, значение старших 4 бит числа, не меняя младших.(если мы передали число
0101 1101 то значение DB7=0,DB6=1,DB5=0,DB4=1.
Второй раз вызывая функцию мы передаем ей значение __swap_nibbles(data_lcd) и она записывает в DB7..4 уже младшие 4 бита. Таким образом в LCD производится запись всего числа.
Объяснил как смог.
-
Опубликовано · Изменено пользователем Dars · Пожаловаться
Ура!!! Замигал курсор, haker_fox & &-rey :a14: за помощь! Всего надо было строчку
LCD_PORT |= (LCD_DATA & 0xF0);
заменить на
char temp; temp=PORTC; temp |= (LCD_DATA & 0xF0); temp &= (LCD_DATA | 0x0F); LCD_PORT = temp;
-
Вот 100% рабочий исходник. Правда для IBM PC, среда Borland C++ 3.1, но сути дела это не меняет. Попробуйте приминить инициализацию дисплея из прикрепленного файла.
Спасибо за исходник. Я понял в чем ошибка. У меня неправильная функция записи нибла в порт. Дело в том что у меня RS,RD,EN повешены на тот же прорт что и DB7,DB6,DB5,DB4.
RS ------ bit 0 PORTC
RD ------ bit 1 PORTC
EN ------ bit 2 ...
DB4 --- bit 4 ...
DB5 --- bit 5 ...
DB6 --- bit 6 ...
DB7 --- bit 7 ...
И я не понимаю как можно четырем старшим битам порта, присвоить значения четырех старших бит числа в виде 0xFF. Побитно тупо. Пока писал так LCD_PORT |= (LCD_DATA & 0xF0);, но это неправильно... :(
-
Что-то все равно он не работает.... :(
Может все таки кто ткнет на ошибку, экран вроде включается, но на команды не реагирует. Я указал режим с курсором а курсора тоже нет :(
Вот функция инициализации:
void LCD_INIT (void) { delay_ms(45); //Задержка после включения питания LCD_WRITE_NIBL(0x30); //Три раза пишем команду 0x30 delay_ms(4); delay_us(100); LCD_WRITE_NIBL(0x30); delay_us(100); LCD_WRITE_NIBL(0x30); delay_us(40); LCD_WRITE_NIBL(0x20); //Один раз 0x20 delay_us(40); LCD_WRITE_BYTE(0x28); //Function Set LCD_WRITE_BYTE(0x0F); //Включаем экран и курсор delay_us(40); LCD_WRITE_BYTE(0x01); //Очищаем экран delay_ms(1); delay_us(500); LCD_WRITE_BYTE(0x06); //ENTRY_MODE_SET delay_us(40); }; void LCD_WRITE_BYTE (unsigned char LCD_DATA) { LCD_RW=0; LCD_WRITE_NIBL (LCD_DATA); LCD_WRITE_NIBL (__swap_nibbles (LCD_DATA)); }; void LCD_WRITE_NIBL (unsigned char LCD_DATA) { __disable_interrupt(); LCD_E=1; delay_ns(20); LCD_PORT |= (LCD_DATA & 0xF0); delay_ns(230); LCD_E=0; delay_ns(250); __enable_interrupt(); };
DB7 повешен на PORTC7, DB6 на PORTC6, DB5 на PORTC5, DB4 на PORTC4.
-
Судя по ссылке которую дал IgorKossak , стоит начать с электроники, без нее никуда! Всячески рекомендую (думаю многие со мной согласятся) книгу "Искусство Схемотехники" П.Хоровиц и У.Хилл , месяц интенсивного чтения, и все вопросы отпадут, независимо от начального уровня.
-
А что такое "СЕ"? :unsure:
CHIP ENABLE, им выбирается slave. 1 выбран, 0 отдыхает.
-
А как может сказаться на работе, если кварц, резисторы, конденсаторы, в общем вся обвеска подключаемая к at91sam7s64, будет удалена от него примерно на 30 см ???Будет работать?Шиться?
Думаю, что будет. В приложении фоты моей платы. Размер - 10 на 15 см. Все компоненты платы разбросаны, при этом всё хорошо прошивается, usb и com работают хорошо.
Спасибо за фоты, думаю и у меня все прошьется. А что эта за микросхема в нижнем правом углу ?
-
http://www.terraelectronica.ru/catalog_inf...me=class_19_4_2
Как думаете можно с этого набора начинать изучение ПЛИС?Всего 65y.e!
-
"мне главное чтоб по усб шилась..." У меня FT232 и по усб через нее 57600 бит\с шьет отлично!
поял станцией(регулировка температуры), на жало проволку 1мм наматал и сплавом розе(температура плавления 80 С) под микроскопом (можно и просто увеличит стеко). Потом выпаивать удобно, промышленным феном нагрел и м\с отпадывает. с таким подходом и кристал и плата живые остаются.
См. фотоjava script:emoticon('', 'smid_7').
Насчет 2106 и 2148 не знаю не сталкивался. Но в первом вроде внешняя шина есть, а во втором USB смотри доки там описано все.
От эта система :a14:
Особенно FTDI. После увиденного, я думаю у меня точно все запустится :)
P.S За фотки спасибо :)
-
Дык что бы такое спаять чтоб через USB?
Может взять схемку wiggler'a да какую-нить микруху-мост типа USB->LPT замастрячить? Будет работать?
У меня такая же проблема, есть только усб. Мост USB->LPT сомневаюсь что заработает, это надо пробовать. 100% заработает переходник PCMCIA-LPT .
-
А как может сказаться на работе, если кварц, резисторы, конденсаторы, в общем вся обвеска подключаемая к at91sam7s64, будет удалена от него примерно на 30 см ???Будет работать?Шиться?
-
Его еще сначала купить надо. МТ-Системс в Москве вообще по-моему не работают, на запросы не отвечают вообще, когда звонишь говорят отправляйте заявку, заявку на которую они потом не отвечают. Всякое желание исчезает что либо покупать у них.
-
" Я видел только в чип и дипе на корпус QFP208, за 210 руб."
они и есть на них можно микросхемы ставить от 40 до 208 ножек у меня она называется RADIO-MASTER.
На счет кварца и кондеров - думаю не так критично, конечно на полной скорости могут возникнуть неприятности, но у меня пока нормально.
А паяли чем? Станцией или паяльником? у меня паяльник ERSA + жало 0.5мм конусообразное, получится припаять? чет меня напрягает все-таки такое большое расстояние от корпуса до кварца и до фильтрующих конденсаторов, но надо попробовать, давно была мысль самопалку сделать, но боялся не запустится, а тут оказывается у народа работает :) мне главное чтоб по усб шилась...
-
Хотя я бы, тебе посоветовал для начала: купить какойнибудь LPC2124 и плату
перехадную QFP0.5 на 2.54мм
А где такие в Москве например можно купить? Я видел только в чип и дипе на корпус QFP208, за 210 руб. А если такую плату использовать, ничего что всякие конденсаторы, да кварцы далековато от корпуса микросхемы стоять будут???
-
2haker_fox
Да я как раз по той статье и даташиту Hitachi и делаю, задолбали эти задержки, только процессорное время жрут!
2&-rey
Спасибо. Ща сяду буду разбираться.
-
Опубликовано · Изменено пользователем Dars · Пожаловаться
В общем ситуация такая, всю жизнь сидел на CodeVision, а тут решил перейти на IAR. А там как оказалось нет библиотеки для ЖК, ну я взял и попытался написать простенькую прогу которая выводит букву А на экран ( 20 * 4 ), ну и нифига у меня не работает :(
У кого есть библиотечка выложите пожалуйста :)
Ну или ткините кто нибудь в ошибку (если вся программа не есть ошибка).
#include <delay.h> #include <iom128.h> #include <intrinsics.h> void DB_SET_RESET (int DB7, int DB6, int DB5, int DB4); void LCD_PORT_INIT (void); void LCD_INIT (void); void LCD_PRINT (void); void LCD_CLEAR (void); int main( void ) { delay_s(2); //Пауза DDRB |= (1<<4); PORTB |= (1<<4); // Зажгли светодиод LCD_PORT_INIT(); //Установили порт С на выход LCD_CLEAR(); //Очистка экрана LCD_PRINT(); //Выводим букву А for(;;); return 0; } void DB_SET_RESET (int DB7, int DB6, int DB5, int DB4) { if (DB7) PORTC |= (1<<7); // DB7 = 1 else PORTC &= 0x7F; // DB7 = 0 if (DB6) PORTC |= (1<<6); // DB6 = 1 else PORTC &= 0xBF; // DB6 = 0 if (DB5) PORTC |= (1<<5); // DB5 = 1 else PORTC &= 0xDF; // DB5 = 0 if (DB4) PORTC |= (1<<4); // DB4 = 1 else PORTC &= 0xEF; // DB4 = 0 } void LCD_PORT_INIT (void) { /* Инициализация портов для LCD */ DDRC |= (1<<0); // RS DDRC |= (1<<1); // RW DDRC |= (1<<2); // EN DDRC |= (1<<4); // DB4 DDRC |= (1<<5); // DB5 DDRC |= (1<<6); // DB6 DDRC |= (1<<7); // DB7 } void LCD_INIT (void) { PORTC = 0x30; // RS=0,R/W=0,E=0, DB7=0, DB6=0, DB5=1, DB4=1 delay_ms(5); PORTC = 0x30; // RS=0,R/W=0,E=0, DB7=0, DB6=0, DB5=1, DB4=1 delay_us(100); PORTC = 0x30; // RS=0,R/W=0,E=0, DB7=0, DB6=0, DB5=1, DB4=1 delay_us(100); DB_SET_RESET(0,0,1,0); // Установка 4 битного режима DB7=0, DB6=0, DB5=1, DB4=0 delay_ms(2); DB_SET_RESET(0,0,1,0); //Установка параметров DB7=0, DB6=0, DB5=1, DB4=0 delay_ms(2); DB_SET_RESET(1,0,0,0); //DB7=1, DB6=0, DB5=0, DB4=0 delay_ms(2); DB_SET_RESET(0,0,0,0); //Включение дисплея DB7=0, DB6=0, DB5=0, DB4=0 delay_ms(2); DB_SET_RESET(1,0,0,0); //DB7=1, DB6=0, DB5=0, DB4=0 delay_ms(2); DB_SET_RESET(0,0,0,0); //Очистка дисплея DB7=0, DB6=0, DB5=0, DB4=0 delay_ms(2); DB_SET_RESET(0,0,0,1); //DB7=0, DB6=0, DB5=, DB4=1 delay_ms(2); DB_SET_RESET(0,0,0,0); //Установка режима ввода данных DB7=0,DB6=0,DB5=1,DB4=0 delay_ms(2); DB_SET_RESET(0,1,1,0); //DB7=0, DB6=1, DB5=1, DB4=0 delay_ms(2); } void LCD_PRINT (void) { /* Установка адреса 0 */ PORTC &= 0xFE; // RS = 0 PORTC &= 0xFD; // R/W = 0 PORTC |= (1<<2); // E = 1 PORTC |= (1<<7); // DB7 = 1 DB_SET_RESET(1,0,0,0); PORTC &= 0xFB; // E = 0 delay_us(50); PORTC |= (1<<2); // E = 1 DB_SET_RESET(0,0,0,0); // DB7=0, DB6 = 0, DB5 = 0, DB4 = 0 PORTC &= 0xFB; // E = 0 delay_us(50); /* Вывод буквы A */ PORTC |= (1<<0); // RS = 1 PORTC |= (1<<2); // E = 1 DB_SET_RESET(0,1,0,0); PORTC &= 0xFB; // E = 0 delay_us(40); PORTC |= (1<<2); // E = 1 DB_SET_RESET(0,0,0,1); PORTC &= 0xFB; // E = 0 delay_us(50); } void LCD_CLEAR(void) { PORTC &= 0xFE; // RS = 0 PORTC &= 0xFD; // R/W = 0 PORTC |= (1<<2); // E = 1 DB_SET_RESET(0,0,0,0); PORTC &= 0xFB; // E = 0 delay_ms(2); PORTC |= (1<<2); // E = 1 DB_SET_RESET(0,0,0,1); PORTC &= 0xFB; // E = 0 delay_ms(2); }
-
А у меня такой вопрос. Имеется опыт работы с авр, сейчас арм изучаю. Почитал тут про микроконтроллеры silicon laboratories, очень понравилась перефирия, да и производительность вроде ничего. Скажите пожалуйста стоит ли их применять в новых разработках?Или 51 ядро уже морально устаревшее? Стоит ли их изучать?
-
"В понедельник я перешлю, что нужно написать там,
где указал Уважаемый NML, чтоб генерировался BIN-файл"
Буду ждать. А то я uCOS-II_V280 собрался ставить, да + моя нехилая программа точно >64k будет. Надо будет в аргуссофт позвонить, недовольство высказать, а то даже не предупреждают...
-
И еще вопросик. Как в иаре в одну строчку установить некоторые биты в 1. а некоторые в 0 ?
Пока пишу так :
PORTB |= (1<<5) | (1<<6);
PORTB &=0xEF;
-
был совместим с одним из этих, и как заставить IAR генерить разные файлы для Flash и Eeprom? Там громадный список, я не знаю какой нужно, а все перебирать - очень долго!
Спасибо!
В свойствах проекта - линкер - extra option - введите такое:
-we133=i
-Ointel-extended,(CODE)=%PROJ_NAME%.hex
-Ointel-extended,(XDATA)=ee_%PROJ_NAME%.hex
или то же самое - в .xcl файл... Но в свойствах, думаю, удобнее.
TO nml
Есть небольшая особенность - программатор AS2 от Аргуссофт не понимает стандарт "intel-extended"!!! Нужно ставить "intel-standard". , а для выходного файла EEPROM (XDATA) лучше указать расширение ".EEP" Тогда для AS2 не будет затруднений!
Сейчас я использую as3m & мегу128, пишу простетскую программу, ставлю standart, в железе работает, extended программатор хавает, зашивает но ничего не работает. Это as3m виноват или я чего то упустил? Мне что теперь не судьба программы > 64k писать??????? :(
-
Подключаешь файл delay.h. delay_us(100); задержка 100 микросекунд,delay_ms(10); задержка 10 миллисекунд. значения передаваемые в функции должны быть unsigned int ! А вообще все это в хелпе расписано.
Балансирующий робот
в Метрология, датчики, измерительная техника
Опубликовано · Пожаловаться
А можно по подробней?что для этого достаточно?и где про это все можно почитать?
Там бга корпус,мне его нечем и некуда паять)