Страница 4 из 5
Re: Генератор на Atmega8 (микросекунды) большие погрешности
Добавлено: Пт фев 01, 2013 22:35:12
zero648
Прошивку можно?, проверю у меня как будет работать, просто у меня все нормально работает.
з.ы. Да что там прошивку, лучше весь проект сразу
Re: Генератор на Atmega8 (микросекунды) большие погрешности
Добавлено: Сб фев 02, 2013 00:18:25
dem66
Ок
Re: Генератор на Atmega8 (микросекунды) большие погрешности
Добавлено: Сб фев 02, 2013 01:48:08
zero648
Нашел проблему, дело в том, что в режиме СТС оба канала сравниваются по OCR1A, у себя то, Я проверял через канал А, поэтому у меня все работало.
Спойлер
Код: Выделить всё
#define F_CPU 10000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
void SetupTIMER1(void)
{
OCR1A = 499;
TCCR1A = (0b01<<COM1B0);
TCCR1B = (0b01<<WGM12)|(0b001<<CS10); //режим таймера СТС, аппаратный прескалер 1:1
}
int main(void)
{
DDRB = (1 << PB2);
SetupTIMER1();
sei();
while(1)
{
}
}
Re: Генератор на Atmega8 (микросекунды) большие погрешности
Добавлено: Сб фев 02, 2013 07:46:59
JeysonRou
zero648 писал(а):JeysonRou писал(а):Не тугодумте народ нафига вы юзаете OSC T1
Интересно

, где это видно, причем тут OSC T1?
Мне интересно нафига они дергают Нулевой таймер если Т2 сам по себе адаптирован под работу в асенхроне.
И не придерайся умник ну опечатался. Бывает...

Re: Генератор на Atmega8 (микросекунды) большие погрешности
Добавлено: Сб фев 02, 2013 11:05:52
zero648
JeysonRou писал(а):Мне интересно нафига они дергают Нулевой таймер если Т2 сам по себе адаптирован под работу в асенхроне.
И не придерайся умник ну опечатался. Бывает...

При чем здесь опечатка, с чего ты взял, что нужно внешнее тактирование и работа в ассинхр режиме?
Re: Генератор на Atmega8 (микросекунды) большие погрешности
Добавлено: Сб фев 02, 2013 12:33:07
vitalik_1984
JeysonRou писал(а):в асИнхроне.
И не придИрайся... ну опечатался
Похоже опечатки вас просто преследуют

Re: Генератор на Atmega8 (микросекунды) большие погрешности
Добавлено: Сб фев 02, 2013 12:51:24
dem66
И опять вернулись к тому с чего начинали. Сигнал генерится на лапе PB2, 10Khz. А толку? Помните какую я хочу получить осцилограмму?
Обясняю, сейчас в вашем варианте кода получается работает только канал A, так как есть только регистр OCR1A, соответсвенно и приведенной мной осцилограммы получается только первая часть.
Нужно или еще запустить и канал B, выставить ему свою частоту и чтоб в результате чтоб получилась третья часть из преведенного мной рисунка, тоисть то где написано "Результат сложения".
Как этого достичь?
Делать чтоб все это было уже на одной лапе и сложение реализовывалось программно, или на две лапы и потом складывать сигнал какой то внешней логикой, например по той схеме что я показывал выше.
Скважность будет 50% а вот частоты будут менятся, тоесть частота первого канала не может зависеть от частоты второго и наоборот
Re: Генератор на Atmega8 (микросекунды) большие погрешности
Добавлено: Сб фев 02, 2013 13:25:00
zero648
Частота 2 будет кратная частоте 1, чтобы полупериоды были полные или не важно?
Re: Генератор на Atmega8 (микросекунды) большие погрешности
Добавлено: Сб фев 02, 2013 13:32:04
dem66
Не важно, сколько впихнет столько впихнет
Re: Генератор на Atmega8 (микросекунды) большие погрешности
Добавлено: Сб фев 02, 2013 17:52:41
vitalik_1984
Так во втором таймере по прерыванию делитель первого(тот что генерит частоту) переключаем в 0 или в 1 и все, таймер останавливается, если на ноге 1, ставим ноль. три команды буквально.
Re: Генератор на Atmega8 (микросекунды) большие погрешности
Добавлено: Сб фев 02, 2013 17:58:38
dem66
както непонятно

Re: Генератор на Atmega8 (микросекунды) большие погрешности
Добавлено: Сб фев 02, 2013 18:12:37
vitalik_1984
Вам только готовый код подходит, чтобы понять?
Re: Генератор на Atmega8 (микросекунды) большие погрешности
Добавлено: Сб фев 02, 2013 18:20:03
dem66
Ну я в этом деле вобще недавно, в основном на PHP пишу, а вы тут о каких то трех командах говорите.
Тут явно не три команды надо
Re: Генератор на Atmega8 (микросекунды) большие погрешности
Добавлено: Сб фев 02, 2013 18:34:00
vitalik_1984
Алгоритм
Таймер, который вы уже настроили работает так как есть.
Прерывание переполнения другого таймера
загрузили новое значение, чтобы нужная частота поддерживалась в этом таймере.
flag^=1
если флаг,( то TCCR1B = (0b01<<WGM12)|(0b001<<CS10); //режим таймера СТС, аппаратный прескалер 1:1
если не флаг то( TCCR1B =x;<<смотрим сколько тут нужно для аппаратный прескалер 0
- PORTB &=~(1 << PB2);//Очистили сигнал с порта.Можно и без проверок.)
Re: Генератор на Atmega8 (микросекунды) большие погрешности
Добавлено: Сб фев 02, 2013 19:47:19
dem66
Чтото про флаг не понятно, зачем оно вобще надо. И зачем там здался делитель 0?
Ладно оставим пока это дело, сейчас пытаюсь запустить таймер0 и генерить на другую лапу, а оно ноль эмоций, только при запуске устанавливает на лапе высокий уровень и все.
Код: Выделить всё
#define F_CPU 10000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
ISR(TIMER0_OVF_vect)
{
TCNT0 = 195;
PORTB ^= (1 << PB1);
}
void SetupTIMER1(void)
{
// Prescaler = FCPU/1024
TCCR0|=(1<<CS02)|(1<<CS00);
//Enable Overflow Interrupt Enable
TIMSK|=(1<<TOIE0);
TCNT0 = 0;
}
int main(void)
{
DDRB = (1 << PB1);
DDRB = (1 << PB2);
SetupTIMER1();
sei();
while(1)
{
}
}
Re: Генератор на Atmega8 (микросекунды) большие погрешности
Добавлено: Сб фев 02, 2013 22:00:35
zero648
dem66 писал(а):Ладно оставим пока это дело, сейчас пытаюсь запустить таймер0 и генерить на другую лапу, а оно ноль эмоций, только при запуске устанавливает на лапе высокий уровень и все.
Строчку подправь
DDRB |= (1 << PB2);
Код с наложеной частотой, выход РВ1.
Спойлер
Код: Выделить всё
#define F_CPU 10000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
ISR(TIMER0_OVF_vect)
{
TCNT0 = 195;
TCCR1A ^= (1<<COM1A0);
// TCCR1B ^= (1<<CS10);
// PORTB ^= (1<<PB1);
}
void SetupTIMERs(void)
{
TCNT0 = 195;
TCCR0 = (0b101<<CS00); // Prescaler = FCPU/1024
TIMSK = (1<<TOIE0); // Enable Overflow Interrupt Enable
OCR1A = 499;
TCCR1A = (0b01<<COM1A0);
TCCR1B = (0b01<<WGM12)|(0b001<<CS10); //режим таймера СТС, аппаратный прескалер 1:1
}
int main(void)
{
DDRB = (1 << PB1);
SetupTIMERs();
sei();
while(1)
{}
}
Re: Генератор на Atmega8 (микросекунды) большие погрешности
Добавлено: Сб фев 02, 2013 23:14:04
dem66
Спасибо за помощь, я уже какраз тоже разобрался))
Скажите а можно ли менять TCCR0 в зависимости от диапазона частот?
Это нужно будет перезапускать таймер или как?
Допустим для одного диапазона частот лучше прескалер 64 для других 8 и т.д.
Re: Генератор на Atmega8 (микросекунды) большие погрешности
Добавлено: Вс фев 03, 2013 04:01:05
zero648
Да, без проблем, какой надо, тот и ставишь прескалер, если ноль таймер остановлен.
Re: Генератор на Atmega8 (микросекунды) большие погрешности
Добавлено: Вс фев 03, 2013 11:06:16
dem66
Ну имею ввиду типа этого
Код: Выделить всё
int SetPrescaller(char prescaller){
switch(prescaller){
case('256'):
TIMSK|=(0<<TOIE0);
TCCR0 |= (1 << CS02)|(0 << CS01)|(0 << CS00); // 256
TIMSK|=(1<<TOIE0);
break;
case('64'):
TIMSK|=(0<<TOIE0);
TCCR0 |= (0 << CS02)|(1 << CS01)|(1 << CS00); // 64
TIMSK|=(1<<TOIE0);
break;
case('8'):
break;
}
}
int main(void)
{
DDRB = (1 << PB1);
DDRB |= (1 << PB2);
SetupTIMER1();
sei();
while(1)
{
if(prescaller!=''){
SetPrescaller(prescaller);
}
}
}
Сам прескаллер получаем по юарту, вот только не придумал как
Re: Генератор на Atmega8 (микросекунды) большие погрешности
Добавлено: Вс фев 03, 2013 11:26:13
zero648
TIMSK|=(0<<TOIE0);
Бесполезный оператор, он ничего не делает.
если нужно сбрасывать бит TOIE0, тогда вроде так:
TIMSK&=~(1<<TOIE0);
p.s. И зачем везде ставить логическое "или - | "
берем например строку:
TCCR0 |= (1 << CS02)|(0 << CS01)|(0 << CS00); // 256
из нее следует, что TCCR0 = 0x04;
потом меняем прескалер и выполняется эта строка:
TCCR0 |= (0 << CS02)|(1 << CS01)|(1 << CS00); // 64
и получается, что TCCR0 = TCCR0 | 0x03 = 0x07;
и после этого прескалер больше никогда не изменится.