Jump to content
Sign in to follow this  
Rockman

Работа С Таймерами На Атмега 8

Recommended Posts

Доброго времени суток, решил начать потихоньку осваивать МК, т.к схемы собранные на рассыпухи не отличаются высокой точностью и стабильностью. Начал ставить задачи по этапно - моргание светодиодом -> моргание светодиодом после нажатия на кнопку - > моргание светодиодом при нажатии на кнопку в течении 40 секунд-> всё остальное что может делать МК в течении этих 40 сек.

На данном моменте застрял на 3-ем этапе, никак не могу разобраться как прикрутить работу таймера к своему коду, листинг прилагаю (1- программа моргания светодиодом 3 раза, после нажатия на кнопку, 2 - изыскания на тему таймера):

#include <mega8.h>
#include <delay.h>
#include <interrupt.h>
#include <io.h>
#define PD2 2 // Переобозначение 2 пина порта D на его имя.

void main(void)
{
PORTD = 0b10000000; // Подключаем подтягивающий PULL-UP резистор к 2 пину порта D.
DDRD = 0b00000000; // Настроим порт D на ввод информации.
DDRB = 0b11111111; //Настроим порт D на вывод информации.
while(1) // Бесконечный цикл опроса кнопок.
{	
 if (PIND &= 1<<PD2) // Считываем 2 пин порта D.
 {
	 PORTB =0b00000000; // Если 1 (кнопка не нажата), то гасим светодиод.
 }
 else	
 {
 PORTB = 0b00000001; // Если 0 (т. е. кнопка нажата), то зажигаем светодиод.
 delay_ms(500);
 PORTB = 0x00000000;
 delay_ms(500);
 PORTB = 0x00000001;
 delay_ms(500);
 PORTB = 0x00000000;
 delay_ms(500);
 PORTB = 0x00000001;
 }

а теперь таймер:

#include <mega8.h>
#define s;
int s; // переменная для хранения секунд

// Обработка прерывания по совпадению
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
s++; // увеличиваем переменную каждую секунду
if(s>59) // обнуляем секунды после 59
{
 s=0;
}
TCNT1=0; //обнуляем таймер
}

void main(void)
{

TCCR1A=0x00; //настройка таймера
TCCR1B=0x05;
TCNT1=0x00; //здесь увеличиваются тики
OCR1A=0x1E85; //записываем число в регистр сравнения

TIMSK=0x10; //запускаем таймер
}

Share this post


Link to post
Share on other sites


#include <mega8.h>
#include <delay.h>
#include <interrupt.h>
#include <io.h>
#include <stdbool.h> // для работы с буллевыми числами

#define PD2 2 // Переобозначение 2 пина порта D на его имя.

//#define s; // не нужно
int s; // переменная для хранения секунд

bool button=0; // индикатор кнопки. Принимает значение 1, когда кнопка была нажата, и значение 0 после завершения задачи.


// Обработка прерывания по совпадению
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
s++; // увеличиваем переменную каждую секунду

// не нужно просто так обнулять секунды. Они наш счетчик, будем их обнулять по событию.
//if(s>59) // обнуляем секунды после 59
//{
// s=0;
//}
TCNT1=0; //обнуляем таймер
}


void main(void)
{
PORTD = 0b10000000; // Подключаем подтягивающий PULL-UP резистор к 2 пину порта D.
DDRD = 0b00000000; // Настроим порт D на ввод информации.

DDRB = 0b11111111; //Настроим порт В на вывод информации.

TCCR1A=0x00; //настройка таймера
TCCR1B=0x05;
TCNT1=0x00; //здесь увеличиваются тики
OCR1A=0x1E85; //записываем число в регистр сравнения

TIMSK=0x10; //запускаем таймер

while(1) // Бесконечный цикл опроса кнопок.
{
if (PIND &= 1<<PD2) // Считываем 2 пин порта D.
{
//PORTB =0b00000000; // Если 1 (кнопка не нажата), то гасим светодиод.
}
else // кнопка нажата
{
button=1; // кнопка была нажата, теперь можно отпустить.
s=0; // обнуляем счетчик секунд, начинаем отсчет 40 сек.

}

if ((button==1) // если кнопка была нажата
{
while (s<40) // пока не прошло 40 секунд
{
PORTB = 0b00000001; // Если 0 (т. е. кнопка нажата), то зажигаем светодиод.
delay_ms(500);
PORTB = 0x00000000;
delay_ms(500);
}
button=0; // 40 секунд прошло, обнуляем индикатор кнопки. Кнопку можно нажимать еще раз.
}
}
}

Edited by dead_rat

Share this post


Link to post
Share on other sites

как я понял автор хотел полностью отказаться от delay при использовании таймера. Организовать отсчет и мигание на одном таймере...

Share this post


Link to post
Share on other sites

Литиевые батарейки Fanso для систем телеметрии и дистанционного контроля

Системы телеметрии находят все более широкое применение во многих отраслях на промышленных и коммунальных объектах. Требования, предъявляемые к условиям эксплуатации приборов телеметрии и, как следствие, источников питания для них, могут быть довольно жесткими. Fanso предоставляет широкую линейку продукции, рассчитанной на различные условия эксплуатации, что позволяет подобрать батарейку для каждого конкретного применения, в том числе и для устройств телеметрии.

Подробнее

Таймер можно настроить в режим "Сброс по совпадению" (CTC). Тогда и счетный регистр сбрасывать не придется (TCNT1=0).

Share this post


Link to post
Share on other sites
                     

Приглашаем на вебинар Решения для построения ультразвуковых счетчиков жидкостей и газов на базе MSP430

Компэл совместно с Texas Instruments 23 октября 2019 приглашают на вебинар, посвященный системам-на-кристалле для построения ультразвуковых расходомеров жидкостей и газов на базе ядра MSP430. Вебинар проводит Йоханн Ципперер – эксперт по ультразвуковым технологиям, непосредственно участвовавший в создании данного решения. На вебинаре компания Texas Instruments представит однокристальное решение, позволяющее создавать точные недорогие счетчики жидкостей и газов.

Подробнее...

В 15.01.2016 в 12:12, dead_rat сказал:

Автор просто скопировал код таймера с другого сайта.

К сожалению, я не понял его задумки до конца.

Что непонятно? Есть два кода. Автор хочет из двух сделать одну программу. Из первой по условию или по прерыванию вызывать вторую.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
Sign in to follow this  

  • Similar Content

    • By n_angelo
      Привет, знатоки. Написал свою первую программу для контроллера STM8L152C6T6 (STM8L-Discovery). Это, собственно, моя первая программа для контроллеров вообще. Я многого не знаю и не понимаю. Возможно ваш ответ на мой вопрос будет банален.
      Используемая периферия: DAC, DMA, TIM4, CLK, GPIO
      Задача у программы такая:
      В EEPROM зашит один период синусоиды с дискретизацией 44100Гц. Период занимает ровно 101 байт, что по сути должно быть равно 2,29мс (1/44100*101). В коде программы только конфигурация периферии, одно прерывание на кнопке и пустой бесконечный цикл, который ничего не делает. Всю работу выполняет таймер, который настроен выдавать запрос к DMA на каждые 1/44100 (ядро тактируется 2мГц, таймер считает до 45). В свою очередь DMA забирает из EEPROM по одному байту на каждый запрос от таймера и передаёт его в DAC. Далее DAC выводит бесконечную синусоиду на ногу PF0. Прерывание на кнопке запускает весь этот механизм и зажигает светодиод.
      Проблема:
      Измеряя ногу PF0 осциллографом было замечено, что период синусоиды занимает около ≈4мс. Фото под катом.
      Меня это расстроило. Экспериментально выяснилось, что стоит только вписать в бесконечный цикл какую-нибудь проверку, например, [если значение текущего байта синусоиды = 0xFF, то зажечь светодиод, если 0x00, то потушить], то осциллограф показывает правильный тайминг в 2(с копейками)мс. В принципе в теле цикла может быть что угодно, кроме пустоты, и тайминг налаживается.
      Я не могу отдебажить дизассемблер, т.к. его не знаю. Это у меня в планах. Но я очень хочу понять, что происходит и почему пустой цикл рушит тайминг.
      Спасибо.
       
       
       
       
    • By Misereli
      Здравствуйте.
      Хочу сделать свою клавиатуру на микроконтроллере Atmel (например, ATmega8).
      Знаю несколько видов схем: матричная клавиатура и резистивная.
      Реализация матричной клавиатуры требует использования большого количества ног на микроконтроллере .
      Реализация резистивной (в зависимости от напряжения, АЦП определяет какая нажата кнопка) не позволит зажимать сразу несколько клавиш. 

      На форумах "клаводелов" нашел интересную плату (satan gh60), на основе которой собирают клавиатуру. Она работает на atmega32u4, на плате распаяно множество резисторов. Несколько нажатий поддерживает.


      Если кто-то поделится мыслями как она работает, буду очень благодарен, т.к. самому мозгов не хватает 
      Об использовании специализированных МК прошу не упоминать, интересно сделать на ATmega.
       
    • By shuks
      Добрый день!
      От товарища поступила просьба собрать на ардуино (либо изготовить плату на avr) детектор короткого замыкания.
      Есть у него на производстве ряд БП 12в 2квт и десяток потребителей на каждом, таких блоков порядка сотни, и поступила "хотелка" навесить на каждый БП ардуину (питание будет отдельное независимое) которая будет посылать по wifi уведомление когда будет возникать КЗ в блоке/потребителе (важна возможность определения именно КЗ).
      Опыта нет, первое что пришло в голову это:
      1) мониторить потерю напряжения 12в на БП (при КЗ блок уходит в защиту)
      2) при потере напряжения 12в подавать напряжение 3.3в от питания МК с управлением через ключ от ножки МК на "+" питания БП и переход на пп.3
      3) ноль от БП подключить к АЦП МК и замерять: если 0в то все норм и КЗ нет (поломка блока без КЗ либо отключение от сети 220в), если на АЦП будет 3.3в то имеем КЗ и отправляем уведомление.
      Т.к. опыта схемотехники почти нет, прошу помощи по схеме в даже в мелочах
       
    • By IgnatiusF
      Взял с места практики отладочную плату с атмегой 32-й, дома понял (возможно), что микроконтроллер заблокирован.
      Пытался шить через USBASP при помощи AVRDUDE, однако ошибка:
      avrdude.exe: error: programm enable: target doesn't answer. 1 avrdude.exe: initialization failed, rc=-1 Double check connections and try again, or use -F to override this check. В правильности и надежности подключения полностью уверен, проверил каждый контакт и каждый элемент на всей плате тестером. Кстати, вот она:
      У меня точно такая же, только с Atmega32A.
      Попробовал поставить на нее дрова, но теперь она определяется вот так: Неизвестное USB-устройство (сбой дескриптора устройства).
      Из этой статьи по решению данной проблемы выполнил все указания, однако ничего не сработало.
      Тут я подумал на отключенный rst выход, так как был опыт из-за путаницы с обратными и прямыми фьюзами на Attiny13A. Тогда быстренько все исправил высоковольнтным программатором из этой статьи, вот и подумал сделать здесь подобное. Немного (чуть больше) полазив в интернете нашел вот такую схему на arduino. Все есть, чтобы ее сделать, только сперва понять бы, можно или нет без выпаивания это делать. И еще понять бы, в этом ли настоящая проблема? Или может я что-то не то надумал?
      Надеюсь на вашу помощь
    • By Trute
      Цена 650р.
       Продаётся Плата в Сборе с Прошитым Микроконтроллером.
      ОПИСАНИЕ.
      Это устройство запитывается от любого источника питания 5 вольт, например, USB порт ПК или ноутбука, зарядка для телефона и т. п..., и не нуждается в подключении к источнику 12 вольт, в отличии от других прототипов.
      Предназначено для восстановления "убитых" микроконтроллеров AVR ATmega и ATtiny путем записи в них корректных значений бит фьюзов.
      Atmega Fusebit Doctor исправит Ваши брикнутые микроконтроллеры за доли секунды.
      Поддерживаемые контроллеры:
       



  • Сообщения

    • Микросхемы шифратора/дешифратора тоже будешь своими руками делать ?  Или на логике/рассыпухе, а ещё для пущей самодельности на селективных контурах будешь делать?
    • Молодец, что начал сам. Тебе повезло, что  полез тогда именно в свой собственный аппарат, а не на наш форум, за помощью, где тебя  послали  в школу на уроки по физике,  отправили бы читать книгу Борисова,  заставили бы срисовать плату,  запросили бы 100 долларов, а в итоге призвали бы не ломать аппарат и обратиться к мастеру, потому что  знаний у тебя ровно ноль.
    • Микросхема "новая" вообще может левак, перемаркировка. Вообще то схема на эту мс есть в даташите и можно было с ней разбираться. Но управление конечно идет с процессора и надо смотреть питания и не греется ли она.
    • Марка Вольтметр В7-27А/1 Страна производитель СССР Год выпуска 1981 Состояние техническое, неисправный показывает перегрузку или набор чисел, внутри все на месте, есть пару замененных электролитических конденсаторов. Как достался так и продаю! Косметика на 4 отсутствует заглушка на верхней крышке есть потертости на корпусе. Комплект сам прибор могу в довесок кинуть различных кабелей, если это вам нужно конечно. Цена по сути металла. 6500 рублей Если есть вопросы все в ЛС и по существу, или на почту istomindimavolga@mail.ru Отправлю ТК выгоднее будет Энергия или ПЭК 400-600 рублей примерно. Можно и почтой но из-за веса может выйти дорого, могу рассчитать предметно! Оплата на карту СБ.  
    • Подозреваю что что то не ладное вот с этой микросхемой aci7210ee909-01.Это блютуз ,радио,мульти медио и управление стерео усилителем.
    • Посмотри вот это реле давления https://akvabak.ru/product/beziskrovoe-rele-davleniya-brd-10m-2-5/ Помимо кучи полезных вещей, там есть и ограничение частоты включений и индикация неисправности ГА как раз по времени наполнения. Меня смущает только цена и электронный датчик давления. Механический надежнее )
    • SamVal   все отлично , сделано и сказано.
  • Покупай!

×
×
  • Create New...