Помогите разобраться, поведение портов 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»