Приветствую Вас, Гость! Регистрация RSS

Вторник, 22.08.2017
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 4 из 5«12345»
Форум » Форум mega-avr.ucoz.ru » Схемотехника на микроконтроллерах AVR » ATmega 16 + FDCG12864B
ATmega 16 + FDCG12864B
ilvzДата: Суббота, 27.11.2010, 05:10 | Сообщение # 61
Любопытный
Сообщений: 143
Репутация: 2
Город: Almaty
Статус: Отсутствует
Доброго времени суток! Если я правильно понял, то драйвера графики вы так и не нашли.
http://www.radiokot.ru/forum/viewtopic.php?f=20&t=5199&sid=905272fd6233fe827afe7db66f6e3652&start=20
( выделяйте ссылки цветом, т.к. они сливаются с общим текстом, а лучше пользуйтесь кнопочкой -http://- )
Вложение в первом сообщении второй страницы. Драйвер рабочий(с него начинал, и уже давно расширил и модифицировал(Спасибо автору за начальный импульс)). Установки портов и ножек в файле config.h
Если автор его не поправил, то круг рисует ромбом(что-то с форматом переменных. уже не помню). Единственный минус - шрифты моноширинные и в фиксированных позициях. 8 строк 16 символов. Ещё в этой же ветке форума есть ссылка на программу для формирования последовательности команд из бтмэп файла. Можно делать свои шрифты и картинки для LCD. Очень удобно. С уважением. Илья.
biggrin
 
us4ilqДата: Суббота, 27.11.2010, 21:41 | Сообщение # 62
Опытный
Сообщений: 173
Репутация: 2
Город: Донецк
Статус: Отсутствует
Что то у меня ничего не получается с клавиатурой wacko
Наверно я насовсем тупой.

Короче должно быть так:
после включения появляется "заставка" , через секунду (примерно) исчезает. Так все и происходит.
Далее после нажатия на какую нибудь кнопку на дисплее (12864) должна появляться соответствующая надпись (ввурх, вниз, влево ну т.д.
Однако дисплей не реагирует, тоесть после исчезновения "заставки" дисплей остается чистым.
Я уже всю голову себе сломал, вроде делаю все правильно, а оно никак не хочет работать.
Друзья ! Подскажите плиз чего я не так делаю?
Схема и си файл в архиве.
Спасибо.

Файл: 3679925.rar(97Kb)


Сообщение отредактировал us4ilq - Суббота, 27.11.2010, 21:43
 
АвторДата: Воскресенье, 28.11.2010, 01:02 | Сообщение # 63
Автор сайта
Сообщений: 200
Репутация: 3
Город: Омск
Статус: Отсутствует
Вечер добрый! надо помозговать, есть кое-какие идейки...


_____________________________________________________________
Радиоэлектроника и Программирование занимательная штука...
 
ilvzДата: Воскресенье, 28.11.2010, 04:38 | Сообщение # 64
Любопытный
Сообщений: 143
Репутация: 2
Город: Almaty
Статус: Отсутствует
Доброго времени суток! Прошу прощения, неправильно ВСЁ! smile
Если без готовых решений, а просто на уровне идей (ведь проект то учебный) то:
- switch нужен как раз в main функции. А сейчас все if-ы проходят проверку.
- нет защиты от дребезга и повторного подхвата уже обработанного нажатия.
- размер обработчика клавиатуры пропорционален к-ву кнопок. т.е. его в дальнейшем трудно масштабировать и повторно использовать.

Идеи.
Если единичку в порту двигать в цикле от 0 до 2(в данном случае) и при фиксации нажатия (присутствие 0 на одной из входных линий порта)использовать значение счетчика как старшую тетраду кода нажатой кнопки (сдвинув его на 4 раз. влево).
То в следующем цикле можно таким же образом получить младшую тетраду опросив порт с другой стороны (цикл от 0 до 1)
всё это проделать несколько раз через небольшие промежутки. И если код не изменился, то считать кнопку нажатой.
При изменении кода всё начинать сначала(дребезг! сбрасываем счетчик антидребезга).
Да, ещё. Если код предыдущего сканирования (после реакции на него) совпадает с текущим, то клавиша ещё не отпущена. Ждём или не реагируем.
Таким образом можно опрашивать до 16 кл. на одном пору и до 64 на двух. внося небольшие изменения в драйвер. (задавая начальную позицию и к-во циклов.)
При небольшом к-ве кнопок достаточно использовать только один цикл (от 0 до 2-х) а анализируемые линии прямо добавлять в код кнопки. Но лучше все-таки один раз написать полноценный драйвер. И в дальнейшем наступать уже на другие грабли.
И ещё. Что бы не ждать. Опрос клавиатуры можно проводить через прерывания по таймеру.
P.S. Если кнопок менее 9-ти то нолик можно двигать в порту подключенному к линиям DATA дисплея(отключив предварительно линии выбора кристаллов), а анализировать по единственному входу (или по нескольким если кнопок много). Естественно последовательно с кнопками посадить резисторы.
Подумал...вариантов реализации клавиатуры тьма. Главное антидребезг и реакция на ещё не отпущенную кнопку.
Удачи! Илья. biggrin

Добавлено (28.11.2010, 04:23)
---------------------------------------------
Вдогонку.
Для отладки драйвера лучше всего просто выводить полученный код на дисплей. Нажата, не нажата...без разницы. Просто посмотреть, что там в сухом остатке.
А так-же можно выводить и другие отладочные данные (счётчики, порты и т.д.)

Добавлено (28.11.2010, 04:38)
---------------------------------------------
И все-таки посмотрел...javascript://

Code
void AskKey (void)
{
      // == НЕТ УСТАНОВКИ ПОРТА В ИСХОДНОЕ СОСТОЯНИЕ===
      PORTC=0xE0;  // Исходное состояние.
      //---------------------------------------------------------------------
      Key=0;
      PORTC&=~(1<<5);  // Выбрать столбец 1.
      switch (PINC) {
           case 0b11010000: {Key=1; break;}  // Кнопка 1A.
           case 0b11001000: {Key=2; break;}  // Кнопка 1B.
      }
      PORTC=0xE0;  // Исходное состояние.

      PORTC&=~(1<<6);  // Выбрать столбец 2.
      switch (PINC) {
           case 0b10110000: {Key=3; break;}  // Кнопка 2A.
           case 0b10101000: {Key=4; break;}  // Кнопка 2B.
      }
      PORTC=0xE0;  // Исходное состояние.

      PORTC&=~(1<<7);  // Выбрать столбец 3.
      switch (PINC) {
          case 0b01110000: {Key= 5; break;} // Кнопка 3A.
          case 0b01101000: {Key=6; break;} // Кнопка 3B.
      }
      // ========== УНЕСТИ НАВЕРХ ФУНКЦИИ ===========
      PORTC=0xE0;  // Исходное состояние.
}

Ну а вообще...см. выше.
 
us4ilqДата: Воскресенье, 28.11.2010, 04:40 | Сообщение # 65
Опытный
Сообщений: 173
Репутация: 2
Город: Донецк
Статус: Отсутствует
Ух тыыыы!
Ну это мне переваривать дооолго придется.
Нет! конечно СПАСИБО ОГРОМНОЕ за участие!!!

По поводу дребезга - (как я это понимаю) пока неактуально , я хотел только
проверку нажатия сделать , ну тоесть держу нажатой кнопку светится надпись, отпустил - погасла.

К стати ,
только что смотрел,
автор того кода что я использовал как основу , доработал его .
и , как он пишет проверил в реале, мол все работает.
Завтра наверно попробую разобраться.
Еще раз спасибо.

 
ilvzДата: Воскресенье, 28.11.2010, 04:43 | Сообщение # 66
Любопытный
Сообщений: 143
Репутация: 2
Город: Almaty
Статус: Отсутствует
Не за что. Сам всё осваивал с нуля.
 
us4ilqДата: Воскресенье, 28.11.2010, 04:43 | Сообщение # 67
Опытный
Сообщений: 173
Репутация: 2
Город: Донецк
Статус: Отсутствует
Вы пишете :
Code
// == НЕТ УСТАНОВКИ ПОРТА В ИСХОДНОЕ СОСТОЯНИЕ===
PORTC=0xE0; // Исходное состояние.

Так я ж его в настройках портов указал
 
ilvzДата: Воскресенье, 28.11.2010, 04:50 | Сообщение # 68
Любопытный
Сообщений: 143
Репутация: 2
Город: Almaty
Статус: Отсутствует
Мало ли что происходит в программе между настройкой порта и вызовом драйвера!? Пусть не сейчас..да и инициализировать порт целиком(в драйвере!).
Рекомендую вывести на дисплей значение KEY и весь портС. Многое станет яснее.
 
us4ilqДата: Воскресенье, 28.11.2010, 04:55 | Сообщение # 69
Опытный
Сообщений: 173
Репутация: 2
Город: Донецк
Статус: Отсутствует
Спасибо за Ваши советы!
Завтра буду разбираться .
Сегодня позно уже.
Час ночи.
Спать давно пора smile
 
ilvzДата: Воскресенье, 28.11.2010, 14:31 | Сообщение # 70
Любопытный
Сообщений: 143
Репутация: 2
Город: Almaty
Статус: Отсутствует
Code
// при инициализации входящие линии не подтянуты и на них может быть что попало. надо исключить неактуальные из анализа
// для подтяжки выставить в PORTC биты соответствующие входу в единицу
Key=0;
PORTC=PINC & ~(1<<5);  // Выбрать столбец 1.
switch (PINC | маска где нулями выделить входные биты) {
// откуда известно что биты указанные как 0 являются таковыми
case 0b11010000: {Key=1; break;}  // Кнопка 1A.
case 0b11001000: {Key=2; break;}  // Кнопка 1B.
}

Добавлено (28.11.2010, 14:31)
---------------------------------------------
В switch - входные - это входные для клавиатуры. ну а в case проверять только их, т.к. маска исключит все остальные.

 
us4ilqДата: Воскресенье, 28.11.2010, 22:34 | Сообщение # 71
Опытный
Сообщений: 173
Репутация: 2
Город: Донецк
Статус: Отсутствует
Не! Ну это ж надо, а ?
Старый осел!!!
перепутал строки и столбци crazy
Теперь заработало!
Правда плохенько , но главное работает!

Добавлено (28.11.2010, 22:34)
---------------------------------------------
А то я уже начал опасаться что ненароком порт спалил пока издевался над клавой.

 
us4ilqДата: Воскресенье, 28.11.2010, 22:39 | Сообщение # 72
Опытный
Сообщений: 173
Репутация: 2
Город: Донецк
Статус: Отсутствует
сделал вот так
Файл: _-4-.c(1Kb)
 
ilvzДата: Понедельник, 29.11.2010, 05:48 | Сообщение # 73
Любопытный
Сообщений: 143
Репутация: 2
Город: Almaty
Статус: Отсутствует
Уже красивее biggrin

НО как минимум:

Code
//======================
// в инициализации порта
DDRC= 0b00011000;
// выставить 1 в выходные линии и подтянуть к 1 входы
PORTC=0b11111111;
//======================
void AskKey (void)
{
Key=0;

PORTC=0xE0;  // Исходное состояние.
//================================== и больше не трогать DDRC
// DDRC|=(1<<3); // Столбец 1 на выход.
PORTC&=~(1<<3);  // Выбрать столбец 1.
#asm ("nop");
switch (PINC & ~((1<<0)|(1<<1)|(1<<2))) {
case 0b11010000: {Key=1; break;}  // Кнопка 1A.
case 0b10110000: {Key=2; break;}  // Кнопка 1B.
case 0b01110000: {Key=3; break;}  // Кнопка 1C.
}
PORTC|=(1<<3); // Восстановить единичный уровень на столбце 1.
// DDRC=0; // Все разряды на вход.

// DDRC|=(1<<4); // Столбец 2 на выход.
PORTC&=~(1<<4);  // Выбрать столбец 2.
#asm ("nop");
switch (PINC & ~((1<<0)|(1<<1)|(1<<2))) {
case 0b11001000: {Key=4; break;}  // Кнопка 2A.
case 0b10101000: {Key=5; break;}  // Кнопка 2B.
case 0b01101000: {Key=6; break;}  // Кнопка 2C.
}
PORTC|=(1<<4); // Восстановить единичный уровень на столбце 2.
// DDRC=0; // Все разряды на вход.

}
// будет уже -4 команды

biggrin
И опять намекаю, что функция состоит из 2-х очень похожих блоков biggrin

Добавлено (29.11.2010, 02:08)
---------------------------------------------
Могу предложить принципиально другой алгоритм.
Наверное он покороче будет (правда жестко под эту клавиатуру)

Выставить 0 на первую выходную линию.
Присвоить Key значение порта С
Замаскировать всё кроме входных линий (Key |= 0b00011111)
Если не FF то сбросить в 0 самый младший разряд (Key &= 0b1111110)и выйти
Выставить 0 на другую выходную линию.
Присвоить Key значение порта С и выйти

Теперь Key может иметь 7 значений
FF и 6 кодов кнопок
Этим 7 кодам через #define сопоставить имена (#define Key1 0b11011110)
И в основном цикле уже обрабатывать полученное через селектор
Всё! (опять без антидребезга и прочего)

Добавлено (29.11.2010, 02:21)
---------------------------------------------
Пардон упустил!
Читать так:
Выставить 0 на другую выходную линию.
Присвоить Key значение порта С ЗАМАСКИРОВАТЬ ВСЁ КРОМЕ ВХОДНЫХ ЛИНИЙ и выйти
Кстати присваивание и маскирование можно совместить и будет ещё короче
Коды должны получиться такие:
0b11011110
0b10111110
0b01111110
0b11011111
0b10111111
0b01111111
0b11111111 - ничего не нажато

Добавлено (29.11.2010, 05:48)
---------------------------------------------
Прошу прощения! Что-то не удержался..налабал тут в перерыве:)
Не проверял естественно, но должно работать.

Code
// это в блок объявлений
#define Key1 0b11011110
#define Key2 0b10111110
#define Key3 0b01111110
#define Key4 0b11011111
#define Key5 0b10111111
#define Key6 0b01111111

//======================
// Это в инициализации портов
DDRC= 0b00011000;
// выставить 1 в выходные линии и подтянуть к 1 входы
// неподтянутые входы болтаются туда сюда увеличивая потребление, да и не красиво <img src="http://s36.ucoz.net/sm/1/smile.gif" border="0" align="absmiddle" alt="smile">
PORTC=0b11111111;
//======================

// ну а это аналог Вашей функции (простой как калашников)
unsigned char InKey (void)
{
char Key;
// ничего кроме наших битов вывода в порту не трогаем (он не только наш)
PORTC |=0b00011000;
// подаём нолик на первую линию
PORTC &=0b11110111;
#asm ("nop");
#asm ("nop");
// выделяем входные столбцы для анализа
// обязательно через переменную т.к. операций несколько
// и повторное чтение из порта может дать другой результат
Key=PINC | 0b00011111;
// если есть нажатие т.е. 0 на одном из входных столбцов
if (Key !=0xFF) // если вышеприведённое присваивание поместить сюда, вместо Key (и в скобках), то будет ещё на строку короче
{
// то возвращаем зафиксированное плюс пометка, что это кнопка по первой линии
return Key & 0b11111110;
};
// если на первой ничего, то переворачиваем биты на выходных линиях было 10 станет 01
// опять же трогаем только свои линии
PORTC ^=0b00011000;
#asm ("nop");
#asm ("nop");
// на этот раз тупо маскируем лишнее и возвращаем без пометки (а это значит, что код со второй линии)
// или ноль на одном из входных столбцов или ни одного нуля (4 варианта)
return PINC | 0b00011111;
}

// здесь отлавливаем каждое нажатие персонально
// для простоты реагируем не на нажатие, а на отпускание кнопки
// и возвращаем то что было перед отпусканием (как вариант код отсутствия нажатия 0xFF, т.е. а никто ничего и не нажимал)
// после отпускания не ждём, потому что вывод на дисплей сам работает как задержка
// конечно по хорошему и отпускание тоже надо зафиксировать надёжно

unsigned char GetKey(void)
{
unsigned char Key,i;
Key= InKey(); // первый допрос Клавы
if (Key ==0xFF) return Key; // если с Клавы ничего то и весь последующий гемор нам без надобности

i=100; // можно и больше и меньше (по вкусу), а можно и вообще delay_ms
// ждём маленько. мало ли...
while(--i)
{
};
// Второй опрос через некоторое время. Проверяем а точно ли нажата или показалось (антидребезг)
if(InKey() != Key) return 0xFF; // показалось, считаем что ничего не нажато и уходим
// два раза одно и тоже. значит не показалось. теперь ждём отпускания кнопки, чтобы многократно не реагировать на это нажатие
while(InKey() !=0xFF)
{
};
// и возвращаем, что там у нас с клавиатуры
return Key;

}

Вроде всё. В главной функции можно работать через селектор с псевдонимами возвращаемых кодов.

 
us4ilqДата: Воскресенье, 05.12.2010, 16:27 | Сообщение # 74
Опытный
Сообщений: 173
Репутация: 2
Город: Донецк
Статус: Отсутствует
И так!
Пришло время "попикать".

Использовал Таймер2.
В прогу добавил следующее

Code

  TCCR2|=( 1<<CS22 ); // Делить системную частоту на 64
  TCNT2=0x00;
  OCR2=86; //

  TIMSK|=( 1<<OCIE2 ); // Разрешить прерывания по совпадению
  ......
  ......
  ......

  // Подпрограмма обработки прерывания по соврадению T2

  interrupt [TIM2_COMP] void timer2_compa_isr( void )
    {
       if ( Key!=0 )  
            {     // Если нажата любая кнопка
                  DDRC=( 1<<2 );     //Сделать РС2 выходом
                  PORTC^=( 1<<2 ); //Инвертируем уровень на РС2
                  DDRC&=~( 1<<2 ); //Сделать РС2 входом
            };

   TCNT2=0; //Сбрасываем счетчик
    }

Заработало!
При нажатии на любую кнопку в пьезопищалке слышен звук приблизительно 1кгц.
Вот только очень слабенько, придется состряпать какой то простенький усилитель на 1м транзисторе КТ315.
Поищу в инете.
Однако интересно кто что сможет предложить .
biggrin

Сообщение отредактировал us4ilq - Воскресенье, 05.12.2010, 16:28
 
ilvzДата: Воскресенье, 05.12.2010, 21:35 | Сообщение # 75
Любопытный
Сообщений: 143
Репутация: 2
Город: Almaty
Статус: Отсутствует
Не надо каждый раз переключать бит порта на вход. Нет смысла, да и погромче будет. А ещё лучше подключить пищалку к двум выходам и подавать напряжение в противофазе. (мостовая схема)
 
us4ilqДата: Понедельник, 06.12.2010, 21:20 | Сообщение # 76
Опытный
Сообщений: 173
Репутация: 2
Город: Донецк
Статус: Отсутствует
Рановато обрадовался.
Черт меня дернул ткнуть осциллограф (читать показометр ) на РС2,
а там коротенькие отрицательные импульсы, очевидно еще и поэтому так тихо пикает.
От же надо думать дальше.

Нашел в инете пару интересных схем подключения .
Потом попробую , если програмно неудастся повысить громкость.

Дело в том что когда я проверял свои пьезо излучатели на простеньком генераторе
на К561ЛА7, то писчало гораздо громче.

Добавлено (06.12.2010, 16:17)
---------------------------------------------
Таак.
Илья, последовал Вашему совету., закоментировал переключение на вход.
Громкость и правда резко увеличилась - сигнал то на РС2 стал меандром smile , однако обнаружилась новая неприятность.
Поверх сигнала появилось какое то тиканье, периодичность этого тиканья хаотически меняется, и на разных
кнопках по разному.

Пробовал перекинуть строку -

Code

  DDRC=( 1<<2 ); //Сделать РС2 выходом.

в самое начало прерывания , тоесть до цикла - без разницы.
Пробовал поместить перед главным циклом проги - не гудит совсем.
Пробовал поместить в самом начале главного цикла - тоже самое.

Похоже выбранный мною подход к решению этой задачи неверный.
буду думать дальше.

Добавлено (06.12.2010, 17:40)
---------------------------------------------
Ребята!
Подскажите как сделать

Code

  if ( Key!=0 ) { // Если нажата любая кнопка
  PORTC^=( 1<<2 ); //Инвертируем уровень на РС2
  };

без цикла?
Или это невозможно?

Добавлено (06.12.2010, 17:55)
---------------------------------------------

Quote
А ещё лучше подключить пищалку к двум выходам и подавать напряжение в противофазе. (мостовая схема)

Жалко порты smile , да и на "Ц" уже все заняты.
А если по мостовой схеме включать, придется "А" использовать ,
кроме того теперь громкости уже достаточно.
Я же не собираюсь музыку слушать, мне нужно просто "пикать", сообщая о каких то событиях.

Добавлено (06.12.2010, 21:20)
---------------------------------------------
Тааак.
Кажется нашел причину.
Наверно завтра неполучится, а вот после завтра вроде свободен,
тогда и попробую.

Сообщение отредактировал us4ilq - Понедельник, 06.12.2010, 16:19
 
ilvzДата: Вторник, 07.12.2010, 01:41 | Сообщение # 77
Любопытный
Сообщений: 143
Репутация: 2
Город: Almaty
Статус: Отсутствует
Пойдёт. Только не надо постоянно включать порт то на вход то на выход, если конечно задача этого не подразумевает.
Всё делается однократно, во время инициализации.
И ещё.
CVAVR позволяет написать это так:
Code
PORTC.1 ^= 1;

и так:
Code
PORTC.1 = ! PORTC.1;

Добавлено (07.12.2010, 01:33)
---------------------------------------------
А про пищалку. Можно её включить через один элемент НЕ. Одна нога на порту, перед НЕ, а другая за. Тоже мост получается.

Добавлено (07.12.2010, 01:41)
---------------------------------------------
З.Ы. Про порт.
Если предварительно обозвать его осмысленно

Code
#define ZUMM PORTC.1

то будет удобнее
Code
ZUMM ^=1;


Сообщение отредактировал ilvz - Вторник, 07.12.2010, 01:30
 
us4ilqДата: Вторник, 07.12.2010, 18:20 | Сообщение # 78
Опытный
Сообщений: 173
Репутация: 2
Город: Донецк
Статус: Отсутствует
Ух тыыыы!
Ваня, Кнопочки появились!
Ну теперь все будет правильно выглядеть. smile .

Обстоятельства кординально изменились, ( на то они и непредвиденные smile ), и сегодня я свободен.
От же, попробую то что мне пришло в голову (вернее просто нашел в инете) по поводу "пикалки" .

Илья.
Про #define я знаю, но иногда к примеру

Code
#define ZUMM PORTC.1

Проще всетаки без #define да и на мой взгляд как то понятней.
Нет необходимости помнить что есть ZUMM.
И совсем другое когда вместо ZUMM компилятор должен вставить какое нибудь длинючее выражение.
Вот тогда да без #define никак необойтись.
Хотя может просто я еще не привык?

А что до формы зописи ну вроде

Code
PORTC.1 ^= 1;

Так я просто пытаюсь научиться писать правильно , ну с точки зрения "С" , а подобные записи ведь понятны только СV.

Добавлено (07.12.2010, 17:52)
---------------------------------------------
Что то невыходит.
Сделал так:

В инициализации

Code
PORTC=0xE0;      // PC5, PC6, PC7 - в состояние 1               
DDRC=0xE4;                // PC2,PC5, PC6, PC7 - выход         

TCCR2|=(1<<CS22);          //   Делить системную частоту  на 64                 
TCNT2=0x00;
OCR2=250;                        //       
TIMSK|=(1<<OCIE2);         //   Разрешить прерывания по совпадению     

Обработчик прерывания

Code
interrupt [TIM2_COMP] void timer2_compa_isr(void) {         
       PORTC^=(1<<2);     //Инвертируем уровень на РС2       
     }

И функция

Code
void Beep (void) {
           if (Key!=0 )  {           // Если нажата любая кнопка       
              TIMSK|=(1<<OCIE2);    // Разрешаем прерывания таймера Т2 по совпадению               
           }
           else  {
              TIMSK = 0; };              //  Запрещаем  прерывания таймера Т2
}       

Куда только я не вставлял вызов функции Beep () ;
сигнала при нажатии нету.
Но! после сброса , когдп программа входит в главный цикл, слышен коротенький"пик" .

Что я снова проглядел?

Добавлено (07.12.2010, 18:20)
---------------------------------------------
Добавил в функцию строку DDRC=(1<<2); //Сделать РС2 выходом

Code
void Beep (void) {             
             DDRC=(1<<2);        //Сделать РС2 выходом       
           if (Key!=0 )  {           // Если нажата любая кнопка       
              TIMSK|=(1<<OCIE2);      // Разрешаем прерывания таймера Т2 по совпадению               
                }
                else  {
                TIMSK = 0; };              //  Запрещаем  прерывания таймера Т2
           }

Теперь пищит при нажатиях.
Но все равно слышно все тоже тиканье.
wacko

Наверное это связано с тем что примитивная у меня обработка клавиатуры.

Сообщение отредактировал us4ilq - Вторник, 07.12.2010, 18:27
 
ilvzДата: Среда, 08.12.2010, 01:42 | Сообщение # 79
Любопытный
Сообщений: 143
Репутация: 2
Город: Almaty
Статус: Отсутствует
DDRC надо не в функцию добавлять а в инициализацию. Проверьте если в блоке инициализации всё нормально, то значит где-то в другом месте программы есть переключение этого бита на ввод безвозвратно. ( как результат политики переключения битов на вход и на выход в произвольных местах программы)
А про #define скажу, присвоение имён битам позволяет в будущем вспомнить куда что включено и избежать фатальных для процессора и периферии ошибок. Перепутать имя много сложнее чем циферку.
И если нравится адресация битов вида
Code
DDRC ^=( 1<<2 )

то можно писать
Code
DDRC ^=( 1<<Zoom )

Объявив предварительно
Code
#define Zoom 2 // Выход на пищалку

Добавлено (08.12.2010, 01:42)
---------------------------------------------
Как пример:

Code
TIMSK|=(1<<OCIE2); // Разрешаем прерывания таймера Т2 по совпадению

TIMSK и OCIE2 - где-то объявленны по define. Вот бы сейчас вспоминать какой номер регистра у таймера и какой бит в регистре за что отвечает biggrin

 
АвторДата: Пятница, 10.12.2010, 11:56 | Сообщение # 80
Автор сайта
Сообщений: 200
Репутация: 3
Город: Омск
Статус: Отсутствует
А почему бы не применить такую запись ( это по мне конечно ):
Code
#define Zoom_out  DDRC^=( 1<<2 )



_____________________________________________________________
Радиоэлектроника и Программирование занимательная штука...
 
Форум » Форум mega-avr.ucoz.ru » Схемотехника на микроконтроллерах AVR » ATmega 16 + FDCG12864B
Страница 4 из 5«12345»
Поиск: