Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
21.11.2007, 16:39
|
|
Вид на жительство
Регистрация: 27.07.2006
Сообщений: 308
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Таймер не слушается
Привет! У меня такая проблема, ATmega48,
Мне нужно подавать сигнал на ножку с частотой 50 Гц. Делаю:
Код:
|
Частота МК 3686400 Гц.
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
TCNT0=0xB8;
PORTB.0 = PORTB.0^1;
}
PORTB=0x00;
DDRB=0x01;
TCCR0A = 0x00;
TCCR0B = 0x05; // Clk/1204=3600
TCNT0 = B8; // 3600/72=50
TIMSK0=0x01; |
С ножки снимаю сигнал 5 Гц. Почему так?
Все по ДШ.
|
|
|
|
21.11.2007, 17:17
|
|
Гражданин KAZUS.RU
Регистрация: 30.04.2006
Сообщений: 984
Сказал спасибо: 5
Сказали Спасибо 18 раз(а) в 14 сообщении(ях)
|
При таких настройках таймера, "1" на выходе будет 20мс, потом "0" также будет 20мс. Общий период сигнала будет 40мс, тобиш 25Гц. 5Гц никак не может быть.. проверяли в протеусе или в железе?
|
|
|
|
21.11.2007, 17:42
|
|
Вид на жительство
Регистрация: 27.07.2006
Сообщений: 308
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Посылаю полную текстушку.
Показания осцилла:
50 ms - длительность
5 клеток в периоде.
Вот сейчас, тот же исходник, а частота 4 Гц, почему-то.
Прикрепленный файл: 5741312.rar
|
|
|
|
21.11.2007, 18:09
|
|
Вид на жительство
Регистрация: 27.07.2006
Сообщений: 308
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
|
|
|
|
22.11.2007, 13:10
|
|
Вид на жительство
Регистрация: 27.07.2006
Сообщений: 308
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Теперь другая проблема:
//Clock frequency : 3,686400 MHz
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
PINB.0 = 1;
PINB.0 = 0;
}
DDRB=0x03;
TCCR0A=0x00;
TCCR0B=0b00000101; //clk1024
TCNT0=0b11011100; //50 Hz
OCR0A=0x00;
OCR0B=0x00;
TIMSK0=0x01; //interrapt
На выходе 25 Гц. Подскажите, пожалуйста, как сделать 50 Гц.
|
|
|
|
22.11.2007, 14:15
|
|
Гражданин KAZUS.RU
Регистрация: 30.04.2006
Сообщений: 984
Сказал спасибо: 5
Сказали Спасибо 18 раз(а) в 14 сообщении(ях)
|
Сообщение от retcom
|
Теперь другая проблема:
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
PINB.0 = 1;
PINB.0 = 0;
}
|
Нету смысла в таком выражении, нельзя присваивать PINу, с него можно только считывать...
|
|
|
|
22.11.2007, 14:38
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
|
Сообщение от dimonbest
|
Нету смысла в таком выражении, нельзя присваивать PINу, с него можно только считывать...
|
Так-таки и нету смысла? И присваивать нельзя?
Очень даже можно, более того - так и нужно делать, для генерации меандра.
А вот второе присваивание действительно не нужно - работает только присвоение единицы, а не нуля.
И, кстати, частота должна быть именно 25, а не 50, так как каждое присвоение единицы, перекидывает пин в противоположное значение.
Для справки (даташит на мегу48, хотя, это и к другим атмелам относится):
-- Прилагается рисунок: --
|
|
|
|
22.11.2007, 14:47
|
|
Вид на жительство
Регистрация: 27.07.2006
Сообщений: 308
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Цитата:
|
Очень даже можно, более того - так и нужно делать, для генерации меандра.
|
Ты совершенно прав! Я убрал строку присваявающую 0, и ничего неизменилось.
И частота осталась 25 Гц.
Почему у меня неполучается выставлять различные частоты? Вроде делаю все по ДШ?
|
|
|
|
22.11.2007, 15:08
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
|
Сообщение от retcom
|
И частота осталась 25 Гц.
Почему у меня неполучается выставлять различные частоты? Вроде делаю все по ДШ?
|
Где же " не получается"? Всё как раз получается, просто ты не знал, как работает вывод в пин - что он перекидывает пин туда-сюда, что означает деление частоты пополам. Теперь тебе остается удвоить частоту прерывания от таймера и получить искомую. Уменьши прескейлер в два раза.
А вот фигушки - предыдущее значение прескейлера не 512, а 256 - значит, одним TCCR0B'ом не обойтись, придется и другими параметрами играться.
|
|
|
|
22.11.2007, 15:24
|
|
Вид на жительство
Регистрация: 27.07.2006
Сообщений: 308
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Цитата:
|
Уменьши прескейлер в два раза
|
В два раза не получается.
Можно делить только на 8-, 64-, 256- и 1024-.
Пытаюсь:
Код:
|
Clock frequency : 1,000000 MHz
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
PINB.0 = 1;
}
DDRB=0x01;
TCCR0A=0x00;
TCCR0B=0x04;
TCNT0=0xB2;
OCR0A=0x00;
OCR0B=0x00;
TIMSK0=0x01; |
Должно быть 50 Гц, а с вывода РВ0 снимаю 100 Гц.
У меня или 25 или 100 Гц почему-то всегда получается.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
CVAVR while и таймер
|
kr11507 |
Микроконтроллеры, АЦП, память и т.д |
10 |
13.12.2008 21:29 |
Таймер на 5 часов
|
alecsandr27 |
Автоматика и аппаратура связи |
6 |
11.10.2008 20:25 |
Часы - таймер
|
s5s5 |
Микроконтроллеры, АЦП, память и т.д |
5 |
16.05.2008 11:36 |
Таймер
|
Serq |
Автоматика и аппаратура связи |
18 |
27.11.2007 18:32 |
Таймер
|
dem9968 |
Делимся опытом |
1 |
03.02.2005 09:03 |
Часовой пояс GMT +4, время: 23:43.
|
|