pliss

С нуля Программирование AVR Купил программатор и Контроллер Что дальше...

200 сообщений в этой теме

19 минут назад, demiurg1978 сказал:

Планирование. ТЗ

Обеими руками поддерживаю!

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Цитата

Пока код выглядит так:

ШИМ не исправлен. Форматирование отсутствует. Опрос кнопок кривой. Период обновления ШИМ и кнопок даже приблизительно не фиксирован и зависит от погоды на Марсе.

Еще раз советую привязать глобальный счетчик времени к таймеру:

volatile uint8_t global_time = 0; //8-битный глобальный счетчик времени

ISR(TIMER1_COMPA_vect){
  global_time++;
}

и используйте его для формирования ШИМ в бесконечном цикле. Там его надо только сравнивать с порогами, не меняя.

Цитата

Если я перемешаю опрос кнопок и отсчёт периода, то период всё равно будет плавать тогда, когда будет выполняться приращение импульса при нажатой кнопке...

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

Кроме того, стоит добавить в бесконечный цикл "тупую" задержку (_delay_us), чтобы время прохода определялось в основном делеем, а не непредсказуемой комбинацией условий. В данном случае такая задержка допустима, поскольку бесконечный цикл выполняется не в реальном времени - его в любой момент могут прервать внешние события, сам он может выполняться разное время при разных входных условиях (нажата ли та или иная кнопка, или достигнуто совпадение счетчика с величиной ШИМа).

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Нет, я бы счетчик времени не держал бы в прерывании, ведь в программе он может изменится в любой самый неудобный момент. Лучше использовать таймер для того чтобы обозначить начало цикла. Как прерывание - так начало цикла, а код пусть отработает и ждет следующего. В любом случае чтобы не было пропусков и там и там необходимо чтобы код выполнился быстрее чем наступит следующий цикл, а в первом случае имеем ещё и неожиданное изменение значения переменной. Впринципе пусть счетчик будет в прерывании, только основной бесконечный цикл надо синхронизировать с таймером, чтобы код выполнялся гарантированно после инкремента global_time и в коде небыло нежданчиков.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
2 часа назад, COKPOWEHEU сказал:

используйте его для формирования ШИМ в бесконечном цикле. Там его надо только сравнивать с порогами, не меняя

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

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Йооопт!!! Я вспоминаю, как сам мучался с опросом кнопок. Но и с ваших советов хочется головой об стол биться. Господа, обработчики прерываний должны быть максимально быстрыми и лаконичными. На хрена вы новичка учите забивать прерывания? Настраиваем один таймер на ШИМ, второй на 1 мс. В прерывании пусть крутится переменная-счетчик либо выставляется флаг. В основном цикле смотрим на значение переменная-счетчика либо на флаг.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ну, это вы всё, на верное, правильно говорите, только непонятно.)

Но тем не менее оно работает. Може быть внутри оно неправильное, но снаружи - вполне.

Спасибо всем, кто вольно или не вольно помог сделать первый шаг. ))

 

 

 

 

 

 

 

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
54 минуты назад, ARV сказал:

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

Знаю, но это помешает лепить ненужные циклы. После глобального счетчика времени его было бы легко сделать локальным.

36 минут назад, pliss сказал:

Спасибо всем, кто вольно или не вольно помог сделать первый шаг. ))

То есть учиться вы не желаете? Достаточно наляпать говнокода

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
2 часа назад, COKPOWEHEU сказал:

То есть учиться вы не желаете?

Желаю. И учусь.

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

3 часа назад, COKPOWEHEU сказал:

Достаточно наляпать говнокода

Это у меня пройдёт. У вас же прошло.)

А что закодировал "говнокодом" - так можно и перекодировать. Дело не хитрое. Но, сделал это принципиально, чтобы навсегда не остаться виртуальным программистом. У многих на форуме, я уверен, весь диск забит кодом, который ни разу не исполнялся ни где, кроме симулятора.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
6 часов назад, pliss сказал:

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

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

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Шутите? Если не требуется особой точности, хватит десятка строк кода. Впрочем, особую точность без таймера (или любого другого прерывания, которое можно настроить на регулярное срабатывание - АЦП, SPI, UART) все равно не получить.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Только что, COKPOWEHEU сказал:

Шутите?

Нет. Я ведь не ввожу оговорки "если не требуется..."

ШИМ с плавающей частотой - я даже не могу подобрать точного термина для обозначения такой модуляции... А нормальный ШИМ потребует специфических усилий по обеспечению одинаковой длительности исполнения разных ветвей кода, что на Си без анализа ассемблерного листинга и "подгонки кода по месту" вообще нереализуемо. И код в итоге будет не просто не портируемым, а особо зависимым от массы свойств конкретного компилятора.

Если вы называете решение этой задачи простым - я снимаю шляпу перед вашим талантом.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
5 часов назад, ARV сказал:

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

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

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

 

 

 

 

 

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Только что, pliss сказал:

я никак не могу донести до коллег

А вы попробуйте формулировать менее абстрактные, короткие конкретные вопросы, исключающие свободное домысливание. Хотя в этом случае вас скорее всего направят читать литературу... :rolleyes:

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
6 часов назад, ARV сказал:

на Си без <...> "подгонки кода по месту"

Подгонка по месту оказалась не такой сложной. Я в протеусе уже не могу определить изменение частоты при любых манипуляциях с кнопками. Хотя, повторюсь - стабильность мне важна во время работы. Во время перенастройки она меня не интересует.

Единственное, что сложнее победить, при использовании целочисленных переменных - это абсолютную разницу в ширине импульса... Но можно.

Скрытый текст

#define F_CPU 8000000UL
#include  <avr/io.h>

int main()

{	
	DDRB = 0x00;//кнопки
	PORTB = 0xFF;//кнопки с резисторами
	DDRD = 0xFF;//выход шим
	PORTD = 0x00;//выход шим низкий
	int  port_state = PINB;//переменная состояния порта
	int t_on0 = 2;//время высокого уровня PORTD0 
	int t_on1 = 2;//время высокого уровня PORTD1
	int contact_chatter_counter = 0;//счётчик числа периодов для антидребезга 
	char enable = 1;//разрешение приращения высокого уровня
	int T_counter = 0;//счётчик периода	
	const int T_const = 260;//период	

	while(1)//бесконечный цикл
	
	{	//==========подсчёт периодов шим перед опросом кнопок=============		
		if(!(contact_chatter_counter & 0b00000111))//каждые 8 периодов
		
		{
			port_state = PINB;//запоминаем состояние PORTB
			contact_chatter_counter++;//изменяем счётчик подсчёта периодов
		}	
       //=====================период======================================		
		if(T_counter>=T_const)//определение начала периода шим
		
		{	
			contact_chatter_counter++;//подчёт количества периодов
			T_counter = 0;//сброс счётчика периода
			PORTD = 0xFF;//включаем все каналы
		}
		
		else//отсчёт одного периода

		{   //================кнопки канала PORTD0========================		
			if(!(port_state&(1<<PORTD0)))//если нажат "+"

			{
				if(enable)//если разрешено приращение, 

				{
					if(T_const>=(t_on0<<1))//если есть возможность расширения импульса

					{
						T_counter++;	
						t_on0 = (t_on0<<1);//расширяем импульс PORTD0
						enable = 0;//запрещаем приращение
					}
				}
			}                                           	

			if(!(port_state&(1<<PORTD1)))//если нажат "-" 

			{
				if(enable)//если разрешено приращение

				{
					if(1<=(t_on0>>1))//если есть возможность расширения импульса

					{
						T_counter--;	
						t_on0 = (t_on0>>1);//сужаем импульс PORTD0
						enable = 0;//запрещаем приращение
					}
				}
			}		
			//================выключение канала PORTD0=============================
			if(T_counter==t_on0)//если счётчик периода равен ширине импульса PORTD0

			{
				PORTD&=~(1<<PORTD0);//выключаем PORTD0		
			}
			//====================кнопки канала PORTD1==============================
			if(!(port_state&(1<<PORTD2)))//если нажат "+" 

			{
				if(enable)//если разрешено приращение

				{
					if(T_const>=(t_on1<<1))//если есть возможность расширения импульса
					
					{
						T_counter++;	
						t_on1 = (t_on1<<1);//расширяем импульс PORTD1
						enable = 0;//запрещаем приращение
					}
				}
			}	

			if(!(port_state&(1<<PORTD3)))//если нажат "-" 

			{
				if(enable)//если разрешено приращение

				{
					if(1<=(t_on1>>1))//если есть возможность расширения импульса				

					{
						T_counter--;	
						t_on1 = (t_on1>>1);//сужаем импульс PORTD1
						enable = 0;//запрещаем приращение
					}
				}
			}				
			//================выключение канала PORTD1====================

			if(T_counter==t_on1)//если счётчик периода равен ширине импульса PORTD1

			{
				PORTD&=~(1<<PORTD1);//выключаем PORTD1
			}									
		}

		T_counter++;//считаем период				
		if(port_state==0xFF)//если кнопки отпущены

		{
			enable = 1;//разрешаем изменение
		}
	}
}

 

 

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Жаль, что прочитав мою статью вы не стали следовать её рекомендациям... читабельность кода никакая, не смотря на старания по выбору имен переменных...

#define PWM1	0
#define PWM2	1
#define PWM_PORT	PORTB
  
uint8_t counter;
uint8_t pwm1=0;
uint8_t pwm2=0;
uint8_t port;

static void modify_byte(uint8_t *byte, int8_t delta){
  int16_t tmp = *byte;
  tmp += delta;
  if(tmp < 0) tm = 0;
  if(tmp > 255) tmp = 255;
  *byte = tmp;
}

int main(void){
  while(1){
    port = 0;
    if(pwm1 > counter) port |= 1 << PWM1;
    if(pwm2 > counter) port |= 1 << PWM2;
    counter++;
    PWM_PORT = port;

    switch(get_pressed_button()){
      case K_PWM1_UP: modify_byte(&pwm1, +1); break;
      case K_PWM1_DN: modify_byte(&pwm1, -1); break;
      case K_PWM2_UP: modify_byte(&pwm2, +1); break;
      case K_PWM2_DN: modify_byte(&pwm2, -1); break;
    }
  }
}

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

Сравните вашу функцию main с моим вариантом... согласны, что логика понятна без единого комментария? И не запутаешься, не так ли?

1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
3 часа назад, ARV сказал:

согласны, что логика понятна без единого комментария? И не запутаешься, не так ли?

Согласен. Я, когда вырасту и стану большим, такие же штуки буду писать.)

Если честно - я никак не "въеду" в объявление и дальнейшее использование функций.

Вот у вас -

3 часа назад, ARV сказал:

get_pressed_button()

Я так понимаю, что я её должен изобрести. Это вы мне оставили, и в результате нажатия на ту или иную кнопку вместо неё должно получиться число. А от того, какое число получиться зависит какой случиться case.

Ну вот на таком уровне у меня "функции". Были бы на другом - я бы в своём коде их бы давно прикрутил куда-нибудь...

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
15 часов назад, ARV сказал:

Если вы называете решение этой задачи простым - я снимаю шляпу перед вашим талантом.

ШИМу не так уж часто нужна стабильная частота - важнее средний коэффициент заполнения. На выходе с высоким шансом будет стоять фильтр или что-то инерционное. Сомневаюсь что у ТСа там будет что-то сложнее диода. А если решать строго поставленную задачу с учетом вообще всех крайностей решения никогда не будет. Для примера можете написать программу, вычисляющую корни квадратного уравнения.

6 часов назад, pliss сказал:

Я в протеусе уже не могу определить изменение частоты при любых манипуляциях с кнопками.

В протеусе не так-то просто провести сложные манипуляции с кнопками. Во-первых, интерфейс не позволит, во-вторых, догадаться что будет тыкать гипотетический пользователь почти невозможно.

Код стал гораздо лучше. Появилось форматирование и стандартные конструкции. Он все еще слишком запутан, но это от неопытности. Работа с кнопками здорово накручена, можно сделать проще. Комментариев многовато - не надо повторять в комментарии тоже что написано в коде, часто на функцию хватает одного комментария что она делает и какие параметры принимает.

6 часов назад, pliss сказал:

int contact_chatter_counter = 0;//счётчик числа периодов для антидребезга

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

6 часов назад, pliss сказал:

t_on0 = (t_on0<<1);//расширяем импульс PORTD0

эту конструкцию я не понял. У вас изменение каждый раз идет в 2 раза вместо изменения на единицу или другую константу?

6 часов назад, pliss сказал:

if(T_counter>=T_const){

...

PORTD = 0xFF;//включаем все каналы

Лучше занулять не все подряд, а только интересующие каналы: PORTD |= (1<<PD0 | 1<<PD1);

#include "pinmacro.h" //я бы использовал свой набор макросов для удобного назначения портов (реализация у меня в подписи, но без понимания битовой магии вряд ли получится воспользоваться, в данном случае я ее использую чтобы показать как можно назначить выводы - максимальная абстракция)
#define BTN_INC0	D,0,0 //например, такая запись означает что кнопка увеличения нулевого канала висит на PD0 и коммутируется на землю (лог.0 - замкнуто)
#define BTN_DEC0	D,1,0
#define BTN_INC1	D,2,0
#define BTN_DEC1	D,3,0
#define PWM0		B,0,1 //а такая запись - что 0-й канал ШИМ висит на PB0 и активным уровнем считается высокий.
#define PWM1		B,1,1

uint8_t pwm_count = 0;
uint8_t pwm0, pwm1;
uint8_t btn_count = 0;

while(1){
  pwm_count++;
  if( pwm_count == 0 ){
    PORT_ON( PWM0 );
    PORT_ON( PWM1 );
    btn_count++;
    if( btn_count > 80 ){ //учитывая задержку 10 мкс (см. ниже), счет до 80 позволяет опрашивать кнопки раз в 0.2 сек.
//время задержки определяется в основном delay'ем что позволяет хоть как-то прикинуть остальные времена: счет ШИМа до 255 дает период срабатывания условия в 2,5 мс (10 мкс * 256), то есть если вложенный счетчик считает до 80, это условие будет срабатывать с периодом 0.2 с (2.5 мс * 80)
      btn_count = 0;
      if( PIN_ON( BTN_INC0 ) ) //в данном случае кнопки и переполнение проще прописать вручную
        if(pwm0 < 0xFF)pwm0++;
      if( PIN_ON( BTN_DEC0 ) )
        if(pwm0 > 0)pwm0--;
      if( PIN_ON( BTN_INC1 ) )
        if(pwm1 < 0xFF)pwm1++;
      if( PIN_ON( BTN_DEC1 ) )
        if(pwm1 > 0)pwm1--;
    }
  }
  if( pwm_count == PWM0 )PORT_OFF( PWM0 );
  if( pwm_count == PWM1 )PORT_OFF( PWM1 );
  _delay_us(10); //эта задержка должна определять время прохода каждого цикла. Для тактовой в 1 МГц это всего 10 тактов, что маловато, но для больших частот ошибка невелика
}

 

14 минуты назад, pliss сказал:

Если честно - я никак не "въеду" в объявление и дальнейшее использование функций.

Эта функция должна возвращать код нажатой кнопки. Одновременное нажатие не поддерживается. Коды объявлены константами или макроопределениями K_PWM1_UP и прочими. Например, так

#define K_PWM1_UP 30 //конкретное значение безразлично, лишь бы разное у разных кнопок

1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 час назад, COKPOWEHEU сказал:

. Сомневаюсь что у ТСа там будет что-то сложнее диода.

Чтобы развеять сомнения достаточно прочитать начало темы.)

 

1 час назад, COKPOWEHEU сказал:

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

Я не гипотетический. Я объективная реальность. Ну, и опять же - у темы есть начало.)

По поводу форматирования - я "пошёл в гугл и набрал в яндексе" "оформление форматирование код си". Нашёл перевод существующего стандарта оформления. Исполнил все пункты кроме "№ 1".

1 час назад, COKPOWEHEU сказал:

эту конструкцию я не понял. У вас изменение каждый раз идет в 2 раза вместо изменения на единицу или другую константу?

Да. Прогрессия должна быть геометрической.

"Один" и "один + один" различаются в два раза. (100%)

"Девяносто девять" и "девяносто девять + один" различаются в 1,01(01) раза.(1%)

2 часа назад, COKPOWEHEU сказал:

Эта функция должна возвращать код нажатой кнопки. Одновременное нажатие не поддерживается. Коды объявлены константами или макроопределениями K_PWM1_UP и прочими.

Ну, вот если бы в моём коде намекнуть на место, где можно применить такой фокус, если такое есть,  но не сам фокус - это было бы здорово...

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
4 часа назад, pliss сказал:

Я не гипотетический. Я объективная реальность.

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

4 часа назад, pliss сказал:

По поводу форматирования - я "пошёл в гугл и набрал в яндексе" "оформление форматирование код си"

Проблема в том что единого стандарта нет. Если локальные у отдельных компаний и есть предпочтительные у большинства программистов. Пока от вас не требуют поддерживать существующий код или корпоративный стандарт, можете выбирать тот стиль, который нравится лично вам. Разумеется, будет лучше (в первую очередь, лично вам будет удобнее) если он обеспечивает выделение блоков кода, легко читаем и требует минимума комментариев.

4 часа назад, pliss сказал:

Да. Прогрессия должна быть геометрической.

в таком случае не маловато ли девяти шагов? Впрочем, выходная частота и так не получится слишком большой - в моем примере с 10 мкс задержкой, она составила 390 Гц, этого и для диодов едва хватит.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 час назад, COKPOWEHEU сказал:

в таком случае не маловато ли девяти шагов?

Конечно мало, но это я "на скорую руку" переделал, когда прошивал контроллер. Точнее - сначала запрограммировал с арифметической прогрессией, потом переделал на геометрическую.

Но, не с характером приращения у меня сложности.)

2 часа назад, COKPOWEHEU сказал:

Проблема в том что единого стандарта нет.

Возможно. Я делал по High Integrity C++ Coding Standard

2 часа назад, COKPOWEHEU сказал:

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

И это говорите мне вы?!!!! )))))))

2 часа назад, COKPOWEHEU сказал:

В данном случае вы не пользователь а разработчик.

Возможно, но я не постой разработчик. Я разработчик, который лучше всех остальных разработчиков знает т.з. Я сам и есть - Т,З. Да, я - объективная реальность и т.з.

 

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Только что, pliss сказал:

Ужос... Лично мне очень помогла книга "Веревка достаточной длины, чтобы выстрелить себе в ногу" - не смотря на странное название она написана простым и понятным языком, и перевод её вроде бы не испортил.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Не знаю, смеяться или плакать.) Мудрый дядька эту книжку написал, а может, просто следил за этой веткой форума.

Девятая страница:

58d274ca7607f_.png.3d21b9efa4f8d3fcd16791de35253b3c.png

 

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
7 часов назад, pliss сказал:

И это говорите мне вы?!!!! )))))))

Важно чтобы стандарт был и чтобы он справлялся со своей задачей. Мой код вы видели, его форматирование отличается от вашего, и пришел я к нему не сразу. А уж будут ли фигурные скобки той же строке что условие (начало тела функции, блоков if, while) или на следующей, будет ли в начале сделующего блока пробел, 6 пробелов или табуляция не так уж важно.

7 часов назад, pliss сказал:

Я разработчик, который лучше всех остальных разработчиков знает т.з. Я сам и есть - Т,З.

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

6 часов назад, ARV сказал:

Ужос...

Лучше чем ничего

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
2 часа назад, COKPOWEHEU сказал:

Мой код вы видели, его форматирование отличается от вашего, и пришел я к нему не сразу.

Видите ли в чём дело...

Ваш код или код коллеги ARV отличается от моего не тем, что он хорошо отформатирован, а тем что он хорош сам по себе. Форматирование здесь сильно ни причём.)

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Форматирование кода нужно не для гламурности, а для удобства чтения кода и экономии времени. Чтобы в будущем, скажем, через несколько месяцев, открывая собственный проект, не материться, а что это я тут накорябал?! Так же и с чужим проектом. Если есть стиль и порядок, разбираться с программой гораздо легче и быстрее. Есть официальные стили форматирования, но у каждого программиста постепенно вырабатывается свой.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ваша публикация должна быть проверена модератором

3
Вы не авторизованы. Если у вас есть аккаунт, пожалуйста, войдите.
Ответить в тему...

×   Вы вставили отформатированное содержимое.   Восстановить форматирование

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был востановлен.   Очистить редактор

Загрузка...

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

  • Сообщения

    • Что все на коп пошли? ))  r3 поставил переменник тх регулирует от 8мА до 22 мА ...чуйка на монету 15 см хотя баланс сводил по разному (3ч просидел) сводил от 30мВ и више толку 0 ... Также  RX подключал по разному но всегда 8228Hz 0 mv хотя мд работает.... Также надеюсь ктонибуть ответит ..
    • Токовое зеркало меньше влияет на характеристики унч чем повторитель в кун, собирал 2 варианта и отслушивал разница не в пользу тз. Если ми говорим от чего больше профита.
    • А при чём здесь тема, которая где-то у вас? Здесь, на Паяльнике, эта тема о конкретном усилителе - о "торчибасе" - с 1-го поста надо было читать, а не с куска, выдернутого откуда-то из середины.  Вообще-то я не для того выкладывал эту схему(хотя это всего -лишь картинка из симулятора), чтобы кто-то её уродовал в силу своего недопонимания её нюансов. Если не понимаешь того, что даёт токовое зеркало, и нет под рукой "букваря", карандаша и клочка бумаги, чтобы посчитать - спроси  
    • кренки просадку под нагрузкой будут давать, и унч в голодании будет, кно нибуть видел чтоби в оконечник стаб ставили, всегда идет прямо с диодов вся мощ питания ни виходние транзюки или микри
    • Хотел бы получить квалифицированный совет по поводу процесса и результатов моих измерений формы цифрового сигнала. Имееются значительные базовые знания цифровой электроники но практически нулевой опыт. Есть некое цифровое(?) устройство, для которого мне хотелось бы задокументировать форму сигнала. Есть дешевый китайский тестер.
      Вначале все довольно ясно, 


      но когда начинаю менять масштаб оси времени, то выглядит так, как будто, во-первых, импульсы идут пачками

      , а потом, что эти "пачки" чередуются полярностью. 

      потом бОльшими пачками:



      И напоследок пачки как бы чередуются с одиночными сигналами не совсем прямоугольной формы (последние 4 фото имеют один и тот же масштаб времени)




      Да и начальные импульсы строго говоря не совсем прямоугольные - верхняя часть имеет спад -- вначале было подозрение что это просто проблема с осциллографом, но потом вспомнил, что у него есть калибровочный сигнал, который не имел такой проблемы. Так как я никогда не использовал осциллограф, то полагаю, что может, что не учитываю. По идее, этот прибор должен выдавать "модифицированный прямоугольный сигнал 100Гц и длительностью сигнала 2мсек". Но мне видятся некие несоответствия для разных масштабов времени:
      почему для <= 10мсек все сигналы двуполярные а дла 20мсек чередуются полярностью?
      почему для 20мсек пачки просто чередуются, а для 50мсек группируются в бОльшие пачки одной полярности?
      почему ширина пачек для 0.2сек и для 0.5сек практически одинаковая?
      похоже ли что для некоторых 0.5сек фото пачки действительно чередуются с одиночными импульсами более растянутыми? Фактически на основании того что я вижу это не совсем цифровой сигнал, кроме того, видны множественные огрехи на разных фото. Либо
      проблема с очень простым осциллографом, либо с процессом измерения, либо (ощущение, что) сам прибор очень простой и не обеспечивает 
      качественного сигнала. А может, дело просто в том, что сигналы, организованные в пачки разной полярности, нельзя увидеть при большем разрешении времени из-за синхронизации осциллографа, установленной по уровню, но этот уровень одной полярности, так что осциллограф просто "пропускает" отрицательные пачки?
  • Похожие публикации

    • Автор: abr_avr
      Добрый день!
      Программирую в Arduino IDE, программатор Arduino ISP, других к сожалению нету.
      Решил поменять скорость работы контроллера ATTiny13A при помощи смены fuse. Менял через Arduino IDE, которая подставила такую команду
      C:\Program Files\Arduino\hardware\tools\avr/bin/avrdude -CC:\Program Files\Arduino\hardware\tools\avr/etc/avrdude.conf -v -v -pattiny13 -cstk500v1 -PCOM3 -b19200 -e -Uhfuse:w:0xFF:m -Ulfuse:w:0x7b:m После чего достучатся до контроллера теперь никак не могу. Вот, что пишет avrdude: 
      avrdude: Version 6.3, compiled on Dec 16 2016 at 13:33:19 Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/ Copyright (c) 2007-2014 Joerg Wunsch System wide configuration file is "C:\Program Files\Arduino\hardware\tools\avr/etc/avrdude.conf" Using Port : COM3 Using Programmer : stk500v1 Overriding Baud Rate : 19200 AVR Part : ATtiny13 Chip Erase delay : 4000 us PAGEL : P00 BS2 : P00 RESET disposition : dedicated RETRY pulse : SCK serial program mode : yes parallel program mode : yes Timeout : 200 StabDelay : 100 CmdexeDelay : 25 SyncLoops : 32 ByteDelay : 0 PollIndex : 3 PollValue : 0x53 Memory Detail : Block Poll Page Polled Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW MaxW ReadBack ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- --------- eeprom 65 5 4 0 no 64 4 0 4000 4000 0xff 0xff flash 65 6 32 0 yes 1024 32 32 4500 4500 0xff 0xff signature 0 0 0 0 no 3 0 0 0 0 0x00 0x00 lock 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00 calibration 0 0 0 0 no 2 0 0 0 0 0x00 0x00 lfuse 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00 hfuse 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00 Programmer Type : STK500 Description : Atmel STK500 Version 1.x firmware Hardware Version: 2 Firmware Version: 1.18 Topcard : Unknown Vtarget : 0.0 V Varef : 0.0 V Oscillator : Off SCK period : 0.1 us avrdude: PAGEL and BS2 signals not defined in the configuration file for part ATtiny13, using dummy values avrdude: AVR device initialized and ready to accept instructions Reading | ################################################## | 100% 0.01s avrdude: Device signature = 0x000000 (retrying) Reading | ################################################## | 100% 0.02s avrdude: Device signature = 0x000000 (retrying) Ошибка при записи загрузчика. Reading | ################################################## | 100% 0.01s avrdude: Device signature = 0x000000 avrdude: Yikes! Invalid device signature. Double check connections and try again, or use -F to override this check. avrdude done. Thank you. Опция -F, которую предлагает avrdude, не помогает. Пробовал менять битрейт (опция -b), но в таком случае выдаёт ошибку stk500_getsync, что обычно бывает, если битрейт выбран неправильно.
      Судя по фьюзам http://www.engbedded.com/fusecalc/, я просто убрал CKDIV8, что должно ускорить внутренний таймер в 8 раз, и убрал флаг CKSEL0, что вместе со снятым CKSEL1 устанавливает частоту контроллера в 128 КГц (вместо заводских 9.6 МГц). Вобще ничего не говорит о том, что контроллер залочился. Приконнекчен к программатору по такой схеме

      Причём, до замены фьюзов работало и без кондёра. А после не работает и с ним.
      Что можно попробовать? Можно ли вернуть контроллер к заводским настройкам и как вобще поменять внутреннюю скорость таймера без таких вот багов?
    • Автор: daiver
      Добрый день, возникла неприятная проблема с фьюзами. Первоначаль у меня была схема с контроллером AtMega8 с кварцевым резонатором на 16Mhz. Мне пришлось сменить Atmega8 на Atmega168. Но тут возникла проблема с прошивкой. Первоначально фьюзы CKSEL3..0 были выставлены в 0010. то есть частота от внутреннего источника. С помощью Uniprof я прошил эти фьюзы на 0101. Теперь контроллер не откликается и не работает. Умер... соответственно фьзы обратно прошить не могу.
      Программатор Громмова, чтобы прошить я вытаскиваю контроллер из моей сзхемы и вставляю в программатор, кварцевого резонатора в программаторе нет.
      Можно ли реанимировать устройство?
    • Автор: Wabbs_2016
      Доброго Всем! Выяснилась проблема при дебаггинге в Atmel Studio 7, пропала желтая стрелочка отслеживающая положение дебаггера.
    • 5
      Автор: Гость Иван
      Собирая данную игрушку http://cxem.net/avto...onics/4-127.php
      я наткнулся на следующую проблему:
      программатор Pic k150
      МК Pic16f628
      устанавливаю на ЗИФку программатора как показанно на рисунке в окне программы DIY K150
      Нажимаю "Program"
      МК шьется, но в конце вылезает алерт "Error"

      Фьюзы ни как не настраивал... как я понял при настройке "Auto Updata Files" фьюзы автоматически выставляются, согласно предуставновкам в прошивке

      при нажатии на кнопку "Fuses" появляется следующее окно (из него я как раз и понял, что описал выше про Auto Updata Files)

      В итоге я имею прошитый МК, но схема работает не правильно
      Правильный алгоритм
      А у меня при коротком нажатии ничего не происходит.... при длительном (через 1.5 - 2 сек.)
      КН1 - крякалка,
      КН2 - Сирена № 1 , при следующем тоже Сирена № 1
      КН3 - окончание сирены
      пока удерживаю кнопки... как только кнопку отпустишь, звук пропадает
      связанно ли это свыше описанной ошибкой и как с ней бороться?
      другие прошивки на 16F628 - программатор шьет на ура
      Программатор покупной
    • Автор: Dmitriy_2214
      Всем привет!
      Ну, кто тут начинает осваивать AVRки?
      Тогда вам просто необходимо обезопасить себя от первых неудачных экспериментов с фьюзами.
      Представляю свою версию Atmega fusebit doctor

      Есть несколько собранных экземпляров. Небольшая платка в SMD + разноцветный шлейф с подписанными пинами. Также есть адаптеры для подключения контроллеров в DIP и TQFP корпусах. Всё проверено, работает.
      Цена устройства 800р.
      Москва, доставка в регионы почтой и транспортными компаниями.
      Пишите в личку либо на dklab24(гав)gmail.com