AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
04.09.2020, 09:26
|
|
Частый гость
Регистрация: 11.03.2019
Сообщений: 26
Сказал спасибо: 6
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Динамическая клавиатура.
Здравствуйте, подскажите пожалуйста что не так в моей примитивной программе, в протеусе все прекрасно работает, а вот на железе не как, я уже и камни менял не помогает нечего
Цитата:
|
#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;
}
|
|
|
|
|
04.09.2020, 09:52
|
|
Почётный гражданин KAZUS.RU
Регистрация: 30.09.2006
Сообщений: 1,560
Сказал спасибо: 158
Сказали Спасибо 661 раз(а) в 431 сообщении(ях)
|
Re: Динамическая клавиатура.
протеус не учитывает дребезг контактов
|
|
|
|
04.09.2020, 10:02
|
|
Частый гость
Регистрация: 11.03.2019
Сообщений: 26
Сказал спасибо: 6
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Динамическая клавиатура.
Сообщение от Ara41
|
протеус не учитывает дребезг контактов
|
Это я понимаю, но даже если я просто ставлю перемычку у меня не происходит нечего. На выводах порта D начальное значение которое я задал при настройке
|
|
|
|
04.09.2020, 10:47
|
|
Почётный гражданин KAZUS.RU
Регистрация: 15.11.2010
Сообщений: 2,379
Сказал спасибо: 338
Сказали Спасибо 328 раз(а) в 253 сообщении(ях)
|
Re: Динамическая клавиатура.
Погонять в симуляторе AtmelStudio, если по живому никак. FUSE верно выставлены?
|
|
|
|
04.09.2020, 12:33
|
|
Частый гость
Регистрация: 11.03.2019
Сообщений: 26
Сказал спасибо: 6
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Динамическая клавиатура.
Сообщение от parovoZZ
|
Погонять в симуляторе AtmelStudio, если по живому никак. FUSE верно выставлены?
|
Фьюзы в avrdude_prog я не менял все стоит по умолчанию разве что совместимость со atmega103 убрал. А что касается симуляции в atmelstudio то тут у меня не получается что то
|
|
|
|
04.09.2020, 12:53
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 6,951
Сказал спасибо: 2,994
Сказали Спасибо 3,172 раз(а) в 2,152 сообщении(ях)
|
Re: Динамическая клавиатура.
1. Отредктируй исходное сообщение, обрамив исходник тегами php (они дают наименьшее число артефактов на движке форума).
2. Убрать
Сообщение от Yarikkasl
|
else PORTD = 0b11111111;
|
чтобы данные дольше отображались?
3. За программные задержки в ISR - сжигать надо.
Сообщение от Yarikkasl
|
pause(1); //Задержка для устранения всяких переходных процессов!
|
4. Считывать данные не по таймеру, а по прерыванию pin change?
__________________
Экзорцист 40-го уровня.
|
|
|
|
04.09.2020, 13:03
|
|
Частый гость
Регистрация: 11.03.2019
Сообщений: 26
Сказал спасибо: 6
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
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;
}
|
|
|
|
|
04.09.2020, 13:07
|
|
Частый гость
Регистрация: 11.03.2019
Сообщений: 26
Сказал спасибо: 6
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Динамическая клавиатура.
Else, что бы при отжатии индикация гасла, считывание происходит по таймеру. Про ISR незнаю нечего.нашел на форуме и взял себе так что сжигать пока ненадо.
|
|
|
|
04.09.2020, 13:12
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.12.2007
Адрес: Екатеринбург
Сообщений: 2,727
Сказал спасибо: 2,428
Сказали Спасибо 893 раз(а) в 580 сообщении(ях)
|
Re: Динамическая клавиатура.
Сжигать за применение задержек в прерывании.
|
|
|
|
04.09.2020, 13:41
|
|
Заблокирован
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,220 раз(а) в 1,319 сообщении(ях)
|
Re: Динамическая клавиатура.
Чтобы динамическая матричная клавиатура вообще работала верно, нужно в прерывании таймера выполнять сканирование столбцов и считывание строк, то есть последовательно прогонять по каждому выходу лог.0 (при этом на остальных выходах лог.1 или лучше Hi-Z) и проверять все входы на наличие где-то там лог.0 (при условии, что все входы подтянуты к VCC).
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 20:15.
|
|