CodeVisionAVR 2.60
04.02.2014, 14:27
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 29.10.2006
Сообщений: 1,449
Сказал спасибо: 99
Сказали Спасибо 318 раз(а) в 234 сообщении(ях)
|
Re: CodeVisionAVR 2.60
1. Зачем нужен цикл именно от 0 до 99?
2. Почему измерений именно 300 (adc_counter › 300), а не, скажем, 99?
3. Сколько измерений АЦП произойдёт, прежде чем цикл от 0 до 99 закончится?
2. Чему изначально равен adc_counter?
Вот, например, можно без прерываний (код для CV):
|
PHP код:
|
#include ‹mega16.h›
#include ‹delay.h›
#define ADC_VREF_TYPE ((1‹‹REFS1) | (1‹‹REFS0) | (0‹‹ADLAR))
#define MEASURE_NUM 300
unsigned int adc_value = 0;
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | ADC_VREF_TYPE;
delay_us(10);
ADCSRA|=(1‹‹ADSC);
while ((ADCSRA & (1‹‹ADIF))==0);
ADCSRA|=(1‹‹ADIF);
return ADCW;
}
unsigned int measure_ch(unsigned char ch)
{
unsigned int i;
unsigned long int result = 0;
for(i = MEASURE_NUM; i; i--) result += read_adc(ch);
return (result / MEASURE_NUM);
}
void init_adc(void)
{
ADMUX=ADC_VREF_TYPE;
ADCSRA=(1‹‹ADEN) | (0‹‹ADSC) | (0‹‹ADATE) | (0‹‹ADIF) | (0‹‹ADIE) | (1‹‹ADPS2) | (1‹‹ADPS1) | (1‹‹ADPS0);
SFIOR=(0‹‹ADTS2) | (0‹‹ADTS1) | (0‹‹ADTS0);
}
void main(void)
{
init_adc();
begin:
adc_value = measure_ch(0);
adc_value = measure_ch(1);
goto begin;
}
|
Последний раз редактировалось Godzilla82; 04.02.2014 в 14:43.
|
|
|
|
04.02.2014, 15:10
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 07.05.2008
Адрес: Мурманск
Сообщений: 1,290
Сказал спасибо: 452
Сказали Спасибо 501 раз(а) в 267 сообщении(ях)
|
Re: CodeVisionAVR 2.60
Сообщение от Godzilla82
|
|
2. Почему измерений именно 300 (adc_counter › 300), а не, скажем, 99?
|
А где инкремент этой переменной у автора?
Я бы оставил init_adc() в main, делал все в while(1) {...} и избавился от goto.
Последний раз редактировалось IOPA4; 04.02.2014 в 15:15.
|
|
|
|
04.02.2014, 15:53
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 29.10.2006
Сообщений: 1,449
Сказал спасибо: 99
Сказали Спасибо 318 раз(а) в 234 сообщении(ях)
|
Re: CodeVisionAVR 2.60
Сообщение от IOPA4
|
|
А где инкремент этой переменной у автора?
|
Логично, что в прерывании, там же, где и считывание результатов преобразования. По крайней мере, я на это надеюсь.
Сообщение от IOPA4
|
|
Я бы оставил init_adc() в main, делал все в while(1) {...} и избавился от goto.
|
Дело вкуса  с goto меньше скобок.
|
|
|
|
04.02.2014, 16:41
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,613
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: CodeVisionAVR 2.60
Сообщение от Godzilla82
|
|
Дело вкуса с goto меньше скобок.
|

Пральна! Кому-как! А мне вот так!
|
Код:
|
void display( char );
void main( void ){
for(;;){
display(measure_ch(0));
display(measure_ch(1));
}
}
void display( char channel ){
// to do someting
} |
Такшта можна и с ГОТУ.
__________________
С уважением,
Vic / ut1wpr
Последний раз редактировалось ut1wpr; 04.02.2014 в 16:45.
|
|
|
|
04.02.2014, 21:19
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 07.05.2008
Адрес: Мурманск
Сообщений: 1,290
Сказал спасибо: 452
Сказали Спасибо 501 раз(а) в 267 сообщении(ях)
|
Re: CodeVisionAVR 2.60
Сообщение от Арктур
|
|
uses crt;
|
А за что спасибо? Как это в МК воткнуть? Можно целую поэму без скобок написать, но crt и поэма это для ББ. Да и begin...end это теже скобки, но вид сбоку.
|
|
|
|
04.02.2014, 21:22
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 06.08.2008
Адрес: Ярославль
Сообщений: 1,504
Сказал спасибо: 115
Сказали Спасибо 1,314 раз(а) в 548 сообщении(ях)
|
Re: CodeVisionAVR 2.60
goto - дословный перевод - "пошёл на ..."
Джельтмены так не выражаются.
|
|
|
|
04.02.2014, 22:46
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,487
Сказал спасибо: 30
Сказали Спасибо 3,070 раз(а) в 2,011 сообщении(ях)
|
Re: CodeVisionAVR 2.60
Сообщение от Арктур
|
В Паскуале их ещё меньше!
|
То да, Паскаль - сила!
|
Код:
|
uses dos;
label aaa,10,20,30,40,44,45,46,47,48,50,60,70;
var hex_tmp,path :string; {Ё¬п д*©«*}
var a,b,c:integer; {*¤аҐб* Ї®ав®ў ЇаЁ*вҐа*}
var i,tt,t:integer;
var adr,razm:integer;
var ffdat:File; {д*©«}
var la,sa,ha:byte; {*¤аҐб ** иЁ*Ґ зЁЇ*}
var ld,dd,id,od:byte; {¤***лҐ}
var q,tb,temp:byte;
var lt,ht,lh,hh:byte;
var qqq:byte;
{****************************************}
type
fdat = record
fd : byte;
end;
var
fdatFile: file of fdat;
fdatRec: fdat;
{****************************************}
procedure hex_wiev;
begin
hex_tmp:=hex_tmp+copy('0123456789ABCDEF',q,1);
end;{hex_wiev}
{**********************}
procedure rd_dat;
begin
asm
mov dx,c
mov al,$08
out dx,al
dec dx
in al,dx
shl al,1
shr al,1
shr al,1
shr al,1
shr al,1
mov ld,al
inc dx
mov al,$0f
out dx,al
dec dx
in al,dx
shr al,1
shr al,1
shr al,1
shl al,1
shl al,1
shl al,1
shl al,1
or al,ld
inc dx
mov id,al
xor al,al
out dx,al
end;
end;{rd_dat} |
Более того, всё, что в скобках, воспримет как комментарии.
|
|
|
|
05.02.2014, 09:15
|
|
|
Прохожий
Регистрация: 30.06.2006
Сообщений: 1
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: CodeVisionAVR 2.60
Ребята, есть у кого CV 2.05.6 c таблеткой?
Скиньте, пожалуйста, на мыло [email protected]
Заранее благодарен.
|
|
|
|
05.02.2014, 13:55
|
|
|
Частый гость
Регистрация: 05.02.2014
Сообщений: 12
Сказал спасибо: 0
Сказали Спасибо 3 раз(а) в 1 сообщении
|
Re: CodeVisionAVR 2.60
И мне тоже скиньте проверенную версию CV 2.05.6 c таблеткой. А то до сих пор в версии 1.25.5 сижу. Пора бы обновиться )) Mail: [email protected]
|
|
|
|
05.02.2014, 16:27
|
|
|
Прописка
Регистрация: 28.04.2008
Сообщений: 141
Сказал спасибо: 11
Сказали Спасибо 18 раз(а) в 9 сообщении(ях)
|
Re: CodeVisionAVR 2.60
[QUOTE=Godzilla82;730518]1. Зачем нужен цикл именно от 0 до 99?
2. Почему измерений именно 300 (adc_counter › 300), а не, скажем, 99?
3. Сколько измерений АЦП произойдёт, прежде чем цикл от 0 до 99 закончится?
2. Чему изначально равен adc_counter?
1. Зачем нужен цикл именно от 0 до 99? Это время (условно) вывода на индикацию значений АЦП0 по завершении цикла переходим в дугой цикл и выводим значения АЦП1 и так по кругу. Так вот у меня выполняется 1 цикл правильно, то есть на индикацию выводятся значения АЦП0.
Переходим в цикл 2, данный цикл выполняется и выводит значения АЦП1 вроде всё нормально. Но при завершении цикла 2 переходим в цикл 1 вот здесь и начинается проблемы, выводятся значения АЦП1 а нужно выводить АЦП0. Что я не так делаю?
while(1)
{
ADCSRA |= (1 ‹‹ ADEN) // разрешение АЦП
|(1 ‹‹ ADSC) // запуск преобразования
|(1 ‹‹ ADFR) // непрерывный режим работы АЦП
|(1 ‹‹ ADPS2)|(1 ‹‹ ADPS1)|(0 ‹‹ ADPS0) // предделитель на 64 (частота АЦП 125kHz)
|(1 ‹‹ ADIE); // разрешение прерывания
ADMUX |= (1 ‹‹ REFS1)|(1 ‹‹ REFS0) // внутренний ИОН 2,56V
|(0 ‹‹ MUX3)|(0 ‹‹ MUX2)|(0 ‹‹ MUX1)|(0 ‹‹ MUX0); // вход ADC0
sei(); //глобально разрешаем прерывания
_delay_ms(50);
for (i=0; i‹100; i=i+1) //Цикл 1
{
if (adc_counter › 300) // вычисляем среднее значение АЦП0
{
display = value/adc_counter;
adc_counter = 0;
value = 0;
}
_delay_ms(50);
} // конец цикла 1
cli(); // Запрет глобального прерывания
ADCSRA |= (1 ‹‹ ADEN) // разрешение АЦП
|(1 ‹‹ ADSC) // запуск преобразования
|(1 ‹‹ ADFR) // непрерывный режим работы АЦП
|(1 ‹‹ ADPS2)|(1 ‹‹ ADPS1)|(0 ‹‹ ADPS0) // предделитель на 64 (частота АЦП 125kHz)
|(1 ‹‹ ADIE); // разрешение прерывания
ADMUX |= (1 ‹‹ REFS1)|(1 ‹‹ REFS0) // внутренний ИОН 2,56V
|(0 ‹‹ MUX3)|(0 ‹‹ MUX2)|(0 ‹‹ MUX1)|(1 ‹‹ MUX0); // вход ADC1
sei(); //глобально разрешаем прерывания
_delay_ms(50);
for (i=0; i‹100; i=i+1) //Цикл 2
{
if (adc_counter › 300) // вычисляем среднее значение АЦП1
{
display = value/adc_counter;
adc_counter = 0;
value = 0;
}
_delay_ms(50);
} // конец цикла 2
cli(); // Запрет глобального прерывания
}
2. Чему изначально равен adc_counter? нулю.
Последний раз редактировалось vgtmaster; 05.02.2014 в 16:34.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 21:56.
|
|