CodeVision AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
igor-x
Мудрый кот
Сообщения: 1817
Зарегистрирован: Пн ноя 29, 2010 15:58:43

Re: CodeVision AVR в вопросах и ответах

Сообщение igor-x »

pyzhman писал(а):

спасибо, принял асм.

а подскажите где почитать про видимость -невидимость переменных в С и асм ?
если вопрос подругому - как передавать данные между С и асм
Реклама
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение pyzhman »

В хелпе к CV есть тема вставки asm в С.
Docendo discimus
Реклама
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

Re: CodeVision AVR в вопросах и ответах

Сообщение isx »

Появилась проблема . Не получается задействовать АЦП в CVAVR.
Пробовал так, но никакого результата...
#include <mega8.h>
#include <lcd.h>
#include <string.h>
#include <stdio.h>
#include <io.h>
#include <interrupt.h>
#include <delay.h>
#asm
.equ __lcd_port=0x12; PORTD
#endasm


#define FIRST_ADC_INPUT 0
#define LAST_ADC_INPUT 0
unsigned char adc_data[LAST_ADC_INPUT-FIRST_ADC_INPUT+1];
#define ADC_VREF_TYPE 0x20
interrupt [ADC_INT] void adc_isr(void) //стандартное прерывание по ADC от CVAVR
{
static unsigned char input_index=0;
// Read the 8 most significant bits
// of the AD conversion result
adc_data[input_index]=ADCH;
// Select next ADC input
if (++input_index > (LAST_ADC_INPUT-FIRST_ADC_INPUT))
input_index=0;
ADMUX=(FIRST_ADC_INPUT | (ADC_VREF_TYPE & 0xff))+input_index;
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
}


volatile unsigned char butte = 0;
int butt = 4;
unsigned char tim = 0;
unsigned char code = 0;
char buffer [128];
int oldButoon[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, };


void main( void )

{
ADMUX=FIRST_ADC_INPUT | (ADC_VREF_TYPE & 0xff);
ADCSRA=0xCC;
#asm("sei") ;
...................

опрос провожу так:
if (adc_data[0] > 500) {
code = code + 1;}

Вообще мне надо считывать состояние ADC(0) (0В-5В), и присваивать его переменной.
Помогите пожалуйста, ато никак не получается, в WinAVR проще было...
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение vitalik_1984 »

ну и что же у вас не получается?Пробуйте запускать конверсию по таймеру, слишком частый опрос АЦП может спровоцировать нехватку процессорного времени.
В поисках истины человек развивается.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

Re: CodeVision AVR в вопросах и ответах

Сообщение isx »

Почему не работало незнай...
Вот с этим кодом всё ОК...
void main( void )

{
/***Настройка АЦП***/
ADCSRA |= (1 << ADEN) //Включение АЦП
|(1 << ADPS1)|(1 << ADPS0); // предделитель преобразователя на 8
ADMUX |= (0 << REFS1)|(0 << REFS0) // внешний ИОН
|(0 << MUX0)|(0 << MUX1)|(0 << MUX2)|(0 << MUX3); // вход PC0

А перед опросом ставить:
ADCSRA |= (1 << ADSC); //Начинаем преобразование
while ((ADCSRA&(1 << ADIF))== 0); //Ждем флага окончания преобразования
u = (ADCL|ADCH << 8 ); // Считываем ADC

А как теперь сделать остальные пины выходами? (кроме PC(0) и PC(1))
Реклама
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение vitalik_1984 »

не знаю что вы паритесь.я же сказал,что опрос нужно запускать реже.прерывание от ацп будет слишком часто происходить если по этому алгоритму делать. я решил проблему обычным переносом строки запуска преобразования в основной цикл.
каждое преобразование заполняется одна ячейка массива.
В поисках истины человек развивается.
Реклама
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

Re: CodeVision AVR в вопросах и ответах

Сообщение isx »

А она у меня в основном цикле стоит...
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение vitalik_1984 »

вот это в основной цикл и из прерывания убрать.

Код: Выделить всё

// Start the AD conversion 
ADCSRA|=0x40;
В поисках истины человек развивается.
ut1wpr
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

Re: CodeVision AVR в вопросах и ответах

Сообщение ut1wpr »

Сделать прерывание пр готовности данных, в обработчике извлекать данные и помещать их в volatile переменную, взводить volatile флаг готовности данных и стартовать следующее преобразование.
В теле программы отслеживать по флагу готовность данных, сбрасывать этот флаг и делать с данными, что задумано. Отслеживать где угодно, или в рабочих петлях, или в петле ожидания готовности, не имеет значения. Зависит от программного решения.
С уважением,
Виктор.
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение vitalik_1984 »

так это все КВ уже сделал,только почему то без volatile :dont_know: :kill:
по мне так флаг готовности будет лишним.
хотя это еще смотря для какого применения.если нужно отследить каждое изменение,то конечно.
а что выводить,если флаг очищен?ждать пока установится?кому это нужно?с таким же успехом можно использовать read_adc(x);
В поисках истины человек развивается.
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

Re: CodeVision AVR в вопросах и ответах

Сообщение isx »

То ли я дурак, толи мы не понимаем друг друга... :)
Вот полный код:
#include <mega8.h>
#include <lcd.h>
#include <string.h>
#include <stdio.h>
#include <io.h>
#include <delay.h>
#asm
.equ __lcd_port=0x12; PORTD
#endasm

volatile unsigned char butte = 0;
int butt = 4;
unsigned char code = 0;
unsigned int u;
char buffer [128];


void main( void )

{
/***Настройка АЦП***/
ADCSRA |= (1 << ADEN) //Включение АЦП
|(1 << ADPS1)|(1 << ADPS0); // предделитель преобразователя на 8
ADMUX |= (0 << REFS1)|(0 << REFS0) // внешний ИОН
|(0 << MUX0)|(0 << MUX1)|(0 << MUX2)|(0 << MUX3); // вход PC0




DDRB = 0b00001111;
PORTB = 0b11110000;


for(;;)
{


ADCSRA |= (1 << ADSC); //Начинаем преобразование
while ((ADCSRA&(1 << ADIF))== 0); //Ждем флага окончания преобразования
u = (ADCL|ADCH << 8 ); // Считываем ADC
8)

if (u > 200) {code = code++};

sprintf(buffer, "%u", code);
lcd_init( 16 );
lcd_clear( );
lcd_gotoxy( 0,0 );
lcd_puts( buffer );
lcd_gotoxy( 0,1 );
lcd_putsf( "RTY" );
}
};


Мне необходимо следить за датчиком холла (подключённого к ADC(0)) постоянно и считать количество оборотов двигателя
Последний раз редактировалось isx Чт май 24, 2012 22:52:22, всего редактировалось 1 раз.
ut1wpr
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

Re: CodeVision AVR в вопросах и ответах

Сообщение ut1wpr »

isx писал(а):Мне необходимо следить за датчиком холла (подключённого к ADC(0)) постоянно и считать количество оборотов двигателя

Извините, я с самого начала не читал, что за устройство вы делаете. И почему именно ADC? У вас вроде Мега8 прописана, а в ней аналоговый компаратор никто не отменял. А с ним попроще будет. Замикшируйте негативный вход компаратора на тот же ADC0, на плюсовой его вход подайте нужное смещение (я заметил вы по ADC превышение порога 200 отслеживаете), которое можно будет отдельным потенциометром подстраивать. А там уж, как хотите. Или по прерыванию работайте, или постоянно поллингуйте вывод компаратора. Зависит от того, чем еще будет ваше ядро занято.
зы Улыбнулся. Вы вместо тега code использовали тег comment. Не знаю, из-за этого или нет, но результат считывания АЦП у вас сдвинут на... лукавую мордочку кота. :)
С уважением,
Виктор.
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

Re: CodeVision AVR в вопросах и ответах

Сообщение isx »

Блин. .. я вообще зачитался и в голове теперь что то похожее на содержимое лотка моего кота, через несколько дней после уезда хозяев :facepalm:
Вообщем у меня остались свободные только ноги ADC. Из них мне надо сделать 5 выходов с высоким уровнем, 1 вход для цифрового Холла (т.е. распознавать высокий или низкий там уровень) и один вход с контролем уровня напряжения (здесь обязательно АЦП с градацией). Такое сочетание функций вообще возможно?
И ещё, можно ли использовать выводы АЦП в качестве обычных портов ввода-вывода, и если можно, то там тоже нужно настраивать регистры или тупо как и со стандартными портами работать?
И ещё пожалуй... Дайте если есть у кого нибудь ссылку на подробное описание использования АЦП в CVAVR на СИ. Раньше юзал WINAVR, там всё было проще и понятней, а тут уже 3-й день читаю кучу нереальную статей, и ВООБЩЕ ничего понять не могу... Ещё блин и порт ЛПТ вдобавок похоже полетел)
ut1wpr писал(а):тег comment.
Мдя... Ну эт щас поправим :))
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение vitalik_1984 »

isx писал(а):Мне необходимо следить за датчиком холла (подключённого к ADC(0)) постоянно и считать количество оборотов двигателя

А внешнее устройство типа триггера шмидта не прокатит?
isx писал(а):Дайте если есть у кого нибудь ссылку на подробное описание использования АЦП в CVAVR на СИ.

Там много встроенных функций, в том числе ваш

Код: Выделить всё

/***Настройка АЦП***/
ADCSRA |= (<< ADEN//Включение АЦП
|(<< ADPS1)|(<< ADPS0); // предделитель преобразователя на 8
ADMUX |= (<< REFS1)|(<< REFS0// внешний ИОН
|(<< MUX0)|(<< MUX1)|(<< MUX2)|(<< MUX3); // вход PC0 
.....................
ADCSRA |= (<< ADSC); //Начинаем преобразование
while ((ADCSRA&(<< ADIF))== 0); //Ждем флага окончания преобразования 
= (ADCL|ADCH << ); // Считываем ADC 
 

читается простой функцией read_adc(номер_пина);
конечно предварительно настроив ноги в мастере.
isx писал(а):И ещё, можно ли использовать выводы АЦП в качестве обычных портов ввода-вывода, и если можно, то там тоже нужно настраивать регистры или тупо как и со стандартными портами работать?

если на выход сделать, то вроде так просто должны работать.
как вход не знаю нужно попробовать.
Но в один момент времени используется только один аналоговый вход в качестве ацп.
битов для активации конкретных ног нет.Значит те что не настроены на ацп должны как обычно работать.
В поисках истины человек развивается.
ut1wpr
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

Re: CodeVision AVR в вопросах и ответах

Сообщение ut1wpr »

To: isx
Применяя АЦП для обслуживания Холла вы не сможете измерять ничего другого по одной простой причине. Переключая мультиплексором модуль АЦП на другие входы вы сразу же теряете контроль над поступающими импульсами. А вы ведь их считаете? И пропуск вам недопустим? Зачем вам неверные показания?
Либо вы должны уяснить, что "постоянного" контроля скорости у вас не будет. Будет лишь некий точно отмеренный таймеров интервал времени, в течение которого вы и будете (ни на что не отвлекаясь) подсчитывать ваши импульсы. И только прекратив этот подсчет (по окончании отработки таймера), вы сможете что-то там еще измерять, переключив мукс (не забыв дать время на успокоение) или чем-то там шевелить по выходам. Скорее всего вам и не нужен "постоянный" контроль. Обороты - штука инерционная. За 1-2 десятка миллисекунд не убегут. А за это время и шевельнуть успеете, и намеряетесь вдоволь.
С уважением,
Виктор.
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Re: CodeVision AVR в вопросах и ответах

Сообщение FreshMan »

использую версию 2.05.08
до этого использовал другую, но спроблемма осталась
с некоторых пор при программировании МК он у меня не стал программироваться......, ошибок при этом никаких не выдается, я програмирую провереннвм кодом но мк не оживает и индикаторы не светятся......., заметил что когда начался такой непонятный глюк то время процеса заливки кода в МК стало в раза 3 КОРОЧЕ........., переустановил новую прогу, посвежее....., все наладилось....., но после нескольких программирований все опять повторяется......, что это может быть ?
Tell Me The Truth
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение vitalik_1984 »

может какая нибудь галка стоит например защита памяти или наоборот не стоит -стирать память программ перед заливкой прошивки?
попробуйте просто стереть кристалл и прочитать его.а потом записать и прочитать.что будет в этих файлах.
дело может быть и не в программе.
В поисках истины человек развивается.
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Re: CodeVision AVR в вопросах и ответах

Сообщение FreshMan »

да галок я нигде никаких не раставлял......, я уже начинаю думать что это козни вируса и пора переустанавливать винду....
Tell Me The Truth
hubble
Родился
Сообщения: 13
Зарегистрирован: Вс июн 14, 2009 00:34:38

Re: CodeVision AVR в вопросах и ответах

Сообщение hubble »

Подскажите, пожалуйста, почему компиляция проходит с ошибками в строке if(polarity):

Код: Выделить всё

#include <mega8.h>
.....
sfrb  PIND=0x10;
#define polarity  PIND.6;


void main(void)
{
.....
199        if(polarity)
200            PORTC= 0b00001001;
201        else
202            PORTC= 0b00001010; 
}

Ошибки:
Error: D:\Projects\ATmega8_main.c(199): missing ')'
Error: D:\Projects\ATmega8_main.c(199): invalid expression
Error: D:\Projects\ATmega8_main.c(201): no matching if
a_skr
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

Re: CodeVision AVR в вопросах и ответах

Сообщение a_skr »

#define polarity PIND.6;
точка с запятой лишняя
Ответить

Вернуться в «AVR»