привет
у меня проблема
микроконтролер атмега32
нужно запустить прерывания по таймеру
сразу два , но если я запускаю один то все норм а если два то происходит что то не ладное, вся функция майн запускается заново очень быстро
/***Настраиваем таймер***/
TCCR1A = 0x00;
TCCR1B = (1 << CS12)|(0 << CS11)|(1 << CS10)|(1 << WGM12); //предделитель clk/1024, режим таймера СТС
TCNT1=0x00;
OCR1A=7905; // выбор коэффициента деления
TIMSK=(1 << OCIE1A); // разрешение прерывания по совпадению
TCCR0 = 0x00;
TCCR0 = (1 << CS12)|(0 << CS11)|(1 << CS10)|(1 << WGM12); //предделитель clk/1024, режим таймера СТС
TCNT0=0x00;
OCR0=7905; // выбор коэффициента деления
TIMSK=(1 << OCIE0); // разрешение прерывания по совпадению
Cat писал(а):Это что за индийские коды:
Не проще ли нормально вписать в регистры числа, вместо этого изврата?
Всякие чудеса быдлокодинга видел, но такое впервые.
Вот те раз, а я то думал это для читаемости кода и сам так теперь пишу Кто еще не согласен?
okmonster писал(а):
сразу два , но если я запускаю один то все норм а если два то происходит что то не ладное, вся функция майн запускается заново очень быстро
Вы сначала пишите в TIMSK один бит для включения прерывания по 1-му таймеру, а после настройки 0-го таймера у вас этот бит затирается командой TIMSK=(1 << OCIE0), в итоге работает только последнее прерывание. Нужно либо TIMSK|=(1 << OCIE0), либо записывать только в конце: TIMSK=(1 << OCIE0)|(1 << OCIE1A)
Cat писал(а):Это что за индийские коды?:
TIMSK=(1 << OCIE1A);
TCCR1B = (1 << CS12)|(0 << CS11)|(1 << CS10)|(1 << WGM12);
А это вообще "пушка" TIMSK=(1 << OCIE1A);
Не проще ли нормально вписать в регистры числа, вместо этого изврата?
Всякие чудеса быдлокодинга видел, но такое впервые.
Какое ТЗ? Можно нормально сформировать требуемую задачу? А то "хочу включить прерывания"... Какие? в меге 32 21 вектор, если не ошибаюсь
вся функция майн запускается заново очень быстро
Заново она запускаться может только при сбросе контроллера.
мне нужно запускать две функции с определенной частотой
вот я и пытаюсь запускать их по таймеру
пытался сделать вот по этой статье http://radioparty.ru/index.php/prog-avr ... 34-lesson6
сам просто еще только начинаю изучать все это дело
Ну хотите максимально усложнить читабельность кода - дело ваше, только не удивляйтесь что никто не захочет читать ваши нагромождения операций в тех местах, где достаточно просто вписать число в регистр.
// External Interrupt(s) initialization GICR=0b01000000;// включено внешнее прерывание 0 (1 0 2)//будем в коде периодически выключать прерывание 1 MCUCR=0b00001010;// внешнее прерывание 0 и 1 по спаду MCUCSR=0x00; //второе прерывание не задействовано
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0b01000100;//прерывание по переполнению таймера 1 и 2
Cat писал(а):
MCUCR=0b00001010;// внешнее прерывание 0 и 1 по спаду Так читабельнее?
Ога, и вспоминай потом, какой бит в MCUCR Sleep Enable, а какие включили... Хорошо если даташит или студия перед глазами.
Или например SPI из слейва в мастер переключить? Знаете какой бит отвечает за это наизусть? Сможете без даташита переключить?
Последний раз редактировалось Engineer_Keen Чт мар 22, 2012 14:33:23, всего редактировалось 1 раз.
Я фигею!
Не, ну если вы можете держать в голове порядковый номер каждого бита и информацию, за что он отвечает - то да. Но тогда зачем вам компилятор? Проще машинные коды выучить и писать HEX прямо в блокноте...
почему то если я вообще начинаю использовать 0 счетчик или второй то у меня в Proteus начинается какой то ребут функции майн она крутится очень быстро
а если использую 1 счетчик то все норм.
если одновременно два то тоже крутится майн
Я фигею!
Не, ну если вы можете держать в голове порядковый номер каждого бита и информацию, за что он отвечает - то да. Но тогда зачем вам компилятор? Проще машинные коды выучить и писать HEX прямо в блокноте...
Эээээ... я много работаю с мегами, в меге32 и 16 большинство регистров действительно знаю наизусть каждый бит... и при записи вида РЕГИСТР=0bxxxxxxxx сразу вижу как отконфигурировано и что.
Засем можно считать что я тупанул, можете закидать помидорчиками.
Последний раз редактировалось Cat Чт мар 22, 2012 14:36:44, всего редактировалось 1 раз.
int qwertyQ,qwertyR,qwertyNOMER=0,qwertyRESULT,qwertyPRINT;
void send_data (unsigned int data){
int i;
for (i=0;i<16;i++){
if ((data&0x8000)==0x00) PORTB&=~_BV(DATA); // Выставляем данные на PD0
else PORTB|=_BV(DATA);
asm("nop");
PORTB|=_BV(CLK); // Импульс на CLK
asm("nop");
PORTB&=~_BV(CLK);
asm("nop");
data=(data<<1);
}
PORTB|=_BV(Latch); // Импульс на Latch clock
asm("nop");
PORTB&=~_BV(Latch);
}
/***Функция записи команды в LCD***/
void lcd_com(unsigned char p) //'p' байт команды
{
PORTB &= ~(1 << RS); // RS = 0
PORTB |= (1 << EN); // EN = 1 (начало записи команды в LCD)
PORTD = p; // вывод команды на шину DB0-7 LCD
//_delay_us(40); // длительность сигнала EN
PORTB &= ~(1 << EN); // EN = 0 (конец записи команды в LCD)
_delay_us(40); // пауза для выполнения команды
}
/***Функция записи данных в LCD***/
void lcd_dat(unsigned char p) //'p' байт команды
{
PORTB |= (1 << RS)|(1 << EN); //RS = 1, EN = 1 (начало записи команды в LCD)
PORTD = p; //вывод команды на шину DB0-7 LCD
_delay_us(20); // длительность сигнала EN
PORTB &= ~(1 << EN); // EN = 0 (конец записи команды в LCD)
_delay_us(20); // пауза для выполнения команды
}
// Опорное напряжение - ножка AREF
#define ADC_VREF_TYPE 0b00000000
unsigned int ADCRead(unsigned char adc_input) // Read the AD conversion result
{
ADMUX = adc_input | ADC_VREF_TYPE;
// Delay needed for the stabilization of the ADC input voltage
_delay_us(10);
// Start the AD conversion
ADCSRA |= 0x40;
while ((ADCSRA & 0x10) == 0); // Wait for the AD conversion to complete
ADCSRA |= 0x10;
return ADCW;
}
/***Процедура обработки прерывания по Таймеру 1***/
ISR (TIMER1_COMPA_vect)
{
if(data_status==0){
data_sekund++;
if (data_sekund==61){data_minut++;data_sekund=0;}
}
}
/***Процедура обработки прерывания по Таймеру 0***/
ISR (TIMER0_COMPA_vect)
{
Watchdog следит чтоб МК не завис, если он включен, его нужно периодически сбрасывать иначе он сбросит контроллер. Но у вас он не включен, так что не парьтесь.
Засем можно считать что я тупанул, можете закидать помидорчиками.
Да ладно, сам когда начинал писал битами.
Пооффтоплю немного, но автору тоже полезно будет.
Названия типа CS12 - это сокращения от полных наименований. И по сути это константы с порядковым номером бита.
Например тот же CS12 - Clock Source Timer 1 bit 2 или "Второй бит источника тактирования таймера 1" Это запоминается на раз, и после пары-тройки проектов уже в даташит заглядывать не надо.
Разумеется в контроллер попадает готовое число, которое вычисляется на этапе компиляции. Единственный минус - писать чуть длиннее, но по времени гораздо короче, чем искать номера битов в даташите.