Нужна помощь. Вместо 52 поставил мегу8515. Пограмма выстовляет и контролирует кол-во оборотов двигателя. Контр и стабилизирует Скорость двигателя. Светодиодный индикатор и 6 кнопок. Кнопки работают на отпускание (программно). Последние две key1 5 и 6 бит глючат. Срабатывают постоянно. И проблема с инт0 (пока отключен) тоже считает как бешенный а не по перепаду. Среда разработки последнии АВР студия и ВИНАВР #include <avr/io.h> #include <avr/interrupt.h> #include <stdio.h> #include <string.h> #include <avr/eeprom.h> #include <avr/sfr_defs.h>
#define Bit(n) (1<<(n)) // p |= Bit(n) установка бита в порту, p &= ~Bit(n) Сброс бита в пору, // if((p & Bit(n))!=0) для проверки бита в порту, p ^=Bit(n) инвертировать бит в порту #define F_CPU 12000000UL // частота процессора
unsigned int tim_1 = 0, tim_2 = 0, tim_025, t_imp, tim_i; static char seg[5]; //масив для хранения числа выводимого на индикатор static unsigned char seg_c = 0; //номер выводимого индикатор static unsigned char key_o, key_n, key1, m; static unsigned char rezim, napr; static unsigned int znach, znach_1;
uint8_t *eeadr; //static unsigned long int rpm;
//napr 0- ;1- ; 2- ; 3- ; 4- ; 5- ; 6- ; 7- ;
unsigned int uvel_100(unsigned int c) { if((c/100) < 99) c = c + 100; else c = c - 9900; return c; }
unsigned int uvel_10(unsigned int c) { if((c%100) < 99) c++; else c = c - 99; return c; }
unsigned int umen_100(unsigned int c) { if((c/100) > 0) c = c - 100; else c = c + 9900; return c; } unsigned int umen_10(unsigned int c) { if((c%100) >0) c--; else c = c + 99; return c; }
void klava(void) { PORTB &= ~Bit(5); //отключить индикаторы PORTB &= ~Bit(1); PORTB &= ~Bit(2); PORTB &= ~Bit(3); PORTB &= ~Bit(4);
PORTA = seg[seg_c]; // вывод знака PORTA |=Bit(7); PORTD &= ~Bit(6); // строб записи PORTD |= Bit(6); // строб записи
if((napr & Bit(3)) == 0) { if (seg_c == 0) {PORTB |= Bit(1);} else {PORTB &=~Bit(1);} //включение соответствующего индикатора if (seg_c == 1) {PORTB |= Bit(5);} else {PORTB &=~Bit(5);} if (seg_c == 2) {PORTB |= Bit(2);} else {PORTB &=~Bit(2);} if (seg_c == 3) {PORTB |= Bit(3);} else {PORTB &=~Bit(3);} if (seg_c == 4) {PORTB |= Bit(4);} else {PORTB &=~Bit(4);} }
if ((PIND & Bit(0)) == 0) {key1 |= Bit(seg_c);} else {key1 &= ~Bit(seg_c);} // определяем какая нажата кнопка if ((PIND & Bit(1)) == 0) {key1 |= Bit(seg_c + 3);} else {key1 &= ~Bit(seg_c + 3);}
seg_c++; if(seg_c > 4) seg_c = 0; key_o = key_n; key_n = key1; if(key_n != key_o) //проверка удерживается ли клавиша { if(tim_1>50) { tim_1=0; if((key_o & Bit(0)) != 0) //нажата 1-я клавиша { if(rezim != 2) {rezim = 0; if((napr & Bit(0)) !=1) znach = uvel_10(znach); else znach = umen_10(znach);} } if((key_o & Bit(1)) != 0) //нажата 2-я клавиша сотые { if(rezim != 2) {rezim = 0; if((napr & Bit(0)) !=1) znach = uvel_100(znach); else znach = umen_100(znach);} } if((key_o & Bit(2)) != 0) //нажата 3-я клавиша десятые { if(rezim != 2) {rezim = 0; napr ^= Bit(0);} } if((key_o & Bit(5)) != 0) //нажата 4-я клавиша STOP { PORTC &=~ Bit(0); //выключить двигатель OCR0 = 0; if(rezim == 8) goto m1; if(rezim == 2) {rezim = 8; goto m1;} rezim = 2; } m1: if((key_o & Bit(4)) != 0) //нажата 5-я клавиша START { if(rezim != 2) {rezim = 1; PORTC |= Bit(0); //старт двигателя OCR0 = 0xF3; znach_1 = 0; napr |= Bit(1); write_data(); //для стопа } } if((key_o & Bit(3)) != 0) //нажата 6-я клавиша REC { if(rezim != 2) {rezim = 4; //4 PORTC |= Bit(0); //старт двигателя OCR0 = 0xF3; znach_1 = 0; tim_2 = 0; t_imp = 1; write_data(); } } }
} }
void inter0(void) { znach_1++; t_imp = tim_2; tim_2 = 0; if(t_imp > 200) OCR0++; if(t_imp < 200) OCR0--; if (znach == 0) { PORTC &=~ Bit(0); OCR0 = 0; GICR = 0b00000000; //запрешаем инт0 } if (znach_1 >= znach) { PORTC &=~ Bit(0); OCR0 = 0; GICR = 0b00000000; //запрешаем инт0 rezim = 2; //stop } }
ISR(TIMER1_COMPA_vect) { tim_1++; tim_2++; //для подсчета частоты вращения tim_025++; tim_i++; if((PIND & Bit(2)) == 0) goto m2; else napr |= Bit(7); goto m3; m2: if((napr & Bit(7)) == 0) goto m3; else { napr &= ~Bit(7); inter0(); } m3: if(tim_025 >= 250) { napr ^= Bit(2); //бит меняет значение каждые 0.5 сек tim_025 = 0; } klava(); }
ISR(TIMER0_OVF_vect) { }
ISR(INT0_vect) { inter0(); }
ISR(__vector_default) { }
void write_data(void) { _EEPUT(3, (znach >> 8)); _EEPUT(4, znach); }
void read_data(void) { _EEGET(m, 3); znach = (m<<8); _EEGET(m, 4); znach = znach + m; }
int main(void) { DDRB = 0b11111111; //все выводы выходы PORTB = 0b11111111; //подтягиваем ножки на +
DDRA = 0b01111111; //все выводы выходы PORTA = 0b11111111; //подтягиваем ножки на + DDRD = 0b11111000; PORTD = 0b11111111;
DDRC = 0b11111111; PORTC = 0b11111110;
//TCCR0 = 0b00000000; //таймер 0 стоп //TIMSK = 0b01001000; //TIMSK |= Bit(1); //Разрешить таймер0 ovr TIMSK |= Bit(6); //Разрешен режим сравнения для инт1(стс) //TIMSK |= Bit(7); //Разрешить прерывание при переполнении таймера1
TIFR = 0; //сбрасываем все флаги
TCCR0 = 0b01101001;
//TCNT0 = 0xF5; //1ms //TCCR0 = 0b00000101; //1024 старт
//TCCR1A = 0b10000011; //ocr1a 10bit PWM //TCCR1B = 0b00001001; // //TCNT1 = 0; OCR1AH = 0x05; // 1ms OCR1AL = 0xDD; TCCR1B = 0b00001010; //CTC, 8
//seg[0] = 1; //seg[1] = 2; //seg[2] = 3; //seg[3] = 4; //seg[4] = 5;
//MCUCR = 0b00001010; //инт0 по перепаду с 1 в 0 napr &= ~Bit(3); //napr &= ~Bit(7); //для инт //znach_1 = 0; //znach = 0; read_data(); sei(); while(1) { if(rezim == 2) { if((napr & Bit(2)) != 0) napr &= ~Bit(3); else napr |= Bit(3); sprintf(seg, "%5u", znach_1); } if((napr & Bit(2)) != 0) { if(rezim == 0) { napr &= ~Bit(3); sprintf(seg, "%5u",znach); } if(rezim == 1) { napr &= ~Bit(3); sprintf(seg, "%5u", znach_1); } if(rezim == 4) { napr &= ~Bit(3); sprintf(seg, "%5u", t_imp); } if(rezim == 8) { napr &= ~Bit(3); sprintf(seg, "%5u", znach); }
} } }
|