Страница 207 из 421

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

Добавлено: Пн май 21, 2012 11:03:54
igor-x
pyzhman писал(а):
спасибо, принял асм.

а подскажите где почитать про видимость -невидимость переменных в С и асм ?
если вопрос подругому - как передавать данные между С и асм

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

Добавлено: Пн май 21, 2012 11:36:01
pyzhman
В хелпе к CV есть тема вставки asm в С.

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

Добавлено: Ср май 23, 2012 18:18:00
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 проще было...

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

Добавлено: Ср май 23, 2012 19:40:53
vitalik_1984
ну и что же у вас не получается?Пробуйте запускать конверсию по таймеру, слишком частый опрос АЦП может спровоцировать нехватку процессорного времени.

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

Добавлено: Ср май 23, 2012 21:16:13
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))

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

Добавлено: Ср май 23, 2012 22:15:17
vitalik_1984
не знаю что вы паритесь.я же сказал,что опрос нужно запускать реже.прерывание от ацп будет слишком часто происходить если по этому алгоритму делать. я решил проблему обычным переносом строки запуска преобразования в основной цикл.
каждое преобразование заполняется одна ячейка массива.

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

Добавлено: Чт май 24, 2012 00:39:43
isx
А она у меня в основном цикле стоит...

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

Добавлено: Чт май 24, 2012 07:05:27
vitalik_1984
вот это в основной цикл и из прерывания убрать.

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

// Start the AD conversion 
ADCSRA|=0x40;

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

Добавлено: Чт май 24, 2012 08:11:13
ut1wpr
Сделать прерывание пр готовности данных, в обработчике извлекать данные и помещать их в volatile переменную, взводить volatile флаг готовности данных и стартовать следующее преобразование.
В теле программы отслеживать по флагу готовность данных, сбрасывать этот флаг и делать с данными, что задумано. Отслеживать где угодно, или в рабочих петлях, или в петле ожидания готовности, не имеет значения. Зависит от программного решения.

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

Добавлено: Чт май 24, 2012 13:21:01
vitalik_1984
так это все КВ уже сделал,только почему то без volatile :dont_know: :kill:
по мне так флаг готовности будет лишним.
хотя это еще смотря для какого применения.если нужно отследить каждое изменение,то конечно.
а что выводить,если флаг очищен?ждать пока установится?кому это нужно?с таким же успехом можно использовать read_adc(x);

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

Добавлено: Чт май 24, 2012 14:03:44
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)) постоянно и считать количество оборотов двигателя

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

Добавлено: Чт май 24, 2012 20:19:37
ut1wpr
isx писал(а):Мне необходимо следить за датчиком холла (подключённого к ADC(0)) постоянно и считать количество оборотов двигателя
Извините, я с самого начала не читал, что за устройство вы делаете. И почему именно ADC? У вас вроде Мега8 прописана, а в ней аналоговый компаратор никто не отменял. А с ним попроще будет. Замикшируйте негативный вход компаратора на тот же ADC0, на плюсовой его вход подайте нужное смещение (я заметил вы по ADC превышение порога 200 отслеживаете), которое можно будет отдельным потенциометром подстраивать. А там уж, как хотите. Или по прерыванию работайте, или постоянно поллингуйте вывод компаратора. Зависит от того, чем еще будет ваше ядро занято.
зы Улыбнулся. Вы вместо тега code использовали тег comment. Не знаю, из-за этого или нет, но результат считывания АЦП у вас сдвинут на... лукавую мордочку кота. :)

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

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

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

Добавлено: Пт май 25, 2012 00:29:04
vitalik_1984
isx писал(а):Мне необходимо следить за датчиком холла (подключённого к ADC(0)) постоянно и считать количество оборотов двигателя
А внешнее устройство типа триггера шмидта не прокатит?
isx писал(а):Дайте если есть у кого нибудь ссылку на подробное описание использования АЦП в CVAVR на СИ.
Там много встроенных функций, в том числе ваш

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

/***Настройка АЦП***/
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 
 
читается простой функцией read_adc(номер_пина);
конечно предварительно настроив ноги в мастере.
isx писал(а):И ещё, можно ли использовать выводы АЦП в качестве обычных портов ввода-вывода, и если можно, то там тоже нужно настраивать регистры или тупо как и со стандартными портами работать?
если на выход сделать, то вроде так просто должны работать.
как вход не знаю нужно попробовать.
Но в один момент времени используется только один аналоговый вход в качестве ацп.
битов для активации конкретных ног нет.Значит те что не настроены на ацп должны как обычно работать.

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

Добавлено: Пт май 25, 2012 07:15:52
ut1wpr
To: isx
Применяя АЦП для обслуживания Холла вы не сможете измерять ничего другого по одной простой причине. Переключая мультиплексором модуль АЦП на другие входы вы сразу же теряете контроль над поступающими импульсами. А вы ведь их считаете? И пропуск вам недопустим? Зачем вам неверные показания?
Либо вы должны уяснить, что "постоянного" контроля скорости у вас не будет. Будет лишь некий точно отмеренный таймеров интервал времени, в течение которого вы и будете (ни на что не отвлекаясь) подсчитывать ваши импульсы. И только прекратив этот подсчет (по окончании отработки таймера), вы сможете что-то там еще измерять, переключив мукс (не забыв дать время на успокоение) или чем-то там шевелить по выходам. Скорее всего вам и не нужен "постоянный" контроль. Обороты - штука инерционная. За 1-2 десятка миллисекунд не убегут. А за это время и шевельнуть успеете, и намеряетесь вдоволь.

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

Добавлено: Пт май 25, 2012 20:48:39
FreshMan
использую версию 2.05.08
до этого использовал другую, но спроблемма осталась
с некоторых пор при программировании МК он у меня не стал программироваться......, ошибок при этом никаких не выдается, я програмирую провереннвм кодом но мк не оживает и индикаторы не светятся......., заметил что когда начался такой непонятный глюк то время процеса заливки кода в МК стало в раза 3 КОРОЧЕ........., переустановил новую прогу, посвежее....., все наладилось....., но после нескольких программирований все опять повторяется......, что это может быть ?

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

Добавлено: Пт май 25, 2012 23:15:01
vitalik_1984
может какая нибудь галка стоит например защита памяти или наоборот не стоит -стирать память программ перед заливкой прошивки?
попробуйте просто стереть кристалл и прочитать его.а потом записать и прочитать.что будет в этих файлах.
дело может быть и не в программе.

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

Добавлено: Сб май 26, 2012 20:29:14
FreshMan
да галок я нигде никаких не раставлял......, я уже начинаю думать что это козни вируса и пора переустанавливать винду....

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

Добавлено: Вт июн 05, 2012 09:36:05
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

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

Добавлено: Вт июн 05, 2012 10:25:09
a_skr
#define polarity PIND.6;
точка с запятой лишняя