Программирование микроконтроллера на Cи

Обсуждаем контроллеры компании Atmel.
Закрыто
drac0Sha
Первый раз сказал Мяу!
Сообщения: 25
Зарегистрирован: Вт окт 09, 2012 14:09:39

Программирование микроконтроллера на Cи

Сообщение drac0Sha »

Здравствуйте, возникла проблема с программирование под ATmega128 :
1. Мне нужно в программе взаимодействовать с двумя кнопками, но почему то по одной получается, а когда задаю обе, то симулятор вообще никак не реагирует на нажатия
Т.е. если сделать в инициализации :

Код: Выделить всё

DDRB = (0<<PB5)|(0<<PB6);
	PORTB = (1<<PB5)|(1<<PB6);
то симулятор не будет реагировать на нажатие, ни кнопки PB6, ни кнопки PB5. А если сделать :

Код: Выделить всё

 
DDRB = (0<<PB5);
	PORTB = (1<<PB5);
То с PB5 все будет хорошо работать, аналогично если оставить только PB6.
2. Мне нужно по нажатию кнопки изменять частоту мигания на 40 процентов ( либо в большую сторону, либо в меньшую сторону, в зависимости от нажатой кнопки).
К сожалению такие записи, как у меня сейчас Frequency_yellow = 65536 - 800000/1024/2; - не катят. Нужно написать алгоритм, при котором частота сама высчитывалась
я пробовал так, чтобы уменьшить на 40 процентов.

Код: Выделить всё

Frequency_yellow_temp_first = Frequency_yellow / 4;
Frequency_yellow_temp_second = Frequency_yellow /8;
Frequency_yellow_temp_three = Frequency_yellow /16;
Frequency_yellow_percent = Frequency_yellow /4 + Frequency_yellow /8 + Frequency_yellow /16;
Frequency_yellow  = Frequency_yellow  - Frequency_yellow_percent;
Но так не работает.
Вот условие :Разработать программу, реализующую генератор изменяемой частоты. Начальная частота – 0.5 Гц, т.е. желтый индикатор 1 с горит, 1 с не горит и т.д. Нажатие кнопки 1 приводит к увеличению частоты на 40%, нажатие кнопки 2 уменьшает частоту на 40%. Для облегчения замера частот использовать красный и зеленый индикаторы: красный должен мигать с частотой в 10 раз большей основной частоты (желтого индикатора), а зеленый должен мигать с частотой в 10 раз меньше основной. Одновременное нажатие обеих кнопок должно возвращать генератор в исходное состояние – 0.5 Гц
Код

Код: Выделить всё

// инициализация
void Ititual(){
// красная лампочка
	DDRE = (1<<PE1)|(1<<PE2)|(1<<PE3); 
	PORTE = (1<<PE1)|(1<<PE2)|(1<<PE3);
// кнопка
	DDRB = (0<<PB5)|(0<<PB6);
	PORTB = (1<<PB5)|(1<<PB6);
// предделитель наймера 1024
	TCCR1B = (1<<CS00)|(0<<CS01)|(1<<CS02);
// прерывание поп переполнению таймера.
	TIMSK = (1<<OCIE1B);
	

	TCNT1 = 65536 - 800000/1024/8;
	sei();
	Step = 1;
	UBRR1H = 0;
	UBRR1L = 51;
	step_inc=0;
	step_dec=0;

	//разрешаем прием-передачу
	UCSR1B = (1<<RXEN1)|(1<<TXEN1)|(1<<RXCIE1)|(0<<TXCIE1);
	
	//устанавливаем асинхронный режим работы и формат посылки: 8 бит, 1 стопповый бит
	UCSR1C = (0<<USBS1)|(1<<UCSZ10)|(1<<UCSZ11)|(0<<UCSZ12)|(0 << UMSEL1)|(0<<UPM10)|(0<<UPM11);

}
// обработка нажатия кнопки
void button_on_inc(){
	button = 1; // теперь кнопка нажата
     Send_Status(Button_was_pressed); // сообщили о нажатии кнопки
    step_inc ++;
}
void button_on_dec(){
	button = 2; // теперь кнопка нажата
	Send_Status(Button_was_pressed); // сообщили о нажатии кнопки
 step_dec++;
}

// мигание лампочки

void switch_lamp_yellow (){
	TCNT1 = Frequency_yellow;

	if ((PINB && (1<<PB6)) == (0<<PB6)){ // проверяем нажатие кнопки
		button_on_inc(); // если нажата, меняем время
	}
	if ((PINB && (1<<PB5)) == (0<<PB5)){ // проверяем нажатие кнопки
		button_on_dec(); // если нажата, меняем время
	}
	PORTE = PINE^(1<<PE3);
		if (Count_time_seconds == 10) {
		PORTE = PINE^(1<<PE2);
		Count_time_seconds = 0;
		Count_time_seconds_red++;
		if (Count_time_seconds_red == 10) {
			PORTE = PINE^(1<<PE1);
     		Count_time_seconds_red=0;
					}
			}
	Count_time_seconds++; // шаг сделан
}

SIGNAL(SIG_OUTPUT_COMPARE1B){
	switch(Step){
		case 1:
			if (button == 0){ // если не нажата кнопка
			Frequency_yellow = 65536 - 800000/1024/8; // 0.5 ghz
			switch_lamp_yellow(); // помигали лампочклй
		
	}	
	// переходим по нажатию кнопки 
	if (button == 1) {
//ВОТ ТУТ ДОЛЖНО БЫТЬ УМЕНЬШЕНИЕ ЧАСТОТЫ, ТАКИЕ ЗАПИСИ НЕ КАТЯТ.
			if (step_inc == 1 ) {
			Frequency_yellow = 65536 - 800000/1024/4;
			} 
			if (step_inc == 2) {
				Frequency_yellow = 65536 - 800000/1024/2;
			}
			if (step_inc == 3) {
				Frequency_yellow = 65536 - 800000/1024;
			}
			if (step_inc == 4) {
				Frequency_yellow = 65536 - 800000/256;
			}
			if (step_inc == 5) {
				Frequency_yellow = 65536 - 800000/128;
			}
			if (step_inc == 6) {
				Frequency_yellow = 65536 - 800000/64;
			}
			if (step_inc == 7) {
				Frequency_yellow = 65536 - 800000/32;
			}
		
	}
	if (button == 2){
//ТУТ ДОЛЖНО БЫТЬ УВЕЛИЧЕНИЕ ЧАСТОТЫ
		Frequency_yellow = 65536 - 800000/1024/32;
	switch_lamp_yellow();
	}
	}	
}
// прерывание при получении данных по USART
SIGNAL (SIG_USART1_RECV)
{
	Add_byte_to_queue(UDR1);
}

// главная программа
int main()
{
	Ititual(); // инициализация
	while (1){ // бесконечный цикл
		Work_command();
	}
	return 0;
}
Подскажите, пожалуйста
Реклама
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: Программирование микроконтроллера на Cи

Сообщение urry »

это что такое ?
Frequency_yellow_percent = Frequency_yellow /4 + Frequency_yellow /8 + Frequency_yellow /16;
обоснуйте формулу, плиз.
увеличить на 40% - это текущее значение частоты умножить на 1.4 и ничего более.
формула определения значения таймера при переполнении уже есть
tmr1=65536- Fin/Fout, где Fin - частота входящая на таймер,Fout - требуемая частота.
Единственное уточнения - для получения меандра по прерыванию частота должна быть в 2 раза выше.
Как бы уже не первый раз с этим вопросом выходите...
Реклама
drac0Sha
Первый раз сказал Мяу!
Сообщения: 25
Зарегистрирован: Вт окт 09, 2012 14:09:39

Re: Программирование микроконтроллера на Cи

Сообщение drac0Sha »

Ты предлагаешь для увеличения частоты
Frequency_yellow = Frequency_yellow*1.4 ; ?
Так ?
BigCryziMashinGan
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Чт ноя 20, 2008 20:02:30

Re: Программирование микроконтроллера на Cи

Сообщение BigCryziMashinGan »

drac0Sha писал(а):Ты предлагаешь для увеличения частоты
Frequency_yellow = Frequency_yellow*1.4 ; ?
Так ?
Да.
Реклама
Эиком - электронные компоненты и радиодетали
drac0Sha
Первый раз сказал Мяу!
Сообщения: 25
Зарегистрирован: Вт окт 09, 2012 14:09:39

Re: Программирование микроконтроллера на Cи

Сообщение drac0Sha »

попробовал Frequency_yellow = Frequency_yellow * 1.4; - не работает . Вот, например на умножение на целое число (на 2) работает.
Реклама
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Программирование микроконтроллера на Cи

Сообщение Аlex »

Логику включите, блин. В таком случае, у Вас, эта переменная - целочисленная. Как её можно умножить напрямую на нецелое число ?
Делайте её с плавающей или фиксированной точкой. Либо число 1.4 представьте в виде дроби, в числителе которой будет целое число.
Рановато Вы полезли в программирование. Да и тема по Си уже существует - постите туда.
Реклама
Закрыто

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