Страница 1 из 1

Помогите с таймером на atmega8

Добавлено: Сб окт 11, 2014 13:19:43
sirha
Никак не могу разобраться с таймером
пытаюсь разобраться с самым простым переполнением но ничего непонимаю :(

Тактовая частота микроконтроллера Fcpu = 8000000 Гц
Период тактового сигнала микроконтроллера Tcpu = 1/Fcpu
Период тактового сигнала таймера Т0 равен Tt0 = (1/Fcpu)/k = k/Fcpu

это я понил,все посчитал но ничего не получается

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

#include <mega8.h>
#include <delay.h>

 interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{


    PORTD.0=0;
    
  TCNT1H=0xE1;
TCNT1L=0x7C;
}

void main(void)
{
 
DDRD=0x01;  // как выход

TIMSK=0x04;
TCCR1A=0x00;
TCCR1B=0x05;
TCNT1H=0xE1;
TCNT1L=0x7C;

 
  #asm("sei")
 
while (1)
{
   PORTD.0=1;
      
      }
      }
посчитал переполнение таймера для 1 секунды

почему в реальности светодиод горит но не тухнет?
еле еле мерцает и горит, как будто мигает очень быстро

где ошибка ?
хочется чтобы светодиод горел 1 сек и тух на 1 секунду
вроде бы все правильно написал

Re: Помогите с таймером на atmega8

Добавлено: Сб окт 11, 2014 14:37:04
Pink-Pank
Зачем тем нафлудил? Тебе же написали в "Таймерах и счетчиках".
Светодиод у тебя тухнет, но потом тут же обратно зажигается циклом while. И происходит это настолько быстро, что ты не успеваешь этого даже заметить.

Re: Помогите с таймером на atmega8

Добавлено: Сб окт 11, 2014 14:41:52
sirha
Pink-Pank писал(а): Светодиод у тебя тухнет, но потом тут же обратно зажигается циклом while. И происходит это настолько быстро, что ты не успеваешь этого даже заметить.
но я же сделал задержку где он тухнет

Re: Помогите с таймером на atmega8

Добавлено: Сб окт 11, 2014 14:44:13
Pink-Pank
Где у тебя там какая задержка? Ты его тушишь в прерывании и тут же возвращаешься в главный цикл, где зажигаешь.

Re: Помогите с таймером на atmega8

Добавлено: Сб окт 11, 2014 14:45:48
sirha
Pink-Pank писал(а):Где у тебя там какая задержка?
TCNT1H=0xE1;
TCNT1L=0x7C;

а это разве не задержка??

я могу написать delay_ms но вреде в прерываниях так писать нельзя

Re: Помогите с таймером на atmega8

Добавлено: Сб окт 11, 2014 14:49:43
Pink-Pank
Это не задержка. Это изменение значения счетчика таймера. У тебя просто таймер будет чаще срабатывать благодаря таким манипуляциям.

В прерываниях так писать можно. Но не нужно. Я бы программистам, которые такое пишут в прерываниях, руки бы отрывал. Но если у тебя кроме диода в камне ничего больше не будет - то можешь и так решить эту проблему. А вообще, правильным вариантом будет кусок кода из твоего поста в "таймерах". заводишь переменную и в прерывании меняешь ее значение на обратное и в нем же отправляешь ее новое значение в порт. а в главном цикле вообще ничего не делаешь. А вообще, можешь и без переменной значение порта менять. ;)

Re: Помогите с таймером на atmega8

Добавлено: Сб окт 11, 2014 14:59:46
sirha
Спасибо огромное :)

Re: Помогите с таймером на atmega8

Добавлено: Сб окт 11, 2014 15:03:43
Pink-Pank
"Спасибо" под моей авой находится! ;)

Re: Помогите с таймером на atmega8

Добавлено: Сб окт 11, 2014 15:16:01
ks0
sirha писал(а):Тактовая частота микроконтроллера Fcpu = 8000000 Гц
Период тактового сигнала микроконтроллера Tcpu = 1/Fcpu
Период тактового сигнала таймера Т0 равен Tt0 = (1/Fcpu)/k = k/Fcpu
Только (1/Fcpu)*k если k целое

Re: Помогите с таймером на atmega8

Добавлено: Сб окт 11, 2014 15:18:23
sirha

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

#include <mega8.h>
#include <delay.h>


 interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
  

PORTD.0=1;

}

void main(void)
{
PORTD=0x00; 
DDRD=0x01;  // как выход

TIMSK=0x04;
TCCR1A=0x00;
TCCR1B=0x05;
TCNT1H=0xE1;
TCNT1L=0x7C;

 
  #asm("sei")
 
while (1);

      }
почему тут светодиод загорается но не тухнет не пойму?

ведь на порту весит ноль PORTD=0x00; прерывание же выполниться и опять должен ноль появиться

Re: Помогите с таймером на atmega8

Добавлено: Сб окт 11, 2014 15:20:54
ks0
А так?

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

PORTD.0^=1;

Re: Помогите с таймером на atmega8

Добавлено: Сб окт 11, 2014 15:24:30
sirha
Работает))

обьясните почему так происходит

Re: Помогите с таймером на atmega8

Добавлено: Сб окт 11, 2014 15:25:05
Pink-Pank
Либо так:

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

PIND.0=1;
либо так:

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

PORTD.0 ^= 1; 
обьясните почему так происходит
А это все от невнимательности и спешки. ;)
А если серьезно, то в каждом прерывании у тебя меняется значение порта на противоположное. А в том куске, что ты написал, оно всегда устанавливается в одно и то же значение. И пофиг ему, что до этого оно 0-м было - после прерывания-то его никто в 0 обратно не скидывает

Re: Помогите с таймером на atmega8

Добавлено: Сб окт 11, 2014 15:38:09
sirha
Pink-Pank писал(а): И пофиг ему, что до этого оно 0-м было - после прерывания-то его никто в 0 обратно не скидывает
странно конечно

ведь счетчик постоянно считает а регистр

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

PORTD=0x00;
обратно не присваивается

Не понимаю вот эту надпись-

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

PORTD.0 ^= 1;
как тут меняется значение 1 и 0 ?
обьясните пожалуста

^ - побитное или с отрицанием

1 и 1
0 и 0

все это равно 0

1 и 0 равно 1


токо я все равно не пойму нужно сравнивать два бита типо равен 1 биту =
00000001

не понятно все равно как изменяется значение

Re: Помогите с таймером на atmega8

Добавлено: Пн окт 13, 2014 07:08:44
Pink-Pank
А чего, собственно, не понятно?

Имеется у тебя в порту какое-то значение. Допустим, 0.

Операция исключающее или этого значения с числом 1 дает в результате 1 (значения разные - 1, значения одинаковые - 0). Ты эту единицу загоняешь в порт.
При следующем срабатывании таймера у тебя в порту прошлая 1-ца. Операция исключающего или с числом 1 в этом случае уже дает 0, который отправляется в порт, как новое значение.
И т.д.

Другими словами, исключающее или с 0 не меняет значения, а с 1-цей меняет на противоположное.

Re: Помогите с таймером на atmega8

Добавлено: Вт окт 14, 2014 10:22:40
sirha
Понял c трудом,а как PIND.0=1?; PIND - ЭТО ВРОДЕ ЗНАЧЕНИЕ ВХОДА ,не пойму - это вроде операция в основном для кнопок,как тут светодиод зажигается и гаснет?

Re: Помогите с таймером на atmega8

Добавлено: Вт окт 14, 2014 13:09:47
Pink-Pank
В новых релизах МК сделали возможность изменения значения выхода на противоположный при отправке в этот порт единицы. Смотрите новейшие даташиты. Раньше этот порт имел смысл только при чтении (для кнопок, как Вы выразились)