Вот кусок кода, здесь опрос кнопок находится в обработчике прерывания, переменная keyscanD передает состояние кнопок в основной цикл программы, а регистр keyledD передает состояние светодиодов из основного цикла программы. Все делается через маску, чтобы не нарушать конфигурацию остальных пинов порта.
...
in r16, DDRD
andi r16, 0b11000111 ; подключены кнопки на 3-5 пины, их и проверяем
out DDRD, r16
in r16, PORTD
ori r16, 0b00111000
out PORTD, r16
in r16, PIND
std keyscanD, r16 ; Сохраним скан-байт PORTD
in r16, DDRD
or r16, keyledD
out DDRD, r16
in r16, PORTD
andi r16, 0b11000111
out PORTD, r16
...
Да, забыл сказать, на эти же пины 3-5 подключены светодиоды катодом к пинам, кнопки подключены к массе, минус такого подключения в том, что при нажатии кнопок будут зажигаться светодиоды, а может в каких то случаях и плюс, но можно этого избежать, если пожертвовать одним пином проца.
собрал "таймер с колесиком" http://radiokot.ru/circuit/digital/home/59/
Работает, но с частотой в 2а раза больше, чем в оригинале. программировал в CVAVR. Фьюзы поставил в 0 (т.е. галочки), те которые писал автор - "Включенные фьюзы: CKSEL0, CKSEL1, SUT1, CKDIV8. "
Кварц на 4МГц, емкости по 18 пик.
Что может быть? Первый раз атмел шью, как разобраться?
Чудеса конечно случаются, но не в этом случае. Проверяйте фьюзы, номиналы деталей... Можете отключить кварц, чтобы убедиться в том, что МК действительно тактируется от кварца...
edm2007 писал(а):Чудеса конечно случаются, но не в этом случае. Проверяйте фьюзы, номиналы деталей... Можете отключить кварц, чтобы убедиться в том, что МК действительно тактируется от кварца...
Только CKSEL3..0 - 1100 SUT1..0 - 01 - это керамический резонатор.
Спс, буду рыть. Мне тоже показалось, что в фьюзах минимум одна ошибка. Жаль, что комментарии к статье нельзя писать. С другой стороны, четыре кота написали, что схема "пошла сразу".
Попробовал отключить кварц. Работает по прежнему, в 2а раза быстрее. Получается , остались заводские фьюзы, 8МГц/8= 1 Мгц тактовой, по схеме должно быть 4МГц/8= 0.5 МГц. Получается программатор не прошил фьюзы. Кстати, программатор ВМ9010 мастеркитовский. После первой прошивки CVAVR не видит чип, бьет ошибку. Может , есть способ его "заставить"?
Ну если МК работает и без кварца, то понятное дело на внутреннем генераторе молотит. Ошибка какая? У программатора есть возможность включить пониженную частоту SCK?
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
#include <avr/io.h>
#include <avr/iotn2313.h>
#include <avr/interrupt.h>//Библиотека прерываний
//Перечисляем прототипы функций
ISR (USART_RX_vect);
void USART_Init( unsigned int baudrate ); //Функция инициализации модуля USART
unsigned char USART_Receive( void ); //Функция приема данных по протоколу USART
void USART_Transmit( unsigned char data ); //Функция передачи данных по протоколу USART
//Подпрограмма обработки прерывания
ISR (USART_RX_vect)
{
PORTB = 0b0000000;
unsigned char b;
b = UDR;
//b = USART_Receive();
// Выполняем обработку принятого байта
if (b==0xAA)//Если приняли "1"
{
USART_Transmit(b);//Отправляем букву
//PORTB = 0b1111111;
}
}
int main(void) //Главная функция
{
cli();
USART_Init( 51 ); //Скорость соединения 19200 бит/с для микроконтроллера ATtiny2313
unsigned char komanda;
DDRB = 0xff;
PORTB = 0b1111111;
sei();//разрешаем глобально прерывания
for (;;) //Вечный цикл
{
komanda = USART_Receive();
// USART_Transmit(komanda);
if (komanda == 0xAF)
{
USART_Transmit(0xBB);
USART_Transmit(0xFF);
PORTB = 0b0000000;
}
if (komanda == 'q')
{
USART_Transmit(0xDD);
PORTB = 0b1111111;
}
}
}
void USART_Init( unsigned int baudrate ) //Функция инициализации USART
{
UBRRH = (unsigned char) (baudrate>>8);
UBRRL = (unsigned char) baudrate;
UCSRA = ( 1<<U2X); //Устанавливаем удвоение скорости
UCSRB = (( 1<<RXEN)|(1<<TXEN)); //Разрешение на прием и на передачу через USART
UCSRC = (1<<USBS)|(3<<UCSZ0);
}
unsigned char USART_Receive( void ) //Функция приема данных
{
while (!(UCSRA & (1<<RXC))); //Ожидание приема символа
return UDR; //Возврат содержимого буфера приема символа
}
void USART_Transmit( unsigned char data ) //Функция отправки данных
{
while (!(UCSRA & (1<<UDRE)) ); //Ожидание опустошения буфера приема
UDR = data; //Начало передачи данных
}
в функции main в цикле for(;;) по приходу байтов все условия срабатывают, а функция прерывания ISR (USART_RX_vect) не срабатывает в чем дело не пойму неделю парюсь ответа не могу найти
я прошил attiny2313 кхазамой, и выставил фюзы наоборот как на картинке(инверсно) и она теперь не отзывается, кварц есть, что делать, а фюза spmen.я в казаме не нашел
То что тактирование было выставлено инверсно - не страшно. CKSEL3..0 - 0010 это внутренний тактовый генератор на 4 МГц. А вот зашитый RSTDISBL не сулит ничего хорошего, вывод RESET теперь работает как еще один вывод порта. МК теперь недоступен для последовательного программирования по SPI, так как вывод RESET как раз для программирования и нужен.
SPIEN (а не spein, SPI ENable) Вы бы и не смогли изменить, он при последовательном программировании недоступен.
vas455 писал(а):выставил фюзы наоборот как на картинке(инверсно)
Из этой фразы я понял, что Вы полностью все фьюзы скопировали в Khazama. Видимо, неправильно понял. То бишь вы инвертировали значения фьюзов, и только потом выставили в Khazama? Тогда это внешний кварц 3.0 - 8.0 С ним все работать должно.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
ты правильно понял кварц 3-8 , но с ним не работает, попробывал выстпвить в алгоритм билдер (а там фьюзы ставятся также как и в кхазаме) он тоже показывает 3.00-8
Нет таких вещей, которые нельзя было бы доказать, но есть люди, которым ничего нельзя доказать.
У кого-нить есть рабочий исходник на С для ATTiny2313? С комментариями и строкой установки фузов.
Хочу проверить линии портов PD6 и PD0, передав на них состояние. Например, из PD4.
Работать собираюсь в AVR Studio 4.19.
Нашел описание ATTiny2313, на русском: http://c2.at.ua/3m/F_arx/attiny2313_dok ... olnaja.pdf