Помогите разобраться, поведение портов Attiny2313
Добавлено: Вс апр 13, 2014 11:09:10
Добрый день! Пишу программу для управления с 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--;
}