• Объявления

    • admin

      Просьба всем принять участие!   24.11.2017

      На форуме разыгрывается спектроанализатор Arinst SSA-TG LC (цена 18500 руб). Просьба всем перейти по ссылке ниже и принять участие!
a_sergeevich

Язык Си Для Микроконтроллеров

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

antzol    2
Дайте "ХОРОШУЮ" книжку по Си!

Книжка Кернигана и Ритчи не подойдёт? :)

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


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

Быстрый заказ печатных плат

Полный цикл производства PCB по низким ценам!

  • x
    мм
Заказать Получить купон на $5.00
Lev@    1

Не знаю, Вам виднее - понять можно когда прочитаешь... Давай - буду читать!

Изменено пользователем Lev@

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


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

Alex

Фенкс, за подсказочку, но я уже сам по немногу дошёл до этого :) У меня тут кое какие идеи другие появились по поводу моей защиты, пока думаю.

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


Ссылка на сообщение
Поделиться на других сайтах
Lev@    1
Книжка Кернигана и Ритчи не подойдёт? :)

Скачал, будем изучать!

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


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

Всем доброго времени суток. У меня возник вопрос, правда он не совсем по теме, но я надеюсь что вы меня просвятите. Так вот: компиляторы micro_c по умолчанию ограничиваю код, по-моему, до 2000 слов. Кряк, который приведен в архиве http://a_sergeevich.nxt.ru/microC.zip решает эту проблему?

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


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

Так сидел тут изучал работу АЦП, ну и развил немного это изучение в конструкцию.

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

напряжение на аналоговые входы, короче если их крутить по разному можно получить кучу разных эффектов :).

Если добавить третий резистор и задействовать остаток порта B и чуток порта C можно увеличить кол-во эффектов и гирлянд.

Вообще это можно оформить в виде платы с ключами для гирлянд и панелькой под МК и просто перед НГ прошил МК

поставил, погонял, потом вытащил МК и дальше эксперементировать, ну чтобы МК не лежал без дела целый год :)

Так в архиве исходник, прошивка, проект для микроСи и проект для протеуса.

Прошу сильно не пинать и не кричать я просто продолжаю работать над своей защитой для УМЗЧ, а это побочный эффект от процесса изучения разных узлов МК. По защите в принципе блоки управления

вентиляторами готовы, есть софт старт, сейчас думаю защиту от постоянки делать на АЦП или как у меня сейчас

RC-цепь -> транзисторы, которые при появлении постоянки открываются и садят вход МК на землю, ну а он уже дальше отрабатывает.

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

НЗ-НО. При включении уся вход его отключен от источника сигнала и посажен контактами реле на землю, через 5 сек после

подачи питания включаются ( если всё ок ) реле АС, которые от блока защиты от постоянки, затем через 3-5 сек включаются реле

подсоединяя вход УМЗЧ к источнику сигнала и отключая его от земли. Всё это будет защищать от сваривания контактов реле

при включении УМЗЧ на полной громкости.

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

Да защиту от зависания МК решил сделать железно - софтовую, а именно поставлю генератор импульсов на ЛА7 и счетчик на ИЕ8, задача МК будет переодически подавать сигнал сброса на ИЕ8 и обнулять её, если этого не произойдёт ИЕ8 досчитает до конца и включит цепь сброса МК, как думаете нормально или проще собаку задействовать ?

Ещё, может кто подскажет как защиту от КЗ забацать, желательно схемку и чтобы сигнал в МК завести.

Кстати блоки программы по готовым узлам уже проверил в железе на макетке, всё работает как часы :)

Да чуть не забыл новогодняя мигалка: noviy_god.rar

У кого будут вопросы задавайте отвечу по мере возможностей и знаний :)

Изменено пользователем a_sergeevich

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


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

Начал потихоньку изучать микроСи. Первой под нож пошла прога для енкодера:

int REG6, REG7; // Регистры состояния соотв. входов МК
int FL6, FL7; // Регистры флагов изменения состояния выводов порта

void interrupt() {   // Обработчик прерываний
if (INTCON.RBIF=0) return; // Проверим, из-за чего произошло прерывание
INTCON.GIE=0; //Запрет всех прерываний
if (PORTB.RB6!=REG6){  // Проверка изменения сигнала на RB6
FL6=1;  //Установить флаг прерывания от соотв. входа RB6
  if (FL7=1) {
  PORTB.RB2=1;
  delay_ms (1);
  PORTB.RB2=0;
  FL6=0;
  FL7=0;
  }
}
if (PORTB.RB7!=REG7){   // Проверка изменения сигнала на RB7
FL7=1;  //Установить флаг прерывания от соотв. входа RB6
  if (FL6=1) {
  PORTB.RB3=1;
  delay_ms (1);
  PORTB.RB3=0;
  FL6=0;
  FL7=0;
  }
}
}

void main() {
TRISB=0b00001111; //Направление порта В
OPTION_REG=0b10000000;  //Подтягив. резисторы
L1: if (PORTB.RB7!=PORTB.RB6) goto L1 //Проверка исходного состояния, ждем когда будет равенство

// Заносим исходное состояние портов

if (PORTB.RB6=1) REG6=1;
else REG6=0;
if (PORTB.RB7=1) REG7=1;
else REG7=0;
INTCON=0b10001000;

do{  // Безконечный цикл
;
}
while (1);
}

Просьба ГУРУ отреагировать...

Не понятно по цепочке IF и ее сочетанию с ";"

Изменено пользователем Lev@

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


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

Решил немного переделать вот эту часть:

if (PORTB.RB6!=REG6){ // Проверка изменения сигнала на RB6
FL6=1; //Установить флаг прерывания от соотв. входа RB6
if (FL7=1) {
PORTB.RB2=1;
delay_ms (1);
PORTB.RB2=0;
FL6=0;
FL7=0;
}
}
if (PORTB.RB7!=REG7){ // Проверка изменения сигнала на RB7
FL7=1; //Установить флаг прерывания от соотв. входа RB6
if (FL6=1) {
PORTB.RB3=1;
delay_ms (1);
PORTB.RB3=0;
FL6=0;
FL7=0;
}
}

на :

int func (int RBI,int REG,int RBO,int FL1,int FL2) {
if (RBI!=REG){   // Проверка изменения сигнала на RB7
FL1=1;  //Установить флаг прерывания от соотв. входа RB
  if (FL2=1) {
  RBO=1;
  delay_ms (1);
  RBO=0;
  FL1=0;
  FL2=0;
  }
}
}

............
func (PORTB.RB6, REG6, PORTB.RB2, FL6, FL7);
func (PORTB.RB7, REG7, PORTB.RB3, FL7, FL6);

Нужен помощь - не работает нигде - ни в PIC Emu, ни в Proteus... ЖУТЬ!

Изменено пользователем Lev@

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


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

Я конечно может, что не так понял, но в микроСи доступ к отдельным битам осуществляется в виде PORTB.F0...7 либо надо в начале программы переопределить например, #define PORTB.F6 RB6.

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

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


Ссылка на сообщение
Поделиться на других сайтах
Lev@    1
Я конечно может, что не так понял, но в микроСи доступ к отдельным битам осуществляется в виде PORTB.F0...7 либо надо в начале программы переопределить например, #define PORTB.F6 RB6.

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

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

ХЗ - у мну компилится... но при тесте на PIC Emu... зависает на постоянно прерыванию по RB4:7... почему - не понял!

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


Ссылка на сообщение
Поделиться на других сайтах
Alex    509
зависает на постоянно прерыванию по RB4:7...

А зачем Вы написали вот эту строку ?

if (INTCON.RBIF=0) return; // Проверим, из-за чего произошло прерывание

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

Вот он и виснет на этом месте.

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


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

Дык возврат если небыло прерывания по RB4:7, а если было то идет дальше обработчик!? ...?!

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


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

А кто вам сказал что вы сравниваете??? Я вижу что ты просто записываете 0!!! И как результат получите неизвестно что..

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


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

Ну во первых возврат не если не было прерывания, а если небыло изменений на RB4-7.

Любое изменение этих выводов приведёт к установке флага RBIF и не важно было разрешено прерывание или нет.

Во вторых, у Вас не условие получается, а присвоение биту INTCON.RBIF нуля.

Знак сравнения это два знака равно "==".

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


Ссылка на сообщение
Поделиться на других сайтах
Lev@    1
Знак сравнения это два знака равно "==".

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

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


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

У кого есть идеи:

- как определить изменение сигнала на выводе МК ?!

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


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

Да, код компилится в про-версии микроСи. И ещё в условиях надо знак = поменять на == как подсказал Alex.

Изменение сигнала на выводе можно определить либо по прерыванию от RB4-RB7 если нужно отслеживать 4 ноги ( в функции прерывания уже определять на какой именно ноге RB4 - RB7 произошло прерывание, либо в функции обработки прерывания выставить флаг, сбросить флаг прерывания и в основном цикле уже определить конкретный вход, сбросить флаг и всё), если одну то RB0 от входа INT, ну или тупо в условии делать проверку и крутить в основном цикле.

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


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

Так вот интересно, как определить на каком ИМЕННО выходе изменился сигнал? Мой пример с дополнительным регистром вроде работает, но может есть намного интересней идеи!?

... переделую прогу(правлю)... в PIC Emu IDE работает, но в Proteus - не совсем...

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


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

Можно сделать следующим образом, для определения на каком выводе RB4-RB7 произошло изменение сигнала, правда я ещё не проверял этот код т.к некогда было, чисто на бумаге "прогнал".

char flag = 0, j;
unsigned char sost_reg [4]; // массив куда будем записывать начальное состояние регистра
unsigned char sig_reg [4]; // массив куда будем записывать состояние регистра после изменения состояния на RB4-RB7
unsigned char tmp; //переменная для временного хранения
void zap_port ( unsigned char mass [] ); //функция для записи состояния битов порта в массив
void poisk_sig ( unsigned char mass [], unsigned mass2 [] ); //функция определения изменившегося бита
void copy_mass ( unsigned char mass [], unsigned mass2 [] );
void init ( void );//функция инициализации МК

void interrupt () // обработка прерывания по изменению уровня на RB4-RB7
  {
	 if ( INTCON.RBIF )
		  { 
				 flag = 1;
				 INTCON.RBIF = 0;
		   }
   }
int main () 
 {
	  init ();
	  zap_port ( sost_reg ); //записываем начальное значение PORTB RB4-RB7
	  while (1)
			{
				if ( flag == 1 )//было прерывание уровень изменялся на в каком либо входе RB4-RB7 
					   {
						   zap_port ( sig_reg ); //записываем изменённое состояние RB4-RB7
						   poisk_sig ( sost_reg, sig_reg ); //определяем на каком из входов произошло изменение уровня
							//обрабатываем ситуацию в зависимости от того где изменился уровень
							switch (j)
								   {
									   case 0: if ( tmp ) то-то и то-то else то-то и то-то //для RB4
									   case 1: if ( tmp ) то-то и то-то else то-то и то-то //для RB5
									   case 2: if ( tmp ) то-то и то-то else то-то и то-то //для RB6  
									   case 3: if ( tmp ) то-то и то-то else то-то и то-то //для RB7
									}
							 copy_mass ( sost_reg, sis_reg );
							 flag = 0;
						 }
				 }
   }

void zap_port ( unsigned char mass [] )
			 {
				 unsigned char temp;
				 int i;
				 temp = PORTB >> 4;
				 for ( i=0; i < 4; i++ )
						{
							mass [i] = temp & 0b0001;
							temp = temp >> 1;
						 }
				 }

void poisk_sig ( unsigned char mass [], unsigned mass2 [] )
			 {
				 int i;
				 for ( i=0; i < 4; i++ )
						 {
							 if ( mass [i] != mass2 [i] ) { j = i; tmp = mass2 [i]; }
						  }
			   }
void copy_mass ( unsigned char mass [], unsigned mass2 [] )
			 {
				 int i;
				 for ( i=0; i < 4; i++ )
						   {
							  mass [i] = mass2 [i];
							}
			   }

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

Может где-то и есть ошибки, так что смотри внимательнее я проверял код только на бумаге, составляя трассировочные таблици в ручную, может компилятор где-то думает иначе :) Может вообще работать не будет :) .

Я ж тоже только учусь :P

Изменено пользователем wowa

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


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

Чесно?! Я ни х...Х... не понял! ... я так далеко еще не прочитал книжку! Мя покаместь +/- и тд.

Кста case - как я занего мог забыть!

Лады - задача усложняется! - Два энкодера + на них еще и по кнопке! Крутилки будут сидеть на RB4:7, а кнопки на RB1:2 и через диодную развязку на RB0... пошел писать.

Первые идеи:

Читаем порт В в доп регистр - R1 при прерывании X = PORTB XOR R1, узнаем по какой причине произошло изменение(RB0 или RB4:7) и в зависимости от этого заносим в доп рег R2 очищеную часть = X and 0000 1111(или 1111 0000) а дальше дело техники оператор case и тд...

Думаю получится...

ЗЫ. Компилятор действительно думает по другому! - нехочет работать... -

0 102 Finished (with errors): 10 дек 2009, 23:23:57 04.mcppi
Изменено пользователем Lev@

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


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

Я же сказал могут быть ошибки, вот исправленный

char flag = 0, j;
unsigned char sost_reg [4]; // массив куда будем записывать начальное состояние регистра
unsigned char sig_reg [4]; // массив куда будем записывать состояние регистра после изменения состояния на RB4-RB7
unsigned char tmp; //переменная для временного хранения
void zap_port ( unsigned char mass [] ); //функция для записи состояния битов порта в массив
void poisk_sig ( unsigned char mass [], unsigned mass2 [] ); //функция определения изменившегося бита
void copy_mass ( unsigned char mass [], unsigned mass2 [] );
void init ( void );//функция инициализации МК

void interrupt () // обработка прерывания по изменению уровня на RB4-RB7
  {
	 if ( INTCON.RBIF )
		  { 
				 flag = 1;
				 INTCON.RBIF = 0;
		   }
   }
int main () 
 {
	  init ();
	  zap_port ( sost_reg ); //записываем начальное значение PORTB RB4-RB7
	  while (1)
			{
				if ( flag == 1 )//было прерывание уровень изменялся на в каком либо входе RB4-RB7 
					   {
						   zap_port ( sig_reg ); //записываем изменённое состояние RB4-RB7
						   poisk_sig ( sost_reg, sig_reg ); //определяем на каком из входов произошло изменение уровня
							//обрабатываем ситуацию в зависимости от того где изменился уровень
							switch (j)
								   {
									   case 0: if ( tmp ) то-то  else то-то;break;//для RB4
									   case 1: if ( tmp ) то-то else то-то;break; //для RB5
									   case 2: if ( tmp ) то-то else то-то;break; //для RB6  
									   case 3: if ( tmp ) то-то else то-то;break; //для RB7
									}
							 copy_mass ( sost_reg, sig_reg );
							 flag = 0;
						 }
				 }
   }

void zap_port ( unsigned char mass [] )
			 {
				 unsigned char temp;
				 int i;
				 temp = PORTB >> 4;
				 for ( i=0; i < 4; i++ )
						{
							mass [i] = temp & 0b0001;
							temp = temp >> 1;
						 }
				 }

void poisk_sig ( unsigned char mass [], unsigned mass2 [] )
			 {
				 int i;
				 for ( i=0; i < 4; i++ )
						 {
							 if ( mass [i] != mass2 [i] ) { j = i; tmp = mass2 [i]; }
						  }
			   }
void copy_mass ( unsigned char mass [], unsigned mass2 [] )
			 {
				 int i;
				 for ( i=0; i < 4; i++ )
						   {
							  mass [i] = mass2 [i];
							}
			   }

Забыл про операторы break и название массива в функции написал sis_reg вместо sig_reg ;)

Счас попробовал скомпилить всё ок. И ещё функцию init () не забудь описать для своего МК.

Смысл кода такой. В начале мы записываем начальное состояние RB4-RB7 в массив zap_port ( sost_reg ); и уходим в цикл где ждём прерывания по изменению состояния RB4-RB7. Если произошло прерывание выставляем в обработчике флаг flag = 1; и начинаем выяснять на каком входе конкретно изменился уровень.Для этого мы в другой массив записываем состояние RB4-RB7 zap_port ( sig_reg ); Затем в функции poisk_sig ( sost_reg, sig_reg ); сравниваем массивы в одном из которых sost_reg записано начальное состояние в другом sig_reg действующее, находим номер изменённого входа, а также как он изменился с 1 на 0 или с 0 на 1, выполняем нужные действия в switch..case

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

copy_mass ( sost_reg, sig_reg );

flag = 0;

всё.

Изменено пользователем wowa
Для длинного кода используйте CODEBOX !!! Wowa.

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


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

Не обезательно знать как изменился сигнал: с 0 на 1 или с 1 на 0 - главно знать ГДЕ он изменился и в какой последовательности Вывод1 потом Вывод2 или наоборот - т.е. вращаем вправо или влево...

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


Ссылка на сообщение
Поделиться на других сайтах
Не обезательно знать как изменился сигнал: с 0 на 1 или с 1 на 0 - главно знать ГДЕ он изменился и в какой последовательности Вывод1 потом Вывод2 или наоборот

Ну как раз тут мы и узнаём ГДЕ он изменился, а последовательность изменения и действия прописываем в switch..case. Ну как-то так.

Изменено пользователем a_sergeevich

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


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

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

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

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

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

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

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

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Загрузка...

  • Похожие публикации

    • Автор: Артемон
      Всем привет. Просьба посодействовать в исправлении кода для термометра. Так как сам я в этом новичек, то код собирал из трех чужих проектов. Реализация такова, подключение термопары через микруху Max6675 к Atmega и вывод данных на LCD экран. В архиве прилагаю проект Atme Studio 7 и принт скрин из Протеуса. Ошибка заключается в неправильных показаниях температуры

      Test1.rar
      Вот код, чтоб не скачивать проект.

      #define F_CPU 1000000UL #include <util/delay.h> #include <avr/io.h> #include "max6675.h" #include "LCD.h" uint16_t gettemp(void); //Funktionsdeklarationen void initavr(void); //gettemp () returns absolute Temperature in Temp * 4 °C - in 1/4°-steps // uint16_t gettemp(void){ //Temperatur holen. uint8_t bit = 0, bitnr = 12; //Variablen uint8_t foo1 = 0; uint16_t Rohdata = 0; CS_Port &= ~(1 << CS); //Chip select anlegen for(foo1 = 0 ; foo1 < 16 ; foo1++){ //16 Bits einlesen bit = 15 - foo1; //Die Aktuelle Bitnr berechnen. SCK_Port |= (1 << SCK); //SCK hi if((bit <= 14) && (bit >= 3)){ //Einfach mal die 12 relevanten von den 16 Bits ausfiltern if((SO_Pin & (1 << SO))){ //WENN SO 1 ist, dann... bitnr--; //zдhlen wir runter... Rohdata |= (1 << bitnr); // und schieben eine 1 an bit x }else{ //WENN dem NICHT so ist, dann... bitnr--; //zдhlen wir runter... Rohdata &= ~(1 << bitnr); //und schieben eine 0 an bit x } }else{ //weis au nimmer, was das soll. bitnr = 12; } SCK_Port &= ~(1 << SCK); //SCK LO } CS_Port |= (1 << CS); //CS HI //Alles auf Standardkonfig. return Rohdata; //Das ist doch mal was ;D } // getTC() returns 0 if Thermocouple is not connected, 255 if thermocuple is connected // (to enable this feature T- must be connected to GND) uint8_t getTC(void){ //Temperatur holen. //Variablen uint8_t TC = 0; uint8_t foo1 = 0; CS_Port &= ~(1 << CS); //Chip select anlegen for(foo1 = 0 ; foo1 < 16 ; foo1++){ //16 Bits einlesen //Die Aktuelle Bitnr berechnen. SCK_Port |= (1 << SCK); //SCK hi if(foo1 == 2){ //das 3. bit ist fьr uns relevant. if((SO_Pin & (1 << SO))){ //WENN SO 1 ist, dann... TC = 0; }else{ //WENN dem NICHT so ist, dann... TC = 255; } } SCK_Port &= ~(1 << SCK); //SCK LO } CS_Port |= (1 << CS); //CS HI //Alles auf Standardkonfig. return TC; //Das ist doch mal was ;D } //Initiates the MAX6675 and IO-pins void init_6675(void){ //AVR initialisieren SO_DDR &= ~(1 << SO); CS_DDR |= (1 << CS); SCK_DDR |= (1 << SCK); //IOs setzen SO_Port |= (1<<SO); //Pullups an. (Wichtig fьr MAX6675, der kann nicht anders, hab ich festgestellt... CS_Port |= (1 << CS); //CS HI //Alles auf Standardkonfig. SCK_Port &= ~(1 << SCK); //SCK LO } int main(void) { init_port();// инициализируем порт ЖКИ lcd_init();// инициализируем ЖКИ init_6675(); while (1) { char buffer[8]; int temp; temp = gettemp(); temp /=4; lcd_gotoxy(0,0);//перемещаем курсор в верхний левый угол sprintf(buffer, "t=%i\xdf\C ", temp); // так как тут не плавающая запятая то числа с запятой записываются так %i.%i, код градуса записывается так \xdf lcd_putstring(buffer); } }
      вставляете код пользуйтесь тегами [CОDE][/CОDE] редактора сообщений, кнопка <>
    • Автор: igoryan
      нужно ли обрабатывать RESET просто компилятор не видит RESET_vect?
    • Автор: P32L
      Натолкните на мысль пожалуйста.Смысл в следующем.Нужно изменять задержку(Delay) из EEPROM. Контроллер PIC , язык СИ.
      Как реализовать чтение числа из ипрома ? Если не затруднит, то кусочек кода был бы очень кстати.
    • Автор: Zver2011
      Здравствуйте! Недавно начал изучать МК AVR. Читаю книги Белова. Пользуюсь программами CVAVR и Proteus. По урокам, собирал все в железе. По готовым примерам кода конечно же мне легко учиться и все в принципе понятно из описания, хоть и в программировании не силен, но как только начинаешь создавать что то свое - начинаются проблемки.
      В общем я создаю что то вроде музыкального светильника, который должен включаться от звука (голоса). Датчик звука пытаюсь реализовать на компараторе, плавное включение света - ШИМ, а генерация мелодии (пищалки) благодаря таймеру Т1 и его прерыванию. Куски кода брал из разных чужих самоделок, вот только объединить не удается.
      В железе работает как будто цветомузыка какая-то. Мелодия не играет, Я думаю это из-за неправильной конфигурации компаратора, а также схемы. Вот это основной вопрос у меня. Ну и собственно основной цикл программы, там я думаю тоже накосячил.
      Помогите мне разобраться до конца, понять ошибки в коде, мне самому интересно вот только С - язык тяжеловатый на мой взгляд и без помощи знающих не обойтись))

      КОД.txt
    • Автор: sensey88
      Продам счетчики бета-гамма излучения новые заводская упаковка
      Си1Г (79г) 62 шт. 5000р
      Си21БГ (79г) 49 шт. 350р
      Си22БГ (79г) 70 шт. 700р
      Си3БГ (84г) 20 шт. 300р
      Си3БГ (78г) 46 шт. 250р
      Си3БГ (77г) 10 шт. 250р
      Си3БГ (79г) 18 шт. 250р
      Си3БГ (75г) 10 шт. 200р
      Си37Г (80г) 40 шт. 400р
      Си37Г (76г) 24 шт. 350р
      Си37Г (79г) 16 шт. 350р
      Си33Г (78г) 28 шт. 450р
      Си33Г (77г) 15 шт. 450р
      СБТ13 (78г) 2 шт. 3000р
      СБТ13 (76г) 3 шт. 2700р
      СБТ13 (69г) 3 шт 2500р.
      Си8Б (79г) 1 шт. 2500р
      Си8Б (78г) 1 шт. 2500р
      СБТ10 (79г) 3 шт. 4500р
      8 (910) 7051241 Евгений
      bishop-x@yandex.ru