Страница 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;" и радуйтесь.

Большое спасибо, все заработало.