-
Постов
67 -
Зарегистрирован
-
Посещение
Тип контента
Профили
Форумы
Блоги
Сообщения, опубликованные IGRISE
-
-
nusmarsalex ну как разобрался с многочастотным шумом...?
0 -
Дай свой майл, пришлю простенькие программы для расчета фильтров... Сюда почему то не получается их прикрепить ...
Две программы весят в архиве в сумме 10 кбайт...
0 -
С МК и Flash все впорядке, ты лучше разберись с фильтром... Кто-то даже говорил, что такой фильтр подавляет совсем не те частоты которые нужно...
Какое у тебя получилось время записи и воспроизведения...?
0 -
Плохо ищешь...
0 -
Если чесно, у меня слов не хватает, чтобы выразить все эмоции которые, я испытывал когда читал инициализацию портов...
Постараюсь объяснить тебе по мягче...
Во первых: Ты говоришь программа почти не изменилась, в этом ты не прав, если ты изменишь один байт программы,
ты уже ее сильно поменяешь, в лучшем случае МК просто неправильно будет работать, в худшем ты его испортишь...
А вот это вот что:
/* Инициализация порта */
void port_init()
{
PORTB=0x01;
DDRB=0x01;
PORTC=0x00;
DDRC=0xFF;
PORTD=0x00;
DDRD=0xFF; //0xf3
}
Зачем ты при инициализации порта устанавливашь высокий уровень на выходе...???
Datasheet иногда надо читать
0 -
Нука покажи мне свою программу...
0 -
Да... Оригинально подмечено - рвение делать робота быстро прошло...
Ну тогда дайте пожалуйста ссылку если есть на Индикатор на AVR и миди клаву тоже на AVR если есть!Индикатор какой LCD или LED...??? Зайди на оффсайт ATMEL, там есть похожая реализация ШИМ, да и индикатор светодиодный есть...
0 -
-
А ты хотябы пробовал help по CodeVisionAVR почитать....??? А, ...??? Ну скажем например про форматированый вывод...???
0 -
Ну ладно... давай разберемся:
Отключи от МК драйвер и посмотри какие уровни получаются на выходах МК PD0 и PD1, при включении устройства...???
0 -
HOT ICE: Так дело в том что ты мне код последний который дал он по идее и должен выполнять мою задачу но прирывания почемуто не происходят!Программа начинает работать без прерывания
Вот уже ближе...
А теперь смотри... <<HOT ICE: Программа начинает работать без прерывания>>, программа всегда работает
если ты имел ввиду, что при включении МК не должен попадать в функцию включения работы двигателя engine_on(), дак он туда и не попадает, т.е если ты использовал предыдущий код, я не поленюсь еще его сюда кину:
/***************************************************** Chip type : ATmega8 Program type : Application Clock frequency : 12,000000 MHz Memory model : Small External SRAM size : 0 Data Stack size : 256 *****************************************************/ #include <mega8.h> #include <delay.h> /* Глобальные переменные */ unsigned char f_on=0, f_mozgi=0; /* Инициализация порта */ void port_init() { PORTB=0x00; DDRB=0x00; PORTC=0x00; DDRC=0xFF; PORTD=0x00; DDRD=0xFF; //0xf3 } /* Инициализация внешних прерываний */ void int_init() { // External Interrupt(s) initialization // INT0: On // INT0 Mode: Rising Edge // INT1: On // INT1 Mode: Rising Edge GICR|=0xC0; MCUCR=0x0F; GIFR=0xC0; } /* Инициализация аналогового компаратора (его выключение) */ void an_comp_init() { // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; SFIOR=0x00; } /* Функция включения работы двигателя */ void engine_on() { if (f_on) { #asm("cli"); //мотор1 вперёд PORTD.0=1; //мотор2 вперёд PORTD.1=1; delay_ms(500); PORTD.0=0; PORTD.1=1; delay_ms(500); #asm("sei"); } } /* Функция ВЫключения работы двигателя */ void engine_off() { PORTD.0=0;//стоп PORTD.1=0;//стоп } /* Прерывание от вывода PD2(INT0) */ interrupt [EXT_INT0] void ext_int0_isr() { // Это прерывание возникает когда на выводе PD2 идет фронт сигнала if (f_mozgi) { PORTD.0=1; PORTD.1=0; f_mozgi=0; } else { PORTD.0=0; PORTD.1=1; f_mozgi=1; } } /* Прерывание от вывода PD3(INT1) */ interrupt [EXT_INT1] void ext_int1_isr() { // Это прерывание возникает когда на выводе PD3 идет фронт сигнала if (f_on) f_on = 0; else f_on = 1; if (f_on==0) engine_off(); // Выключение } void main() { #asm("cli"); // Запрет всех прерываний port_init(); int_init(); an_comp_init(); #asm("sei"); // Разрешение внешних прерываний while(1) engine_on(); }
И если ты подключил так, как на схеме::
ТО НИЧЕГО У ТЕБЯ НА НАЧАЛЬОМ ЭТАПЕ НЕ БУДЕТ ВКЛЮЧАТЬСЯ!!!
Если у тебя что-то включается, то это только твои ошибки, при подключении кнопок...
0 -
А может тогда чтото другое посоветуеш???Ато как мне ещё движками нормально управлять?
На счёт программы,,,
Я тебе только посоветую зайти на специальный форум роботостроения... И спросить кто какие драйверы использует...
Ну да я был бы очень рад если ты мне её набросаеш,ато времени остаётся всё меньше,а я так и не сделал то что хотелНу а что ты в своей программе не можешь реализовать...??? Вроде я тебе так много подсказал, даже объяснял как работает программа...
А в итоге пришли к тому что-ты ничего не понял или не хочешь понимать... ???
0 -
А я в протеусе мало, что эмулирую, тем более он совсем не подходит для сложных задач...
Я к каждому своему устройству делаю выводы для подключения переходника UART<<>>RS-232,
и просматриваю все, что мне надо... на комп-ре.
0 -
Ну а чего у тебя тогда не получается реализовать SPI...???
P.S: Что-то мы с тобой в двух темах пишем...
0 -
Ну вот я тебе примерно напишу как это делается на С:
Самая простая реализация:
SPCR = 0x5c; // Настройка SPI: прерывания запрещены, порт SPI включен, <<ведущий режим>>,
// первый MSB, 3 режим SPI, fosc/4(без удвоения частоты).
SPDR = data; // data - данные необходимые для передачи
while (!(SPSR & temp)); // Ожидание завершения передачи
SPCR = 0x00; // Выключение SPI
Но обычно по SPI передаются не только данные, но и команды:
SPCR = 0x5c; // Настройка SPI: прерывания запрещены, порт SPI включен, <<ведущий режим>>,
// первый MSB, 3 режим SPI, fosc/4(без удвоения частоты).
SPDR = com; // com - команда
while (!(SPSR & temp)); // Ожидание завершения передачи
SPDR = data; // data - данные необходимые для передачи
while (!(SPSR & temp)); // Ожидание завершения передачи
SPCR = 0x00; // Выключение SPI
Но почти всегда микросхемы подключенные к МК требуют передачи не восми разрядных данных,
а например 16-ти, 14-ти или 12-ти...
Тогда я использовал сдвиг:
SPCR = 0x5c; // Настройка SPI: прерывания запрещены, порт SPI включен, <<ведущий режим>>,
// первый MSB, 3 режим SPI, fosc/4(без удвоения частоты).
SPDR = com; // com - команда
while (!(SPSR & temp)); // Ожидание завершения передачи
SPDR = (char)(data>>8); // data - данные необходимые для передачи
while (!(SPSR & temp)); // Ожидание завершения передачи
SPDR = (char) data; // data - данные необходимые для передачи
while (!(SPSR & temp)); // Ожидание завершения передачи
SPCR = 0x00; // Выключение SPI
Ну примерно так...
И еще можешь зайти вот сюда: форум Atmel
0 -
Duhas ты на ассемблере пишешь?
Если да, то я тебе помочь не могу...
0 -
ЗЗЫ есть опыт реализации программного SPI и UART на асме ? и, что врятли, работа с ATA\IDE
У меня опыт только на С++ реализации программного SPI и UART...
0 -
Duhas а ты для чего изучаешь SPI, мне например SPI нужен был для flash-памяти, я на ней и изучил SPI...
0 -
Да я вот ещё подключил мегу к драйверу вот так http://myrobot.ru/stepbystep/r_firstbot1.php А мотор не крутится???Подал на оди 1 а на другой 0
Я не работал с таким драйвером L293D, поэтому помочь с ним тебе не могу...
0 -
Привет всем, я не приходил сюда потому что отдыхал далеко от компьютера !!!
Неужели я уже заслуживаю статус учителя...?
Ладно не буду вводить в заблуждениеСмотри что мне нужно от всей програмы:
1)При подаче питания,программа ждёт прерывания 1
2)когда произошло прерывание 1 програма,включает код
который активирует двигатели,и они начинают вращаться то в перёд то назад(Ну ето уже как я пропишу)Постоянно!
3)А при возникновении прерывания 2 программа проверяет какое последнее действие выполнялось для моторов
и делает всё наоборот в течении 5 секунд
4)И после етого снова переходит к продолжению работы двигателей от прерывания 1 но не ждёт етого прерывания!!
5)При подаче ещё одного прерывания 1 выполнение кода для двигателей останавливается,и снова начиная с пункта1!
Нормально описал?
HOT ICE ты вот это мне сказал, для того чтобы я тебе программу написал, или что...???
Вот то, что ты мне написал является "простенькой" программой, я например, совсем не могу понять какие у тебя проблеммы с ней могут возникнуть...??? Вот я понимаю, если ты не можешь организовать многоуровневое меню, или не получается реализовать программно какой-нибудь интерфейс или еще что-то тогда другое дело ...
Кстатти я наверно спалил INT1 и INT2.Я их проводом производил а не кнопкой и без резистора,раньше всё работаало а сейчас нет Новую мегу покупать прийдётся наверно.Я согласен с Duhas, одновременно два вывода (INT1 и INT2) мало вероятно спалить, тем более проводком, да еще ты ведь эти выводы настроил на вход (по крайней мере я на это надеюсь )... Напиши простую программу м проверь эти выводы...
А вот на счет fuses не согласен, они ведь никак не влияют на работу INT1 и INT2...
Кстатти я на той схеме что ты выложил не понял что такое J1?J1, ты мог на него не обращать, я тебе так показал, что выводы от МК идут к драйверу...
0 -
Ну вот я набросал примерный код, а так можно посмотреть на сайте Atmel, там много примеров даже такой есть какой ты просишь
void timer0_init() { // Используется для клавиатуры // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 15,625 kHz // Mode: CTC top=OCR0 // OC0 output: Disconnected TCCR0=0x00; TCNT0=0x00; OCR0=0xff; // Происходит прерывание каждые 16,32 ms } interrupt [TIM0_COMP] void timer0_comp_isr(void) { /* Опрос клавиатуры (Клавиатура 4x4 подключена к порту X) */ DDRX=0xf0; PORTX=0x0f; key=PINX; DDRX=0x0f; PORTX=0xf0; key+=PINX; key //это переменная которая содержит, код нажатой клавиши }
Надеюсь пебе все понятно... Потому что я до Вторника сюда не буду приходить...
IGRISE уехал на отдых... :-)
0 -
Ну я тебе так, на словах пока разьясню:
Ты наверно имел ввиду без прерывания от INT0 и INT1, раз ты указал что их всего два...
Да написать программу без прерывания можно, но только мало кто так делают, если у тебя МК не занят другими задачами то используй просто задержки delay_ms(); delay_us();
Ну вот например делаешь так:
Считываешь состояние порта: save_first = PINX.X;
Ждешь 20 милли секунд: delay_ms(20);
Считываешь состояние порта: save_final = PINX.X;
Сравниваешь эти два значения, для подаления "дребезга контактов": if ((!f_new_key)&(save_first==save_final)) f_new_key=1; // получили новое значение от вывода, теперь можно использовать save_first или save_final для управления программой... если хочешь получить состояние кнопки тебе нужно обнулить флаг f_new_key=1;
Ждешь 20 милли секунд: delay_ms(20);
И все это зацикливаешь...
Только ты сам понимаешь, что обычно МК не только считывает состояние кнопки, но и еще что-то делает, поэтому использование функций delay_ms(); delay_us(); несколько замедлит выполнение программы, вместо того, чтобы МК что-то выполнял, он будет тупо сидеть в этих функциях и ждать, поэтому без прерывания от какого-нибудь таймера никак не обойтись... Удачи...
Dimas19904 ответил: для меня проще написать программу без использования прерыванияМожешь не использовать прерывания, а просто считывать флаг состояния прерывания, но тогда тебе придется принудительно после чтения обнулять эти флаги... Сразу оговорюсь, я так никогда не делал, но это конечно не озночает, что другие так не делали, попробуй...
0 -
Пока НЕ могу
Вот тут я тебя не понял, что ты именно не можешь...?
Я так понял что это сторожевой таймер, но как его корректно включать???????Да ты правильно меня понял, это сторожевая собачка, включают ее двумя способами или fuse bits или программой...
0 -
Dimas19904, чем же тебе так прерывания, то не нравятся???
Без прерывания конечно можно...
0
Сортировка элементов массива
в Алгоритмы
Опубликовано · Изменено пользователем IGRISE
А может тебе лучше у другово преподавателя курсовую делать... Может там для тебя по легче задания будут...