Страница 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 :dont_know:
Интересно :))) , где это видно, причем тут OSC T1?
Мне интересно нафига они дергают Нулевой таймер если Т2 сам по себе адаптирован под работу в асенхроне.
И не придерайся умник ну опечатался. Бывает... :kill:

Re: Генератор на Atmega8 (микросекунды) большие погрешности

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

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;
и после этого прескалер больше никогда не изменится.