Страница 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 раз дороже! Спасиб всем кто разжевал! Завтра паяю!