Пятница, 26.04.2024, 04:38
Микроконтроллерная техника AVR
Главная Регистрация Вход
Приветствую Вас, Гость · RSS
Меню сайта
Помоги сайту
Поддержи наш сайт
Через WebMoney
U222865683087
R391933670808
Z877043628365
E649133782052

или пополни нашу SMS копилку
SMS.копилка

Ссылки

 Каталог статей
Главная » Статьи » Учимся работать с AVR

Подсчет тактов синуса ATmega8
Тактовая частота AVR 8MHz


Code

#include <mega8.h>

unsigned char led_table[10]={0x40,0x[u]79,0x24,0x30,0x19,0x12,2,0x78,0,0x10};
unsigned int num_show=0; //Число для отображения на табло
unsigned char sn=0; //Отображаемый разряд 0-3
unsigned int fr_count=0; //Число подсчитанных тактов
unsigned int fr_counter=0; //Счетчик тактов
unsigned char vup=0; //Если уровень поднимается то 1
unsigned char lv=0; //Предыдущее значение ADC

void segs_show() { //Процедура отображения разрядов
if (sn==0) num_show=fr_count; //Если первый разряд обновляем число
PORTD=0; //Не чего не показываем
PORTB=led_table[num_show%10]; //Высчитываем разряд и берем из таблицы значение для сигмента
PORTD=1<<sn; //Отображаем разряд
sn++; //Следующий разряд
if (sn>3) sn=0; //Разрядов 4 значит значение не должно быть более 3
num_show/=10; //Смещаем на 1 разряд влево
}

interrupt [TIM1_COMPA] void timer1_compa_isr(void) { //Прерывание сравнения Таймера1, вызывается 1 раз в секунду
TCNT1H=0x00; //Обнуляем счетчик таймера
TCNT1L=0x00;
fr_count=fr_counter; //Берем подсчитанные такты
fr_counter=0; //Обнуляем счетчик
}

interrupt [ADC_INT] void adc_isr(void) { //Прерывание ADC
if (ADCH>lv&vup==0) vup=1; //Если уровень идет вверх
if (ADCH<lv&vup!=0) {vup=0;fr_counter++;} //Если уровень идет вниз, прибавляем такт
lv=ADCH; //Сохраняем значение ADC
ADCSRA|=0x40; //Запускаем ADC
}

void main(void) { //Главная процедура
DDRB=0x7f; //Порт B биты 0-6 выходы
DDRD=0x0f; //Порт D биты 0-3 выходы
TCCR1B=0x05; //Таймер1 частота 7.813KHz Mode Normal Top=0xffff
OCR1AH=0x1e; //Старший байт сравнения
OCR1AL=0x85; //Младший байт сравнения
TIMSK=0x10; //Разрешаем прерывание для Таймера1
ADMUX=0x60; //Выбираем 0 бит порта C для ADC, разрядность ADC 8 бит и опорное напряжение от AVCC
ADCSRA=0x89; //Разрешаем ADC, устанавливаем частоту 1MHz
#asm("sei") //Разрешаем прерывания
ADCSRA|=0x40; //Запускаем ADC
while (1) segs_show(); //Цикл отображения разрядов
}
Категория: Учимся работать с AVR | Добавил: HiSER (05.01.2010) | Автор: Литвин Артём
Просмотров: 9329 | Комментарии: 4 | Рейтинг: 0.0/0 |
Всего комментариев: 4
3 Gena  
0
Это получается имп/мин,... а если требуется прерывание от внешнего источника - имп/об - это сложно?

4 HiSER  
0
имп/сек здесь. в принципе нет. а что в оконцовке вы хотите получить?

1 Upgrader  
0
А описание, как работает, зачем оно вообще надо? Пишите пожалуйста хоть пару строк описания практического применения.

2 HiSER  
0
На практике пока еще не проверил, но расчет был на применение как тахометр, спидометр и тд...

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Copyright My-AVR © 2024
Наша кнопка
У нас появилась кнопка, код кнопки:

Лаборатория самоделок на микроконтроллерах AVR

Форма входа
Наш опрос
Какой МК вы используете?
Всего ответов: 3228
Статистика/Друзья
CY-PR.com



Онлайн всего: 1
Гостей: 1
Пользователей: 0

РадиоКОТ - популярно об электронике. Авторские схемы, новые разработки. Обучение по электронике, микроконтроллерам, ПЛИС. Форум Сайт по радиоэлектронике. У нас все просто и интересно… ARV Reserch: Электроника — просто, полезно, увлекательно. Электронные устройства и программные средства для радиолюбителей и профессионалов, только авторские разработки, плагиата нет! Разработки на заказ. AVR projects Создание электронных роботов своими руками Схемы и программы на AVR http://ur5yfv.ucoz.ua/BANNER.gif Блог начинающего эмбеддера. Дай волю паяльнику! Самоделки на all-make.ru Принципиальные схемы Модулі автозапуску бензогенератора та системи АВР, електромонтажні роботи
Хостинг от uCoz