Помогите разобраться, поведение портов Attiny2313

Обсуждаем контроллеры компании Atmel.
Ответить
VadGP
Родился
Сообщения: 7
Зарегистрирован: Пн янв 17, 2011 07:02:35

Помогите разобраться, поведение портов Attiny2313

Сообщение VadGP »

Добрый день! Пишу программу для управления с attiny2313 8ю светодиодами (на 5в) и выход на базу транзистора по таймеру. Соответственно- время задается фиксированное 5ти позиционным механическим переключателем, когда приходит 5в, взятые с L7805cv, на порты pb7..pb3 - задается время от 2.5 минут до 12.5 минут. Сигнал на pb2, взятый оттуда же, скоммутирован на механическую кнопку(только замыкание) - это старт работы устройства. Сигнал на pb1 - стоп устройства (берется оттуда же). Так вот при эмулировании в протеусе, задаю порт pb7..pb3 - все ок, подаю на pb2 5 вольт, начинает тикать. Но есть подаю на pb1(стоп устройства) сигнал, только выходные порты начинают переключаться с непонятным законом, хотя должны были просто обнулится. Друзья подскажите пожалуйста, что я не так делаю. Спасибо.


Спойлер

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

#include <avr/io.h>
#include <avr/interrupt.h>
#define F_CPU 8000000L
#define start_timer 34285//1 секунда
#define time150 150//2,5 минуты
#define time300 300
#define time450 450
#define time600 600
#define time750 750
#define set150B 7
#define set300B 6
#define set450B 5
#define set600B 4
#define set750B 3
#define startB  2
#define stopB   1
#define inTransistorBaseB 0x01

#define diode1D 0x20
#define diode2A 0x02
#define diode3A 0x01
#define diode4D 0x01
#define diode5D 0x02
#define diode6D 0x04
#define diode7D 0x08
#define diode8D 0x10
int diodeTime[5][8]={
   {150,80,50,40,30,20,10,0},
   {300,200,150,100,60,30,10,0},
   {450,250,150,100,60,30,10,0},
   {600,300,150,100,60,30,10,0},
   {750,350,150,100,60,30,10,0}
      
};
int diode_time_id=0;
int timer=0;
int flag=0;
int flag_start=0;
int pinmask_diode[8]={diode1D,diode2A,diode3A,diode4D,diode5D,diode6D,diode7D,diode8D};

void interr() //функция инициализации прерываний
{
TCCR1B = (1<<CS12)|(0<<CS11)|(0<<CS10); //xtall/256
TIMSK |= (1<<TOIE1);
TCNT1 = start_timer;
}
// главная функция
int main(void)
{
   // Конфигурируем порты на вход/выход
   //Порт Б   DDRB 00000001
   DDRB=0x01;
   PINB=0x00;
   PORTB=0x00;

   //Порт D, выход -0,1,2,3,4, 5 = 00111111
   DDRD=0x3f;
   PIND=0x00;
   PORTD=0x00;
   
   //Порт A, выход 00000111
   DDRA=0x07;
   PINA=0x00;
   PORTA=0x00;
   
   interr();
   cli();

   while(1)
   {
      if(timer==0 && flag_start==0){
      if(PINB & 1<< set150B) {
         timer=time150;
         diode_time_id=0;}
      if(PINB & 1<< set300B){
          timer=time300;
          diode_time_id=1;}
      if(PINB & 1<< set450B){
          timer=time450;
          diode_time_id=2;
      }
      if(PINB & 1<< set600B) {
         timer=time600;
         diode_time_id=3;}
      if(PINB & 1<< set750B){
       timer=time750;
       diode_time_id=4;}
      }
      if(PINB & 1<< startB)
      {
         flag_start=1;
         sei();
      }
      if(flag_start==0)
      timer=0;
      
      while(flag_start==1){
         sei();
   
      if(timer<=diodeTime[diode_time_id][0])
      PORTD|=pinmask_diode[0];
      for(int i=1;i<3;i++)
         if(timer<=diodeTime[diode_time_id][i])
         PORTA|=pinmask_diode[i];
      for(int i=3;i<8;i++)
         if(timer<diodeTime[diode_time_id][i])
         PORTD|=pinmask_diode[i];
      if(timer<1)
      PORTB |= inTransistorBaseB;
         if(PINB & 1<< stopB)
         {
            cli();
            flag_start=0;
            PORTB &=~ inTransistorBaseB;
            PORTA&=~0x07;
            PORTD&=~0x3f;
            //timer=0;
         }
      }
   }
   return 0;
}
ISR( TIMER1_OVF_vect )
{
   TCNT1 = start_timer;
   timer--;
}
Реклама
VadGP
Родился
Сообщения: 7
Зарегистрирован: Пн янв 17, 2011 07:02:35

Re: Помогите разобраться, поведение портов Attiny2313

Сообщение VadGP »

Вопрос решен, в протеусе поставил подтягивающие резисторы на кнопки, тем самым получил нормальную работу кнопок.
Реклама
Ответить

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