Портал для радиолюбителей и разработчиков электроники · с 2003 годаРеклама на сайте
Найти компонент, схему или даташит

Даташиты, справочник отечественных приборов, схемы с разбором и живой форум


 
Опции темы

CodeVisionAVR 2.60

Непрочитано 04.02.2014, 14:27  
Godzilla82
Почётный гражданин KAZUS.RUN
 
Регистрация: 29.10.2006
Сообщений: 1,449
Сказал спасибо: 99
Сказали Спасибо 318 раз(а) в 234 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение 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.
Godzilla82 вне форума  
Непрочитано 04.02.2014, 15:10  
IOPA4
Почётный гражданин KAZUS.RUN
 
Аватар для IOPA4
 
Регистрация: 07.05.2008
Адрес: Мурманск
Сообщений: 1,290
Сказал спасибо: 452
Сказали Спасибо 501 раз(а) в 267 сообщении(ях)
IOPA4 на пути к лучшему
По умолчанию Re: CodeVisionAVR 2.60

Сообщение от Godzilla82 Посмотреть сообщение
2. Почему измерений именно 300 (adc_counter › 300), а не, скажем, 99?
А где инкремент этой переменной у автора?
Я бы оставил init_adc() в main, делал все в while(1) {...} и избавился от goto.

Последний раз редактировалось IOPA4; 04.02.2014 в 15:15.
IOPA4 вне форума  
Непрочитано 04.02.2014, 15:53  
Godzilla82
Почётный гражданин KAZUS.RUN
 
Регистрация: 29.10.2006
Сообщений: 1,449
Сказал спасибо: 99
Сказали Спасибо 318 раз(а) в 234 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение Re: CodeVisionAVR 2.60

Сообщение от IOPA4 Посмотреть сообщение
А где инкремент этой переменной у автора?
Логично, что в прерывании, там же, где и считывание результатов преобразования. По крайней мере, я на это надеюсь.

Сообщение от IOPA4 Посмотреть сообщение
Я бы оставил init_adc() в main, делал все в while(1) {...} и избавился от goto.
Дело вкуса с goto меньше скобок.
Godzilla82 вне форума  
Непрочитано 04.02.2014, 16:41  
ut1wpr
Почётный гражданин KAZUS.RUN
 
Аватар для ut1wpr
 
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,613
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
ut1wpr на пути к лучшему
По умолчанию 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.
ut1wpr вне форума  
Непрочитано 04.02.2014, 21:19  
IOPA4
Почётный гражданин KAZUS.RUN
 
Аватар для IOPA4
 
Регистрация: 07.05.2008
Адрес: Мурманск
Сообщений: 1,290
Сказал спасибо: 452
Сказали Спасибо 501 раз(а) в 267 сообщении(ях)
IOPA4 на пути к лучшему
По умолчанию Re: CodeVisionAVR 2.60

Сообщение от Арктур Посмотреть сообщение
uses crt;
А за что спасибо? Как это в МК воткнуть? Можно целую поэму без скобок написать, но crt и поэма это для ББ. Да и begin...end это теже скобки, но вид сбоку.
IOPA4 вне форума  
Непрочитано 04.02.2014, 21:22  
olc0267
Почётный гражданин KAZUS.RUN
 
Регистрация: 06.08.2008
Адрес: Ярославль
Сообщений: 1,504
Сказал спасибо: 115
Сказали Спасибо 1,314 раз(а) в 548 сообщении(ях)
olc0267 на пути к лучшему
По умолчанию Re: CodeVisionAVR 2.60

goto - дословный перевод - "пошёл на ..."
Джельтмены так не выражаются.
olc0267 вне форума  
Непрочитано 04.02.2014, 22:46  
omercury
Почётный гражданин KAZUS.RUN
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,487
Сказал спасибо: 30
Сказали Спасибо 3,070 раз(а) в 2,011 сообщении(ях)
omercury на пути к лучшему
По умолчанию 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}
Более того, всё, что в скобках, воспримет как комментарии.
omercury вне форума  
Непрочитано 05.02.2014, 09:15  
ALEX_1965
Прохожий
 
Регистрация: 30.06.2006
Сообщений: 1
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
ALEX_1965 на пути к лучшему
По умолчанию Re: CodeVisionAVR 2.60

Ребята, есть у кого CV 2.05.6 c таблеткой?
Скиньте, пожалуйста, на мыло [email protected]
Заранее благодарен.
ALEX_1965 вне форума  
Непрочитано 05.02.2014, 13:55  
foxii
Частый гость
 
Регистрация: 05.02.2014
Сообщений: 12
Сказал спасибо: 0
Сказали Спасибо 3 раз(а) в 1 сообщении
foxii на пути к лучшему
По умолчанию Re: CodeVisionAVR 2.60

И мне тоже скиньте проверенную версию CV 2.05.6 c таблеткой. А то до сих пор в версии 1.25.5 сижу. Пора бы обновиться )) Mail: [email protected]
foxii вне форума  
Непрочитано 05.02.2014, 16:27  
vgtmaster
Прописка
 
Регистрация: 28.04.2008
Сообщений: 141
Сказал спасибо: 11
Сказали Спасибо 18 раз(а) в 9 сообщении(ях)
vgtmaster на пути к лучшему
По умолчанию 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.
vgtmaster вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
CodeVisionAVR selevo Embedd С 11 26.02.2016 22:16
SD и CodeVisionAvr 2.04.4a sersne Микроконтроллеры, АЦП, память и т.д 29 24.03.2010 18:39
CodeVisionAVR V2.03.2 dimonbest Микроконтроллеры, АЦП, память и т.д 253 29.09.2009 22:37
New CodeVisionAVR 1.25.8 dimonbest Микроконтроллеры, АЦП, память и т.д 15 07.02.2008 12:56
Help CodeVisionAVR Serg79 Микроконтроллеры, АЦП, память и т.д 3 15.12.2005 23:32


Часовой пояс GMT +4, время: 21:56.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.