Atmega8,работа с прерываниями и таймерами

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Встал на лапы
Аватара пользователя
Сообщения: 123
Зарегистрирован: Сб ноя 18, 2006 17:14:15

Сообщение boobonick »

Здравствуйте,подскажите пожалуйста, только учусь, не могу понять алгоритм работы с таймером и прерыванием. Вот мои мысли:

1.Выбираем время переполнения Timer0.

2.Если таймер переполнен,то происходит прерывание функции main() и переход на функцию timer_ovf.

3.Установка нулевого уровня на PORTB.

Как происходит выход из прерывания?А после PORTB=0x00 должен быть переход в главную функцию?


#include<mega8>

interrupt[TIM0_OVF] void timer_ovf(void)
{
PORTB=0x00;

}
main(){
while(1){
DDRB=0xFF;
PORTB=0xFF;
TIMSK = 0b00000001; //Разрешить прерывание при переполнении //TOIEI1
TCCR0 = 0b00000101; //делим на 1024

#asm("sei");
}
}
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18786
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

прежде всего - что вы хотите получить? ну выставился 0 на порту у вас по прерыванию - и что дальше?

в основном цикле у вас инициализация таймера не нужна, вынесите ее за пределы цикла в начало main, а вот PORTB=0xFF - это вы что хотели этим сделать? в общем, в том виде, как сейчас у вас получится через промежутки переполнения таймера на порту очень-очень коротенькие импульсы нулевого уровня на фоне постоянной единицы...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 123
Зарегистрирован: Сб ноя 18, 2006 17:14:15

Сообщение boobonick »

Спасибо за информацию, кажется я не добавил #asm("cli"), чтобы выйти из прерывания и еще delay_ms в главную функцию, чтобы можно было лицезреть это все с задержкой.... и получилось. Мигает)
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18786
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

boobonick писал(а):Спасибо за информацию, кажется я не добавил #asm("cli"), чтобы выйти из прерывания и еще delay_ms в главную функцию, чтобы можно было лицезреть это все с задержкой.... и получилось. Мигает)
чтобы выйти из прерывания вам ничего добавлять не надо было. а чтобы мигало по-человечески, надо было сделать так:

Код: Выделить всё

#include<mega8> 
interrupt[TIM0_OVF] void timer_ovf(void){ 
   PORTB ^=0xFF; 
}
 
main(){ 
   DDRB=0xFF; 
   TIMSK = 0b00000001; //Разрешить прерывание при переполнении //TOIEI1 
   TCCR0 = 0b00000101; //делим на 1024 
   #asm("sei"); 
   while(1); 
} 
разберетесь, почему так? ;)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Встал на лапы
Аватара пользователя
Сообщения: 123
Зарегистрирован: Сб ноя 18, 2006 17:14:15

Сообщение boobonick »

:) Понятно. А вот если мы хотим реализовать длинный отчет времени (как пример -часы), чем лучше пользоваться таймерами МК(и возможно ли это) или программными средствами (циклы)?
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18786
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

boobonick писал(а)::) Понятно. А вот если мы хотим реализовать длинный отчет времени (как пример -часы), чем лучше пользоваться таймерами МК(и возможно ли это) или программными средствами (циклы)?
про "часы" как прибор измерения времени - это вы смотрите в сторону либо спецмикросхем, либо таймера 2 с асинхронным режимом... а если речь просто о выдержках интервалов "в часах" - можно и так и эдак, хотя по таймеру будет конечно гораздо точнее получаться, чем программно.
например:

Код: Выделить всё

#include<mega8> 
interrupt[TIM0_OVF] void timer_ovf(void){ 
   static int counter = 1000;
   if(!--counter){
      PORTB ^=0xFF; 
      counter = 1000;
   }
} 
  
main(){ 
   DDRB=0xFF; 
   TIMSK = 0b00000001; //Разрешить прерывание при переполнении //TOIEI1 
   TCCR0 = 0b00000101; //делим на 1024 
   #asm("sei"); 
   while(1); 
}
простой пример "замедления" в 1000 раз вашего "мигания" :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 123
Зарегистрирован: Сб ноя 18, 2006 17:14:15

Сообщение boobonick »

Спасибо! :)))
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»