Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: проблемы с мега8515
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Genrich
Нужна помощь. Вместо 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);
}

}
}
}
aspID
Цитата
Вместо 52 поставил мегу8515

Позвольте полюбопытствовать, а что такое 52?
Dmitry_Od
Цитата(aspID @ Sep 12 2007, 19:20) *
Позвольте полюбопытствовать, а что такое 52?


Я так понимаю, АТ89х52...
sensor_ua
Порты у 52-го и AVR по-разному построены. Похоже, Вы не включаете подтяжки, а что ещё - лень смотреть. Есть некоторая вероятность, что при внешних подтяжках на входах всё и так заработает. Но правильнее, ИМХО, было бы рихтануть программно.
Genrich
Спасибо. 52 это 89с52. Порты подтянуты, писал программу на мегу168 размер был 9к и сложнее и все задействовано. Все работало. А тут глюк с интераптом0(сейчас он выключен, а если включитиь глюк)
И шимом. Программу уже редактировал с клавиатурой уже все нормально. Может winavr и avrstudio глючат?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.