Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

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.RU
 
Регистрация: 30.09.2006
Сообщений: 1,560
Сказал спасибо: 158
Сказали Спасибо 661 раз(а) в 431 сообщении(ях)
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.RU
 
Регистрация: 15.11.2010
Сообщений: 2,378
Сказал спасибо: 338
Сказали Спасибо 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.RU
 
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 6,801
Сказал спасибо: 2,913
Сказали Спасибо 3,122 раз(а) в 2,112 сообщении(ях)
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;i0;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.RU
 
Аватар для baiderin
 
Регистрация: 10.12.2007
Адрес: Екатеринбург
Сообщений: 2,727
Сказал спасибо: 2,418
Сказали Спасибо 894 раз(а) в 581 сообщении(ях)
baiderin на пути к лучшему
По умолчанию Re: Динамическая клавиатура.

Сжигать за применение задержек в прерывании.
baiderin вне форума  
Непрочитано 04.09.2020, 13:41  
NewWriter
Почётный гражданин KAZUS.RU
 
Аватар для NewWriter
 
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,509
Сказал спасибо: 401
Сказали Спасибо 2,218 раз(а) в 1,316 сообщении(ях)
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, время: 02:12.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot