Страница 40 из 628
Добавлено: Вт дек 09, 2008 11:03:13
sheva_s
Спасибо за ответы буду разбираться , пока никто не отвечал пытался сам разобраться чуть получилось только тут без подавления дребезга контактов. Вобщем так скелет ну работает покрайней мере в протеусе.
Код: Выделить всё
#include <mega8>
#include <delay>
int a; // переменная для хранения состояния порта В
void main(void)
{
//инициализируем порты
PORTB=0x3F;
DDRB=0x00;
PORTD=0x00;
DDRD=0xFF;
//********************
while (1)
{
a=PINB&0x3F; //считываем состояние порта и проверяем
//по маске биты порта к которым подключены
//кнопки.
//цикл определения какая кнопка нажата и выдача информации на соответствующий пин порта Д
switch (a) {
case 0b00111110 : PORTD.0=~PORTD.0; break;
case 0b00111101 : PORTD.1=~PORTD.1; break;
case 0b00111011 : PORTD.2=~PORTD.2; break;
case 0b00110111 : PORTD.3=~PORTD.3; break;
case 0b00101111 : PORTD.4=~PORTD.4; break;
case 0b00011111 : PORTD.5=~PORTD.5; break;
};
delay_ms (200);
a=0; // обнуляем переменную порта В
};
}
Добавлено: Вт дек 09, 2008 11:08:08
ARV
послушайте, уважаемый
sheva_s, то, что вы написали - полностью противоречит вашему воплю о помощи:
sheva_s писал(а):опрос происходит в прерывании таймера с частатой 400 гц
что вы голову всем морочите?
Добавлено: Вт дек 09, 2008 11:25:35
Neekeetos
sheva_s писал(а):Спасибо за ответы буду разбираться , пока никто не отвечал пытался сам разобраться чуть получилось только тут без подавления дребезга контактов. Вобщем так скелет ну работает покрайней мере в протеусе.
В твоей программе есть одна проблема - нажатие нескольких кнопок одновременно будет потеряно, можно сделать немного по другому, например так:
Код: Выделить всё
while (1)
{
a=PINB&0x3F;
if(!a&0x01) { PORTD.0=~PORTD.0;}
if(!a&0x02) { PORTD.1=~PORTD.1;}
if(!a&0x04) { PORTD.2=~PORTD.2;}
if(!a&0x08) { PORTD.3=~PORTD.3;}
if(!a&0x10) { PORTD.4=~PORTD.4;}
if(!a&0x20) { PORTD.5=~PORTD.5;}
delay_ms (200);
};
}
Не самый прямой способ обрабатывать кнопки зато наглядно и можно отделить каждую кнопку от других.
Добавлено: Вт дек 09, 2008 12:05:55
sheva_s
ARV писал(а):
что вы голову всем морочите?
Голову неморочу про прерывание я писал правильно, а тот код который я выложил появился в процессе разбора как вобще обрабатываються кнопки и выложен для примера как простой способ опроса 6 кнопок я же написал что это просто скелет программы , когда я пытался разобраться ваших постов небыло, а когда у меня хоть что то получилось решил поделиться вдруг такому начинающему как я нужна будет хоть какая-то помощь с кнопками на простом примере вот и выложил.
А ваши примеры щяс пытаюсь анализировать . Я пишу программу для часов на МЕГА8 и с кнопками мучался целый день у меня невыходило получалось только через оператор if() меня это неустраивало так как делать опрос 3 кнопок в прерывании которое задействовано на динамической индикации нехочеться. вот и искал другие способы.
Всем спасибо за помощь буду разбираться дальше.
Добавлено: Вт дек 09, 2008 12:41:21
ARV
вообще-то тут была тема про обработку кнопок... я там высказывал мнение (и продолжаю так считать), что заморачиваться с опросом кнопок в прерываниях - это очень часто (может, почти всегда) явно лишнее.
подумайте над тем, чтобы реализовать нужные вещи чисто в основной задаче, а прерывания оставьте фоновым процессам. имхо, будет и проще, и понятнее, и отлаживать легче...
Добавлено: Ср дек 10, 2008 13:22:50
сахар
здрасти,вопрос мож не в тему,но помогите плиз,вообщем купил я три атмеги8,в одну зашил нех для "призрака",потом подключил,проверять,а он мне меню выдал,но на клаву не реагирует,но я не о том,короче когда я его стираю,а потом читаю то он мне вместо---- выдает какойто текст,а с фьюзами вообще лажа,все котрые отвечают за частоту установлены в 1,(а для проэктам там нужен только один,который я и записал),не пойму в чем именно проблема.в мк или в програматоре?
Добавлено: Ср дек 10, 2008 23:44:55
pirotehnick
Я меня возник вопрос по поводу использования SPI Atmega, т.е. совмещения c ним карты MMC.
Не совсем понятно как принимать данные от карты. Ведущее устройство здесь МК, т.е. SPI у него настроен в режиме мастера. А как при этом регистрировать данные от карты. Как я понял бит SPIF должен устанавливаться как при окончании передачи данных, так и при окончании их приёма (от ведомого к ведущему) ? А при этом, направления передачи данных для линий отстаются прежними, т.е.
SS - выход (низкий уровень)
SCK - выход
MOSI - выход
MISO - вход
Я всё правильно понял?
Добавлено: Ср дек 10, 2008 23:52:00
ARV
направления сигналов остаются всегда одинаковыми. но самое главное, что момент окончания приема и окончания передачи - это один и тот же момент! оба процесса ОДНОВРЕМЕННЫ
Добавлено: Чт дек 11, 2008 00:05:58
pirotehnick
Вот это не совсем понял, ОДНОВРЕМЕННО - в каком смысле?
Как я понимаю, когда мы общаемся с внешним устройством, например с этой картой, мы отсылаем данные и ждём окончания их передачи, а затем ждём ответа.
Добавлено: Чт дек 11, 2008 00:09:51
ARV
pirotehnick писал(а):Вот это не совсем понял, ОДНОВРЕМЕННО - в каком смысле?
в абсолютно прямом, как луч лазера

передача байта по SPI всегда сопровождается одновременным приемом байта. занес в регистр UDR (или как он там зовется) байт - передал его - считал из UDR принятый байт

вот так. без передачи приема не выйдет, равно и наоборот.
Добавлено: Чт дек 11, 2008 00:27:23
pirotehnick
Мммда... А мне SPI представлялся несколько в ином свете.
Т.е. по окончании передачи байта, у нас уже имеется готовый пришедший байт, так что-ли?
Тогда, не совсем понятно. А если имеется такая ситуация. Необходимо связать 2 МК. Допустим первый - ведущий, а второй ведомый. Первый отсылает команду, состоящую из нескольких байт, которую должен обработать второй МК и выдать ответ первому. В этом случае, что ведущий МК должен в определёный момент времени организовать передачу произвольных данных, что бы получить ответ второго, а второй в этот момент должен отвечать. Так что-ли?
Добавлено: Чт дек 11, 2008 00:54:01
biDE
pirotehnick писал(а):ведущий МК должен в определёный момент времени организовать передачу произвольных данных, что бы получить ответ второго, а второй в этот момент должен отвечать. Так что-ли?
Именно так. Это позволяет ведущему передавать команды и получать ответы тогда, когда ему это удобно.
Добавлено: Чт дек 11, 2008 17:42:02
кот байкера
Помогите разобраться! как подключить кварцевый генератор с четырьмя выводами (на фото) к МК ATmega8? Раньше использовал только часовой кварц с 2 выводами, а как быть с четырьмя?
Добавлено: Чт дек 11, 2008 18:51:44
smac
кот байкера писал(а):Помогите разобраться! как подключить кварцевый генератор с четырьмя выводами (на фото) к МК ATmega8? Раньше использовал только часовой кварц с 2 выводами, а как быть с четырьмя?
2 минуты в гугле
http://www.q-crystal.com/upload/7/20087 ... 821943.pdf 181 кБайт
Добавлено: Чт дек 11, 2008 19:28:53
кот байкера
здесь я уже был, хотелось бы чего нибудь по конкретнее. Ну и на этом спасибо. Единственное что я понял - используются только 3 вывода. Может я что то не то купил? Во всех схемах у кварца 2 вывода. Может это резонаторы? Да, с этим у меня пока плохо.

Добавлено: Чт дек 11, 2008 20:27:15
DiGiCat
Это похоже генератор кварцевый ( по цене дороже раз в 5) , поэтому и три вывода задействуется. Еще возможно прийдется в конфигурации ATmega8 фьюзы выставить на работу от внешнего тактирования.
Обычные кварцы в других корпусах идут - HC-49/U3H ( KX-3HT ) , HC-49/U ( KX-49 ) , QSMD ( КХ-К ) и т.д.
Добавлено: Чт дек 11, 2008 20:36:19
ChipManyak
Опять опередили...
*******************
Кварцевый генератор как на духу
DiGiCat прав.
Хорошая вещь кстати.
На выходе меандр.
Добавлено: Чт дек 11, 2008 20:45:58
кот байкера
Здорово я прокошачился! До сегодняшнего дня думал что генератор и резонатор это одно и тоже. Значит вывод #5 генератора на XTAL2 (а XTAL1-в воздухе?), и никаких дополнительных конденсаторов. А фьюзы как обычно - тактирование от внешнего кварца, и вот оно счастье?.
Добавлено: Чт дек 11, 2008 20:52:00
ChipManyak
YES ! Счастье есть, его не может не быть!
Добавлено: Чт дек 11, 2008 20:59:38
кот байкера
А стоит он действительно в 5 раз дороже! Спасиб всем кто разжевал! Завтра паяю!