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

Обсуждаем контроллеры компании Atmel.
Ответить
Вымогатель припоя
Аватара пользователя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Сообщение zero648 »

Прошивку можно?, проверю у меня как будет работать, просто у меня все нормально работает.

з.ы. Да что там прошивку, лучше весь проект сразу
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 141
Зарегистрирован: Ср окт 26, 2011 13:38:13

Сообщение dem66 »

Ок
Вложения
Gener.dsn.zip
Проект
(19.83 КБ) 185 скачиваний
timer.c
Исходники
(419 байт) 288 скачиваний
firmware.hex
Прошивка
(480 байт) 280 скачиваний
Это не хвост, это антенна
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Сообщение 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)
   {
	   
   }
}
Открыл глаза
Сообщения: 46
Зарегистрирован: Ср янв 16, 2013 06:51:09
Откуда: Сам не знаю...

Сообщение JeysonRou »

zero648 писал(а):
JeysonRou писал(а):Не тугодумте народ нафига вы юзаете OSC T1 :dont_know:
Интересно :))) , где это видно, причем тут OSC T1?
Мне интересно нафига они дергают Нулевой таймер если Т2 сам по себе адаптирован под работу в асенхроне.
И не придерайся умник ну опечатался. Бывает... :kill:
Реклама
Эиком - электронные компоненты и радиодетали
Вымогатель припоя
Аватара пользователя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Сообщение zero648 »

JeysonRou писал(а):Мне интересно нафига они дергают Нулевой таймер если Т2 сам по себе адаптирован под работу в асенхроне.
И не придерайся умник ну опечатался. Бывает... :kill:
При чем здесь опечатка, с чего ты взял, что нужно внешнее тактирование и работа в ассинхр режиме?
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

JeysonRou писал(а):в асИнхроне.
И не придИрайся... ну опечатался
Похоже опечатки вас просто преследуют :))
Контактная информация:
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 141
Зарегистрирован: Ср окт 26, 2011 13:38:13

Сообщение dem66 »

И опять вернулись к тому с чего начинали. Сигнал генерится на лапе PB2, 10Khz. А толку? Помните какую я хочу получить осцилограмму?

Изображение

Обясняю, сейчас в вашем варианте кода получается работает только канал A, так как есть только регистр OCR1A, соответсвенно и приведенной мной осцилограммы получается только первая часть.
Нужно или еще запустить и канал B, выставить ему свою частоту и чтоб в результате чтоб получилась третья часть из преведенного мной рисунка, тоисть то где написано "Результат сложения".

Как этого достичь?

Делать чтоб все это было уже на одной лапе и сложение реализовывалось программно, или на две лапы и потом складывать сигнал какой то внешней логикой, например по той схеме что я показывал выше.

Скважность будет 50% а вот частоты будут менятся, тоесть частота первого канала не может зависеть от частоты второго и наоборот
Вложения
oscil.jpg
(19.63 КБ) 654 скачивания
Последний раз редактировалось dem66 Сб фев 02, 2013 18:21:33, всего редактировалось 2 раза.
Это не хвост, это антенна
Вымогатель припоя
Аватара пользователя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Сообщение zero648 »

Частота 2 будет кратная частоте 1, чтобы полупериоды были полные или не важно?
Встал на лапы
Аватара пользователя
Сообщения: 141
Зарегистрирован: Ср окт 26, 2011 13:38:13

Сообщение dem66 »

Не важно, сколько впихнет столько впихнет
Это не хвост, это антенна
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

Так во втором таймере по прерыванию делитель первого(тот что генерит частоту) переключаем в 0 или в 1 и все, таймер останавливается, если на ноге 1, ставим ноль. три команды буквально.
Контактная информация:
Встал на лапы
Аватара пользователя
Сообщения: 141
Зарегистрирован: Ср окт 26, 2011 13:38:13

Сообщение dem66 »

както непонятно :(
Это не хвост, это антенна
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

Вам только готовый код подходит, чтобы понять?
Контактная информация:
Встал на лапы
Аватара пользователя
Сообщения: 141
Зарегистрирован: Ср окт 26, 2011 13:38:13

Сообщение dem66 »

Ну я в этом деле вобще недавно, в основном на PHP пишу, а вы тут о каких то трех командах говорите.
Тут явно не три команды надо
Это не хвост, это антенна
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

Алгоритм

Таймер, который вы уже настроили работает так как есть.

Прерывание переполнения другого таймера
загрузили новое значение, чтобы нужная частота поддерживалась в этом таймере.
flag^=1
если флаг,( то TCCR1B = (0b01<<WGM12)|(0b001<<CS10); //режим таймера СТС, аппаратный прескалер 1:1
если не флаг то( TCCR1B =x;<<смотрим сколько тут нужно для аппаратный прескалер 0
    • PORTB &=~(1 << PB2);//Очистили сигнал с порта.Можно и без проверок.)
Контактная информация:
Встал на лапы
Аватара пользователя
Сообщения: 141
Зарегистрирован: Ср окт 26, 2011 13:38:13

Сообщение 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)
   {
      
   }
}
Это не хвост, это антенна
Вымогатель припоя
Аватара пользователя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Сообщение 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)
   {}
}
Встал на лапы
Аватара пользователя
Сообщения: 141
Зарегистрирован: Ср окт 26, 2011 13:38:13

Сообщение dem66 »

Спасибо за помощь, я уже какраз тоже разобрался))
Скажите а можно ли менять TCCR0 в зависимости от диапазона частот?

Это нужно будет перезапускать таймер или как?

Допустим для одного диапазона частот лучше прескалер 64 для других 8 и т.д.
Это не хвост, это антенна
Вымогатель припоя
Аватара пользователя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Сообщение zero648 »

Да, без проблем, какой надо, тот и ставишь прескалер, если ноль таймер остановлен.
Встал на лапы
Аватара пользователя
Сообщения: 141
Зарегистрирован: Ср окт 26, 2011 13:38:13

Сообщение 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);
	  }
   }
}
Сам прескаллер получаем по юарту, вот только не придумал как
Это не хвост, это антенна
Вымогатель припоя
Аватара пользователя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

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

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