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

Обсуждаем контроллеры компании Atmel.
Ответить
Вымогатель припоя
Аватара пользователя
Сообщения: 550
Зарегистрирован: Ср авг 17, 2011 23:12:30

Сообщение 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 секунду
вроде бы все правильно написал
Реклама
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

Сообщение Pink-Pank »

Зачем тем нафлудил? Тебе же написали в "Таймерах и счетчиках".
Светодиод у тебя тухнет, но потом тут же обратно зажигается циклом while. И происходит это настолько быстро, что ты не успеваешь этого даже заметить.
Fucking static initialization order fiasco
Контактная информация:
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 550
Зарегистрирован: Ср авг 17, 2011 23:12:30

Сообщение sirha »

Pink-Pank писал(а): Светодиод у тебя тухнет, но потом тут же обратно зажигается циклом while. И происходит это настолько быстро, что ты не успеваешь этого даже заметить.
но я же сделал задержку где он тухнет
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

Сообщение Pink-Pank »

Где у тебя там какая задержка? Ты его тушишь в прерывании и тут же возвращаешься в главный цикл, где зажигаешь.
Fucking static initialization order fiasco
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Вымогатель припоя
Аватара пользователя
Сообщения: 550
Зарегистрирован: Ср авг 17, 2011 23:12:30

Сообщение sirha »

Pink-Pank писал(а):Где у тебя там какая задержка?
TCNT1H=0xE1;
TCNT1L=0x7C;

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

я могу написать delay_ms но вреде в прерываниях так писать нельзя
Реклама
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

Сообщение Pink-Pank »

Это не задержка. Это изменение значения счетчика таймера. У тебя просто таймер будет чаще срабатывать благодаря таким манипуляциям.

В прерываниях так писать можно. Но не нужно. Я бы программистам, которые такое пишут в прерываниях, руки бы отрывал. Но если у тебя кроме диода в камне ничего больше не будет - то можешь и так решить эту проблему. А вообще, правильным вариантом будет кусок кода из твоего поста в "таймерах". заводишь переменную и в прерывании меняешь ее значение на обратное и в нем же отправляешь ее новое значение в порт. а в главном цикле вообще ничего не делаешь. А вообще, можешь и без переменной значение порта менять. ;)
Fucking static initialization order fiasco
Контактная информация:
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 550
Зарегистрирован: Ср авг 17, 2011 23:12:30

Сообщение sirha »

Спасибо огромное :)
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

Сообщение Pink-Pank »

"Спасибо" под моей авой находится! ;)
Fucking static initialization order fiasco
Контактная информация:
ks0
Прорезались зубы
Аватара пользователя
Сообщения: 238
Зарегистрирован: Чт фев 28, 2013 14:16:10

Сообщение ks0 »

sirha писал(а):Тактовая частота микроконтроллера Fcpu = 8000000 Гц
Период тактового сигнала микроконтроллера Tcpu = 1/Fcpu
Период тактового сигнала таймера Т0 равен Tt0 = (1/Fcpu)/k = k/Fcpu
Только (1/Fcpu)*k если k целое
Вымогатель припоя
Аватара пользователя
Сообщения: 550
Зарегистрирован: Ср авг 17, 2011 23:12:30

Сообщение 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; прерывание же выполниться и опять должен ноль появиться
ks0
Прорезались зубы
Аватара пользователя
Сообщения: 238
Зарегистрирован: Чт фев 28, 2013 14:16:10

Сообщение ks0 »

А так?

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

PORTD.0^=1;
Вымогатель припоя
Аватара пользователя
Сообщения: 550
Зарегистрирован: Ср авг 17, 2011 23:12:30

Сообщение sirha »

Работает))

обьясните почему так происходит
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

Сообщение Pink-Pank »

Либо так:

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

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

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

PORTD.0 ^= 1; 
обьясните почему так происходит
А это все от невнимательности и спешки. ;)
А если серьезно, то в каждом прерывании у тебя меняется значение порта на противоположное. А в том куске, что ты написал, оно всегда устанавливается в одно и то же значение. И пофиг ему, что до этого оно 0-м было - после прерывания-то его никто в 0 обратно не скидывает
Fucking static initialization order fiasco
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 550
Зарегистрирован: Ср авг 17, 2011 23:12:30

Сообщение sirha »

Pink-Pank писал(а): И пофиг ему, что до этого оно 0-м было - после прерывания-то его никто в 0 обратно не скидывает
странно конечно

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

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

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

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

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

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

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

1 и 1
0 и 0

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

1 и 0 равно 1


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

не понятно все равно как изменяется значение
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

Сообщение Pink-Pank »

А чего, собственно, не понятно?

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

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

Другими словами, исключающее или с 0 не меняет значения, а с 1-цей меняет на противоположное.
Fucking static initialization order fiasco
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 550
Зарегистрирован: Ср авг 17, 2011 23:12:30

Сообщение sirha »

Понял c трудом,а как PIND.0=1?; PIND - ЭТО ВРОДЕ ЗНАЧЕНИЕ ВХОДА ,не пойму - это вроде операция в основном для кнопок,как тут светодиод зажигается и гаснет?
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

Сообщение Pink-Pank »

В новых релизах МК сделали возможность изменения значения выхода на противоположный при отправке в этот порт единицы. Смотрите новейшие даташиты. Раньше этот порт имел смысл только при чтении (для кнопок, как Вы выразились)
Fucking static initialization order fiasco
Контактная информация:
Ответить

Вернуться в «AVR»