Только не забудь что регистр 8 битный и максимум может натикать 255.
Как вариант можно добавить еще один регистр и в прерывании после переполнения инкрементировать. Или предделитель увеличить
Только не забудь что регистр 8 битный и максимум может натикать 255.
Как вариант можно добавить еще один регистр и в прерывании после переполнения инкрементировать. Или предделитель увеличить
а я то думаю что за...
можете помочь? нужно ну очень быстро заполнять восемь регистров 74hc595.. варианты скоростного shiftOut нашел, latch тоже напрямую в порт пишу, а вот с таймером засада.
Ваш пример не хочет работать..
#include <avr/interrupt.h>
#include <avr/io.h>
//таймер
//#define FQ 5000 //установка частоты обновления в Гц
volatile unsigned int tcnt2; //timer freq
//74hc595 wiring
//Pin connected to ST_CP of 74HC595
int _latch = 8;
//Pin connected to SH_CP of 74HC595
int _clock = 12;
////Pin connected to DS of 74HC595
int _data = 11;
byte registers[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
//настройки при запуске
void setup() {
//timer setup
TIMSK2 &= ~(1<<TOIE2); //разрешения прерывания по переполнению таймера/счетчика Т2
TCCR2A &= ~((1<<WGM21) | (1<<WGM20));// Режим работы таймера/счетчика
TCCR2B &= ~(1<<WGM22);// Режим работы таймера/счетчика
ASSR &= ~(1<<AS2); //Выбор источника синхронизации таймера если AS2=0 от системного генератора
tcnt2 = 1; // 16000000/64/f=tcnt2
TIMSK2 |= (1<<TOIE2);//Разрешение прерывания по переполнению Т2.
//установка портов
pinMode(_latch, OUTPUT);
digitalWrite(_latch, LOW);
pinMode(_clock, OUTPUT);
digitalWrite(_clock, LOW);
pinMode(_data, OUTPUT);
digitalWrite(_data, LOW);
}
//цикл главной программы
void loop() {
}
//процедура динамической индикации
void timer2() {
if (registers[0]==0x01) registers[0]=0x00;
else registers[0]=0x01;
digitalWrite(_latch, LOW);
shiftOut(_data, _clock, MSBFIRST, registers[7]);
shiftOut(_data, _clock, MSBFIRST, registers[6]);
shiftOut(_data, _clock, MSBFIRST, registers[5]);
shiftOut(_data, _clock, MSBFIRST, registers[4]);
shiftOut(_data, _clock, MSBFIRST, registers[3]);
shiftOut(_data, _clock, MSBFIRST, registers[2]);
shiftOut(_data, _clock, MSBFIRST, registers[1]);
shiftOut(_data, _clock, MSBFIRST, registers[0]);
digitalWrite(_latch, HIGH);
}
//обработчик прерывания
ISR(TIMER2_OVF_vect) {
TCNT2 = tcnt2;
timer2();
}
Включается но не выключается, либо скорость настолько высока что пц (при установке в 1).
Как установить частоту 1 гц? просто 1?
Вот так можно
PHP код:
//Выполнение процедуры по прерыванию таймеру.
#include <MsTimer2.h>
static boolean output = HIGH;
void flash_led() //обработчик прерывания
{
digitalWrite(13, (output==HIGH) ? output=LOW : output=HIGH);
}
void setup() {
pinMode(13, HIGH);
MsTimer2::set(1000, flash_led); // 1000ms период
MsTimer2::start(); //включить таймер
}
void loop()
{
//.....
}
Спасибо, наверно так и сделаю. Просто хотелось разобраться именно на уровне МК и его регистров и прочей мутотени.
Читал-читал, далеко не все отложилось в голове. Надо на практике попробовать.
Я шифты поключал к SPI , работает очень быстро и в коде все просто реализуется
А можно ли сделать вот такое: есть прерывание по фронту на спад, когда оно срабатывает, то надо включить таймер на определенный интервал и по его истечению подать коротко временный импульс (логическая 1) на какой-не будь выход?
Можно конечно
да, забыл добавить: после срабатывания таймер должен останавливаться и ждать новой инициализации
Ты бы лучше описал для чего тебе это нужно, возможно что уже давно все написано
Эту тему просматривают: 2 (пользователей: 0 , гостей: 2)