Страница 1 из 1

Программирование WinAVR ATMEGA8

Добавлено: Сб май 05, 2012 22:26:26
Alexander H
Помогите разобраться с программой
Уже запарился

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

#include <avr/io.h>
#include <avr/interrupt.h>

char time=0;
	
ISR (TIMER1_OVF_vect)
{
	TCNT1=49911;
	if (time) time--; else PORTC=0x00;
}

int main (void) {
	DDRC=0xFF; PORTC=0x00;
	DDRB=0x00; PORTB=0xFF;
	
	TCCR1A=0;
	TCCR1B=(1<<CS11)|(1<<CS10);
	TCNT1=49911;
	TIFR=0;
	TIMSK=(1<<TOIE1);
	sei();
	
while(1)
{
	if ((~PINB)&(0b00000001))
		if (!time)
		{
			time=5;
			PORTC=0xFF;
			TCNT1=49911;
			}
    }                   
}
При нажатии на кнопку на порт-С подается + на 5 сек.

Проблемма: при повторном нажатии ничего не происходит.
Изображение

Re: Программирование WinAVR ATMEGA8

Добавлено: Вс май 06, 2012 00:04:20
Antifritz
Уберите строку

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

if (!time)
и будет Вам счастье. Или в чем суть вопроса?

Re: Программирование WinAVR ATMEGA8

Добавлено: Вс май 06, 2012 00:43:35
SubDia
Подтянуть вывод PB0 к питанию через резистор. А еще лучше - кнопку к питанию через резистор, а вывод PB0 подтянуть к земле. Точнее, точку соединения PB0 и кнопки.
Тогда на PB0 при отжатой кнопке будет постоянно 0, а при нажатии будет появляться 1.
И условие примет вид

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

if (PINB&0x01)
{...}

Re: Программирование WinAVR ATMEGA8

Добавлено: Вс май 06, 2012 00:52:18
watchmaker
Подтянуть вывод PB0 к питанию через резистор. А еще лучше - кнопку к питанию через резистор
Первый вариант проще, он реализуется внутренними средствами МК. Поставить DDRB0=0, PORTB0=1 и всё.

Re: Программирование WinAVR ATMEGA8

Добавлено: Вс май 06, 2012 01:02:24
SubDia
Верно. Я даже не обратил внимания, что у ТС это и реализовано. Пардоньте, мсье. =)))

Re: Программирование WinAVR ATMEGA8

Добавлено: Вс май 06, 2012 07:57:46
Alexander H
Antifritz писал(а):Уберите строку

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

if (!time)
и будет Вам счастье. Или в чем суть вопроса?
Эта программа только часть кода от другой.
Я ее упростил только из-за этой проблеммы.
Так что это условие мне необходимо.
Проблемма как раз в этом условии.
Почему?

Re: Программирование WinAVR ATMEGA8

Добавлено: Вс май 06, 2012 11:30:31
andries5
Обьявите переменную "char time=0;" как "volatile char time=0;" и радуйтесь.

Re: Программирование WinAVR ATMEGA8

Добавлено: Вс май 06, 2012 14:55:02
Alexander H
andries5 писал(а):Обьявите переменную "char time=0;" как "volatile char time=0;" и радуйтесь.
Большое спасибо, все заработало.