static char fl=0;
/***************************************************************/
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void){
fl=1;
}
/***************************************************************/
/***************************************************************/
void func(){
fl=0;
while(1){
..........
..........
if(fl) break; // Выходим из цикла по флагу
//if(fl) return; // Или так, если хотим выйти совсем из функции
..........
..........
}
}
/***************************************************************/
Создал в кодгенераторе код, для работы с DS1370, пытаюсь компильнуть, говорит что не найден ds1370.h, это как? Может подскажите в чем проблема? Версия не бесплатная.
UP версия оказалось безплатная( Проблемма решена.
Читаю книгу "Лебедев М.Б. - CodeVisionAVR. Пособие для начинающих. - 2008"
так на стр 269 приведён перечень математических функций. А в библиотеке math.h некоторых нету
где можно скачать более полную библиотеку?
#define ADC_1() ADMUX=(0<<REFS1) |(0<<REFS0) | (0<<ADLAR)|(0<<MUX4)|(0<<MUX3)|(0<<MUX2)|(0<<MUX1)|(0<<MUX0);
#define ADC_6() ADMUX=(0<<REFS1) |(0<<REFS0) | (0<<ADLAR)|(0<<MUX4)|(0<<MUX3)|(1<<MUX2)|(1<<MUX1)|(0<<MUX0);
interrupt [ADC_INT] void adc_isr(void)
{
switch (chanel){
case 0:{
chanel1=ADCW;
ADC_6();
chanel=6;
break;
}
case 6:{
chanel6=ADCW;
ADC_1();
chanel=0;
break;
}
}
}
#asm("sei")
while (1){
LCD_FIST_STR(0);
LCD_SEND("ADC1:=");
LCD_BDC(chanel1);
delay_ms(1);
LCD_SEND(mass); //вывод на дисплей данных из массива
LCD_SECOND_STR();
LCD_SEND("ADC6:=");
LCD_BDC(chanel6);
LCD_SEND(mass); //вывод на дисплей данных из массива
}
Тестирую всё в протеусе должно выводится в первой строке значение первого канала во второй шестого
а в итоге получаем что в обоих строчках выводится значение первого канала вот не как понять не могу как оно по подает в переменную chanel6.
И ещё протеус ругается на то что регистр ADC заблокирован. И мне может записать туда чего-то.
это видимо из за того нету задержки, но я так не могу понять, где она нужна.
Последний раз редактировалось pokk Вс мар 03, 2013 15:05:53, всего редактировалось 1 раз.
Что-то до меня не как не доходит. Можете сказать, где в моём коде надо это сделать ?
Единственное место, где я обращаюсь к регистру это в прерывании chanel1=ADCW;
Как он может быть там заблокированным ? Ведь по биту ADIF и возникает прерывание.
Извините инициализацию АЦП я забыл показать. Я полагаю что там должно быть всё в порядке, по сообщениям из протеусе видно что прерывание запускается и каналы изменяются. Вот только считывается всё нормально 1 раз.
bit flag;
в прерывании поставить флаг
flag =0; //сработал флаг
в цикле:
flag=1;//сбрасываем флаг
while(flag){
//тут то, что нужно выполнять
}
ChipKiller писал(а):по тому мизеру информации. что приведена - предположу, что перед сменой канала вы не выключаете АЦП (бит ADEN).
... я не телепат, так что пардон .......
что за бред, сгенерите код визардом, ничего подобного там не делается и все работает.
Регистр ADC блокируется аппаратно когда читается младший регистр результата Ацп, когда читается старший, блокировка автоматически снимается.
После смены канала в автокоде делается задержка 10us.и только после этого запуск преобразования.
Вообще судя по журналу как то часто прерывания таймера случаются, возможно с этим что то связано.Если в каждом прерывании идет запуск преобразования, а прерывание чтения возникает в два-три раза реже немудрено, что в какой то момент произойдет глюк.