Портал для радиолюбителей и разработчиков электроники · с 2003 годаРеклама на сайте
Найти компонент, схему или даташит

Даташиты, справочник отечественных приборов, схемы с разбором и живой форум

AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR...

 
Опции темы

Динамическая клавиатура.

Непрочитано 04.09.2020, 09:26  
Yarikkasl
Частый гость
 
Регистрация: 11.03.2019
Сообщений: 26
Сказал спасибо: 6
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Yarikkasl на пути к лучшему
По умолчанию Динамическая клавиатура.

Здравствуйте, подскажите пожалуйста что не так в моей примитивной программе, в протеусе все прекрасно работает, а вот на железе не как, я уже и камни менял не помогает нечего
Цитата:
#define F_CPU 1000000UL

#include ‹avr/io.h›//стандартная библиотека ввода/вывода
#include ‹avr/interrupt.h›//библиотека с прерываниями




unsigned char key_code[5][3]=
{{~0x3F, ~0x06, ~0x5B},
{~0x4F, ~0x66, ~0x6D},
{~0x7D, ~0x07, ~0x7F},
{~0x6F, ~0x77, ~0x7C},
{~0x39, ~0x1E, ~0x74}}; //матрица соответствия кодов клавиш


//Подпрограмма формирвоания задержки(паузы)
void pause (unsigned int a)
{ unsigned int i;


for (i=a;i›0;i--);
}

//Подпрограмма инициализации таймера
void init_timer (void)
{
TIMSK=(1‹‹TOIE0); //Разрешить прерывания по переполнению таймера0
TCCR0=(1‹‹CS00)|(1‹‹CS01)|(0‹‹CS02); //Делитель =/64
}


//Подпрограмма-обработчик прерывания по переполнению таймера
ISR (TIMER0_OVF_vect)
{ unsigned char i,j;


DDRF=0b00011111;// пины PF0-PF4 поставленны на выход, пины PF5-PF7 поставленны на вход
PORTF = 0b11100000;//пины PF0-PF4 подтянуты к 0v. пины PF5-PF7 подтянуты к 5v.

pause(1); //Задержка для устранения всяких переходных процессов!
j=3;
if ((PINF&0x20)==0x00){j=0;} //Если нажата клавиша в 0й колонке, i=0 на пине PF5 появляется 0
if ((PINF&0x40)==0x00){j=1;} //Если нажата клавиша в 1й колонке, i=1 на пине PF6 -||-
if ((PINF&0x80)==0x00){j=2;} //Если нажата клавиша в 3й колонке, i=2 yf на пине PF7 -||-

DDRF = 0b11100000;
PORTF = 0b00011111;

pause(1); //Задержка для устранения всяких переходных процессов!
i=5;
if ((PINF&0x01)==0x00){i=0;} //Если нажата клавиша в 0й строке, j=0
if ((PINF&0x02)==0x00){i=1;} //...
if ((PINF&0x04)==0x00){i=2;}
if ((PINF&0x0==0x00){i=3;}
if ((PINF&0x10)==0x00){i=4;}

if ((i!=5)&&(j!=3))
{ //Если была нажата клавиша

PORTD = (key_code[i][j]); //Пишем ее код на ЖКИ
}
else PORTD = 0b11111111;

TCNT0=0x00; //Очищаем счетчик
TIFR=0x00; //Очищаем флаг переполнения







TCNT0=0x00; //Очищаем счетчик
TIFR=0x00; //Очищаем флаг переполнения


return;
}


//Основная программа
int main(void)
{
DDRD=0xFF; //Инициируем PortD
PORTD=0xFF;

pause(1000); //Задержка для включения ЖКИ
init_timer(); //Инициализация нулевого таймера


sei(); //Глобальное разрешение прерывани
while(1); //Вечный цикл
return 1;
}
Реклама:
Yarikkasl вне форума  
Непрочитано 04.09.2020, 09:52  
Ara41
Почётный гражданин KAZUS.RUN
 
Регистрация: 30.09.2006
Сообщений: 1,557
Сказал спасибо: 157
Сказали Спасибо 660 раз(а) в 430 сообщении(ях)
Ara41 на пути к лучшему
По умолчанию Re: Динамическая клавиатура.

протеус не учитывает дребезг контактов
Ara41 вне форума  
Непрочитано 04.09.2020, 10:02  
Yarikkasl
Частый гость
 
Регистрация: 11.03.2019
Сообщений: 26
Сказал спасибо: 6
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Yarikkasl на пути к лучшему
По умолчанию Re: Динамическая клавиатура.

Сообщение от Ara41 Посмотреть сообщение
протеус не учитывает дребезг контактов
Это я понимаю, но даже если я просто ставлю перемычку у меня не происходит нечего. На выводах порта D начальное значение которое я задал при настройке
Yarikkasl вне форума  
Непрочитано 04.09.2020, 10:47  
parovoZZ
Почётный гражданин KAZUS.RUN
 
Регистрация: 15.11.2010
Сообщений: 2,376
Сказал спасибо: 337
Сказали Спасибо 328 раз(а) в 253 сообщении(ях)
parovoZZ на пути к лучшему
По умолчанию Re: Динамическая клавиатура.

Погонять в симуляторе AtmelStudio, если по живому никак. FUSE верно выставлены?
parovoZZ вне форума  
Непрочитано 04.09.2020, 12:33  
Yarikkasl
Частый гость
 
Регистрация: 11.03.2019
Сообщений: 26
Сказал спасибо: 6
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Yarikkasl на пути к лучшему
По умолчанию Re: Динамическая клавиатура.

Сообщение от parovoZZ Посмотреть сообщение
Погонять в симуляторе AtmelStudio, если по живому никак. FUSE верно выставлены?
Фьюзы в avrdude_prog я не менял все стоит по умолчанию разве что совместимость со atmega103 убрал. А что касается симуляции в atmelstudio то тут у меня не получается что то
Yarikkasl вне форума  
Непрочитано 04.09.2020, 12:53  
ForcePoint
Почётный гражданин KAZUS.RUN
 
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 7,459
Сказал спасибо: 3,227
Сказали Спасибо 3,513 раз(а) в 2,394 сообщении(ях)
ForcePoint на пути к лучшему
По умолчанию Re: Динамическая клавиатура.

1. Отредктируй исходное сообщение, обрамив исходник тегами php (они дают наименьшее число артефактов на движке форума).
2. Убрать
Сообщение от Yarikkasl Посмотреть сообщение
else PORTD = 0b11111111;
чтобы данные дольше отображались?
3. За программные задержки в ISR - сжигать надо.
Сообщение от Yarikkasl Посмотреть сообщение
pause(1); //Задержка для устранения всяких переходных процессов!
4. Считывать данные не по таймеру, а по прерыванию pin change?
__________________
Экзорцист 40-го уровня.
ForcePoint вне форума  
Непрочитано 04.09.2020, 13:03  
Yarikkasl
Частый гость
 
Регистрация: 11.03.2019
Сообщений: 26
Сказал спасибо: 6
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Yarikkasl на пути к лучшему
По умолчанию Re: Динамическая клавиатура.

PHP код:
#define F_CPU 1000000UL

#include ‹avr/io.h›//стандартная библиотека ввода/вывода
#include ‹avr/interrupt.h›//библиотека с прерываниями




unsigned char key_code[5][3]=
{{~0x3F, ~0x06, ~0x5B},
{~0x4F, ~0x66, ~0x6D},
{~0x7D, ~0x07, ~0x7F},
{~0x6F, ~0x77, ~0x7C},
{~0x39, ~0x1E, ~0x74}}; //матрица соответствия кодов клавиш


//Подпрограмма формирвоания задержки(паузы)
void pause (unsigned int a)
{ unsigned int i;


    for (i=a;i›0;i--);
}

//Подпрограмма инициализации таймера
void init_timer (void)
{
    TIMSK=(1‹‹TOIE0);         //Разрешить прерывания по переполнению таймера0
    TCCR0=(1‹‹CS00)|(1‹‹CS01)|(0‹‹CS02);  //Делитель =/64
}


//Подпрограмма-обработчик прерывания по переполнению таймера
ISR (TIMER0_OVF_vect)
{ unsigned char i,j;


DDRF=0b00011111;// пины PF0-PF4 поставленны на выход, пины PF5-PF7 поставленны на вход
PORTF = 0b11100000;//пины PF0-PF4 подтянуты к 0v. пины PF5-PF7 подтянуты к 5v.

pause(1);        //Задержка для устранения всяких переходных процессов!
j=3;
if ((PINF&0x20)==0x00){j=0;}             //Если нажата клавиша в 0й колонке, i=0 на пине PF5 появляется 0
if ((PINF&0x40)==0x00){j=1;}             //Если нажата клавиша в 1й колонке, i=1 на пине PF6 -||-
if ((PINF&0x80)==0x00){j=2;}          //Если нажата клавиша в 3й колонке, i=2 yf на пине PF7 -||-

DDRF = 0b11100000;
PORTF = 0b00011111;

pause(1);        //Задержка для устранения всяких переходных процессов!
i=5;
if ((PINF&0x01)==0x00){i=0;}                //Если нажата клавиша в 0й строке, j=0
if ((PINF&0x02)==0x00){i=1;}            //...
if ((PINF&0x04)==0x00){i=2;}
if ((PINF&0x08)==0x00){i=3;}
if ((PINF&0x10)==0x00){i=4;}

if ((i!=5)&&(j!=3))
{                        //Если была нажата клавиша

    PORTD = (key_code[i][j]);        //Пишем ее код на ЖКИ
}
else PORTD = 0b11111111;

TCNT0=0x00;                //Очищаем счетчик
TIFR=0x00;              //Очищаем флаг переполнения







    TCNT0=0x00; //Очищаем счетчик
    TIFR=0x00;              //Очищаем флаг переполнения


    return;
}


//Основная программа
int main(void)
{
    DDRD=0xFF; //Инициируем PortD
    PORTD=0xFF;

    pause(1000); //Задержка для включения ЖКИ
    init_timer(); //Инициализация нулевого таймера


    sei(); //Глобальное разрешение прерывани
    while(1); //Вечный цикл
    return 1;
} 
Yarikkasl вне форума  
Непрочитано 04.09.2020, 13:07  
Yarikkasl
Частый гость
 
Регистрация: 11.03.2019
Сообщений: 26
Сказал спасибо: 6
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Yarikkasl на пути к лучшему
По умолчанию Re: Динамическая клавиатура.

Else, что бы при отжатии индикация гасла, считывание происходит по таймеру. Про ISR незнаю нечего.нашел на форуме и взял себе так что сжигать пока ненадо.
Yarikkasl вне форума  
Непрочитано 04.09.2020, 13:12  
baiderin
Почётный гражданин KAZUS.RUN
 
Аватар для baiderin
 
Регистрация: 10.12.2007
Адрес: Екатеринбург
Сообщений: 2,739
Сказал спасибо: 2,487
Сказали Спасибо 897 раз(а) в 584 сообщении(ях)
baiderin на пути к лучшему
По умолчанию Re: Динамическая клавиатура.

Сжигать за применение задержек в прерывании.
baiderin вне форума  
Непрочитано 04.09.2020, 13:41  
NewWriter
Почётный гражданин KAZUS.RUN
 
Аватар для NewWriter
 
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,481
Сказал спасибо: 396
Сказали Спасибо 2,222 раз(а) в 1,317 сообщении(ях)
NewWriter на пути к лучшему
По умолчанию Re: Динамическая клавиатура.

Чтобы динамическая матричная клавиатура вообще работала верно, нужно в прерывании таймера выполнять сканирование столбцов и считывание строк, то есть последовательно прогонять по каждому выходу лог.0 (при этом на остальных выходах лог.1 или лучше Hi-Z) и проверять все входы на наличие где-то там лог.0 (при условии, что все входы подтянуты к VCC).
NewWriter вне форума  
 

Метки
atmega128, atmel studio, прерывания
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Клавиатура Mera-REFA KL-13 теряет 1 бит при передачи в Arduino AVRkin Микроконтроллеры, АЦП, память и т.д 10 20.02.2018 06:10
Старая клавиатура для "486", типа AT Cahes2 Ремонт оргтехники 25 31.01.2014 16:48
iPod Mini A1051. Не работает клавиатура spacebrother Поиск схем. Делимся схемами 0 17.02.2012 06:37
Не матричная клавиатура для МП alexplev Микроконтроллеры, АЦП, память и т.д 8 22.02.2009 03:16
Динамическая индикация,вопрос Zemlyanov Микроконтроллеры, АЦП, память и т.д 29 05.08.2008 19:13


Часовой пояс GMT +4, время: 20:49.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.