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

Обсуждаем контроллеры компании Atmel.
Ответить
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 351
Зарегистрирован: Пн сен 12, 2011 12:13:46

Сообщение Garin »

AlexFisher как нет, в смысле нет и никогда не будет??? :)
А на ногу процессора в реальной схеме ставится стабилитрон 4.7 вольта, и все там ОК!
Есть вот такой исходник на 3х фазный мож кто поможет переделать под схему что я выложил ранее...
Спойлер

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

 // 1. АЦП на частоте 125 кГц цифрует сигнал. Обработчик прерывания Считает суммы отсчетов и их кол-во:
// ADC interrupt service routine
interrupt [ADC_INT] void adc_isr(void)
{
 dword adc_data, temp; 

 // Read the AD conversion result
 adc_data=ADCW&0xFFFE;

 if(isU)
 { // U
 temp=adc_data; //*adc_data;
 sqr_summU+=temp;
 countU++;
 } // if
 else
 { // I
 temp=adc_data; //*adc_data;
 sqr_summI+=temp;
 countI++;
 } // else
} // adc_isr

//2. Главная программа меряет по очереди ток и напряжение:

//.............
 // Измерение напряжения
 isU=1;
 sqr_summU=0;
 countU=0; 
 ADMUX&=0xFE; // ADC0 - канал напряжения
 // Запуск АЦП
 ADCSRA|=0x40; // ADCSC - Start ADC
 startMs=ms;
 // ожидание 21 мс (20мс - период 50 Гц)
 while (abs (ms-startMs)<21);
 // стоп АЦП
 ADCSRA&=0xBF; // 10111111 = BF
//.............

 //для тока также, только переменные другие. Переменная ms глобальная - TC1 по прерыванию считает миллисекунды.

//3. Когда оба померяли, вычисляем

 // Расчет напряжения
 // Среднеквадратическое
 // Urms=sqrt(sum(u(i)^2)/N); u(i) - мгновенные отсчеты (с АЦП), i=1..N
 f_sqr_summU = ((float)sqr_summU)/countU; // ср. арифм.
// f_sqr_summ=sqrt(f_sqr_summ); // Urms (отсчеты АЦП)

 // Uацп=ADC*Vref/1024=ADC*0.005
 U = f_sqr_summU*0.005;

 // Uвх=Urms*109.52
 U*=109.52;

 // Расчет тока
 // Среднеквадратическое
 // Urms=sqrt(sum(u(i)^2)/N); u(i) - мгновенные отсчеты (с АЦП), i=1..N
 f_sqr_summI = ((float)sqr_summI)/countI; // ср. арифм.
// f_sqr_summ=sqrt(f_sqr_summ); // Urms (отсчеты АЦП)

 // Uацп=ADC*Vref/1024=ADC*0.005
 I = f_sqr_summI*0.005;

 // Iн=500*Uацп/148,86 =Uацп*3.359
 I*=3.359;

 // S - Полная мощность 
 S_temp=((dword)I*U); 
 S=S_temp;    
}
Реклама
Мучитель микросхем
Аватара пользователя
Сообщения: 493
Зарегистрирован: Вт апр 21, 2009 13:31:27
Откуда: Санкт-Петербург

Сообщение AlexFisher »

Судя по исходнику, там 1 фаза, а не 3. Для измерения напряжения достаточно выбросить измерение тока, напряжение измеряется среднеквадратическое, соответствует ли это RMS - не знаю.

Вот, что у меня получилось, можете попробовать:
Спойлер

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

#include <mega8.h>

#include <delay.h>
// Declare your global variables here
volatile float U, f_sqr_summU;
volatile long sqr_summU, countU, N;
volatile unsigned char isU;

// External Interrupt 1 service routine
interrupt [EXT_INT1] void ext_int1_isr(void)
{
// Place your code here
  if (PIND.3)      //Фронт
  {
   isU=0;
   sqr_summU=0;
   countU=0;
   ADMUX&=0xFE; // ADC0 - канал напряжения
 // Запуск АЦП
   ADCSRA|=0x40; // ADCSC - Start ADC
  }
  else             //Спад
  {
    // стоп АЦП
   ADCSRA&=0xBF; // 10111111 = BF
    // Расчет напряжения
   // Среднеквадратическое
   // Urms=sqrt(sum(u(i)^2)/N); u(i) - мгновенные отсчеты (с АЦП), i=1..N
   f_sqr_summU = ((float)sqr_summU)/countU; // ср. арифм.
    // f_sqr_summ=sqrt(f_sqr_summ); // Urms (отсчеты АЦП)

   // Uацп=ADC*Vref/1024=ADC*0.005
   U = f_sqr_summU*0.005;

   // Uвх=Urms*109.52
   U*=109.52;
   isU=1;
 }
}

#define ADC_VREF_TYPE 0x40

// ADC interrupt service routine
interrupt [ADC_INT] void adc_isr(void)
{
 long adc_data, temp;

 // Read the AD conversion result
 adc_data=ADCW&0xFFFE;
 temp=adc_data; //*adc_data;
 sqr_summU+=temp;
 countU++;
}



void main(void)
{

// External Interrupt(s) initialization
// INT0: Off
// INT1: On
// INT1 Mode: Any change
GICR|=0x80;
MCUCR=0x04;
GIFR=0x80;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// ADC initialization
// ADC Clock frequency: 1000.000 kHz
// ADC Voltage Reference: AVCC pin
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x8B;

// Global enable interrupts
#asm("sei")

while (1)
      {
      // Place your code here
        if (isU)
        {
        //что-то делаем с измеренным напряжением
        } 
      }
}
[i]Да здравствует всё то, благодаря чему мы не смотря ни на что![/i]
Контактная информация:
Реклама
Опытный кот
Сообщения: 782
Зарегистрирован: Вт апр 26, 2011 18:37:06

Сообщение kras »

Как пользоваться asm-компилятором в CV, писать на asm, возможно ли вообще это?
На практике можно не успеть сделать того, что можно хорошо обосновать в теории. Но без практики теория может отдаляться от нее, и когда они встретятся снова - не узнает даже неприкосновенное шампанское профессора в лаборатории. Моя практика: robofeya.ru
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1451
Зарегистрирован: Пт фев 19, 2010 19:39:28
Откуда: Москва

Сообщение Сериг »

всем привет!нуждаюсь в помощи!атмега 328р,подскажите пожалуйста как оправшивать ADC5 и в зависимостиот напряжения подавать единичку на три порта т.е.вот так вот:
if adc 5 выдает больше 3 вольт,то PORTD5=1;больше 2.85 вольт,но меньше 3.0 вольт, PORTD.5=0;PORTD.6=1; и если меньше 2.85 вольт,то PORTD.5=0;PORTD.6=0:PORTD.7=1;
готов помочь вам деталями за помощь мне! спасибо!
Реклама
Эиком - электронные компоненты и радиодетали
Вымогатель припоя
Аватара пользователя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Сообщение zero648 »

Сериг писал(а):всем привет!нуждаюсь в помощи!атмега 328р,подскажите пожалуйста как оправшивать ADC5 и в зависимостиот напряжения подавать единичку на три порта т.е.вот так вот:
if adc 5 выдает больше 3 вольт,то PORTD5=1;больше 2.85 вольт,но меньше 3.0 вольт, PORTD.5=0;PORTD.6=1; и если меньше 2.85 вольт,то PORTD.5=0;PORTD.6=0:PORTD.7=1;
готов помочь вам деталями за помощь мне! спасибо!
Сначала надо определиться с опорным напряжением, максимальный код АЦП будет равен опорному. Что собораетесь контролировать или измерять?
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

kras писал(а):Как пользоваться asm-компилятором в CV, писать на asm, возможно ли вообще это?
Как такового асм компилятора нет, но есть возможность использовать асм куски кода.
В поисках истины человек развивается.
Контактная информация:
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 351
Зарегистрирован: Пн сен 12, 2011 12:13:46

Сообщение Garin »

AlexFisher Собрал проект в протеусе,
Изображение
измерения делает но по какой логике мне чет совсем не понятно. (Архив этого проекта приложил к сообщению).
Вот еще одно описание алгоритма измерения нашел,
Во время прихода положительной полуволны запускается АЦП, Который успевает за время прохождения этой полуволны сделать порядка 100 выборок, которые обрабатываются по формуле:
Urms= sqrt(1/T* S[u(t)*u(t)]dt,
где: sqrt - корень квадратный, S - интеграл за период времени от 0 до Т.
Для дискретного способа взятия интеграла формула упроститься до вида
Urms=K*sqrt(1/N*sum(Uadc*Uadc)),
Где: К - поправочный коэффициент, Uadc - значение на выходе АЦП, N - число выборок за время прохождения полуволны синусоиды.
Но как это можно применить, для МК......
Вложения
Вольтметр RMS.rar
(84.51 КБ) 167 скачиваний
Urms.jpg
(30.52 КБ) 2238 скачиваний
Родился
Сообщения: 2
Зарегистрирован: Пн авг 20, 2012 22:37:13

Сообщение ZELENSKIY »

Подскажите пожалуйста. :cry:
Я купил программатор AVR USBASP. Пытаюсь собрать простую схему мигания светодиодом.
Подключаю контроллер atmega8515 к программатору, стираю, прошиваю. Все проходит без
ошибок! Программа SinaProg. Выключаю, подключаю диод, питание и тишина!!!
Контроллер не выполняет никаких действий! Что это может быть???

Вот программа:
#include <mega8515.h>
#include <delay.h>
void main(void)
{

DDRC = 0b11111111;
PORTC = 0b00000000;
while(1)
{
PORTC.0=1; delay_ms(500);
PORTC.0=0; delay_ms(500);
}
}
Компилирую в CodeVisionAVR, Беру из папки .hex файл. Фьюзы не трогал!!!
Опытный кот
Сообщения: 782
Зарегистрирован: Вт апр 26, 2011 18:37:06

Сообщение kras »

Может кто-нибудь подробнее указать насчет процесса отладки в CV? Проект прокомпилился, хочу пройтись стрелочкой по коду, а мне на полпути пишет, чтобы я указал путь к AVR компилеру. И что делать?
А точнее невозможно выполнить \AVRStudio.exe
На практике можно не успеть сделать того, что можно хорошо обосновать в теории. Но без практики теория может отдаляться от нее, и когда они встретятся снова - не узнает даже неприкосновенное шампанское профессора в лаборатории. Моя практика: robofeya.ru
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница

Сообщение urry »

Да элементарно, Ватсон, только что Вы это написали.
Проще всего считать среднеквадратичное уже ВЫПРЯМЛЕННОГО переменного напряжения.
Пусть нас интересует частота 50 герц . Делаем выборки АЦП , скажем, ну пусть будет 128 выборок, с частотой 128*50.
После окончания этого процесса каждую из выборок возводим в квадрат и суммируем их.
Затем извлекаем квадратный корень из суммы.
Переводим наше значение в реальный вольтаж . Все...
Для случая невыпрямленного переменного немного сложнее, но не сильно.
Контактная информация:
Мучитель микросхем
Аватара пользователя
Сообщения: 493
Зарегистрирован: Вт апр 21, 2009 13:31:27
Откуда: Санкт-Петербург

Сообщение AlexFisher »

Garin, Алгоритм расчета я взял из приведенного Вами кода и особо не вдумывался. Алгоритм измерения немного поменял - запуск и остановку оцифровки полупериода организовал по внешнему прерыванию (INT1) - настроил на срабатывание по любому уровню. В прерывании проверяется уровень (чтобы определить, спад это или фронт), если фронт - запускается АЦП, сбрасывается признак готовности, если спад - останавливается АЦП и производится расчет, после чего устанавливается признак готовности (он проверяется в основном цикле). Запуск и сотановка по прерыванию обеспечат наиболее точный вариант измерения.
[i]Да здравствует всё то, благодаря чему мы не смотря ни на что![/i]
Контактная информация:
Мучитель микросхем
Аватара пользователя
Сообщения: 493
Зарегистрирован: Вт апр 21, 2009 13:31:27
Откуда: Санкт-Петербург

Сообщение AlexFisher »

kras писал(а):Может кто-нибудь подробнее указать насчет процесса отладки в CV? Проект прокомпилился, хочу пройтись стрелочкой по коду, а мне на полпути пишет, чтобы я указал путь к AVR компилеру. И что делать?
А точнее невозможно выполнить \AVRStudio.exe
Все просто. CV не имеет встроенного отладчика и пытается подключиться к внешнему, каковым и является AVR-studio. Если CV устанавливать после студии, то он сам ее находит и все гут. Если наоборот - нужно указать, где студия живет Изображение
[i]Да здравствует всё то, благодаря чему мы не смотря ни на что![/i]
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 20093
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

ZELENSKIY писал(а):#include <mega8515.h>
#include <delay.h>
Я конечно не знаток СИ, но попробуйте добавить что-то вроде #define F_CPU 1E6 — задать тактовую частоту МК чтобы компилятор мог вычислить необходимые константы. 8515 с завода идёт с тактированием от встроенного 1 МГц RC генератора.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Родился
Сообщения: 2
Зарегистрирован: Пн авг 20, 2012 22:37:13

Сообщение ZELENSKIY »

Gudd-Head писал(а): Я конечно не знаток СИ, но попробуйте добавить что-то вроде #define F_CPU 1E6 — задать тактовую частоту МК чтобы компилятор мог вычислить необходимые константы. 8515 с завода идёт с тактированием от встроенного 1 МГц RC генератора.
Спасибо вечером попробую.
Интересно то, что на 0 порте висит единица. диод горит постоянно и не мигает может подключить внешний кварц?
Тоже думаю, что должен работать на 1 МГц я ничего не менял в настройках!
Друг Кота
Аватара пользователя
Сообщения: 20093
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

ZELENSKIY писал(а):может подключить внешний кварц?
МК бы не прошивался, если бы не тактировался.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1451
Зарегистрирован: Пт фев 19, 2010 19:39:28
Откуда: Москва

Сообщение Сериг »

zero648 писал(а):Сначала надо определиться с опорным напряжением, максимальный код АЦП будет равен опорному. Что собораетесь контролировать или измерять?
Буду изменять напряжение литиевой батарейки!
Максимальное напряжение которое может быть подано на вход ацп 3,3 вольта!
Огромное спасибо!
Опытный кот
Сообщения: 782
Зарегистрирован: Вт апр 26, 2011 18:37:06

Сообщение kras »

AlexFisher, прописал, путь к самому компилятору, а вроде там больше и нет exe, в итоге открывается компилятор, но пусто, ни проекта, ни тем более отладки.
На практике можно не успеть сделать того, что можно хорошо обосновать в теории. Но без практики теория может отдаляться от нее, и когда они встретятся снова - не узнает даже неприкосновенное шампанское профессора в лаборатории. Моя практика: robofeya.ru
Мучитель микросхем
Аватара пользователя
Сообщения: 493
Зарегистрирован: Вт апр 21, 2009 13:31:27
Откуда: Санкт-Петербург

Сообщение AlexFisher »

kras писал(а):AlexFisher, прописал, путь к самому компилятору, а вроде там больше и нет exe, в итоге открывается компилятор, но пусто, ни проекта, ни тем более отладки.
Да. Это у них косяк (у студии) - она не хочет принимать имя файла параметром. Поэтому в "пустой" студии тупо открываем cof-файл проекта - и все начинает рулиться. Вплоть до эмуляции в Протеусе (только она глючная - не всегда открывается, но если откроется - работает нормально).
[i]Да здравствует всё то, благодаря чему мы не смотря ни на что![/i]
Контактная информация:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

Да она принимает, только не открывает файл, а принимает параметр папки, в которой можно поискать этот коф файл.
Так что искать долго не придется.
Может это и не в студии косяк.Кв ведь не знает, какой файл вы хотите запустить, может она не файл параметром передает, а папку?
В поисках истины человек развивается.
Контактная информация:
Открыл глаза
Аватара пользователя
Сообщения: 52
Зарегистрирован: Ср сен 02, 2009 21:39:06
Откуда: Николаев

Сообщение within »

Ребята, как установить разрешение в 9 бит для DS18b20 в стандартной библиотеке?

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

devices=w1_init();
          if(devices>0)
           
          {Tnew=ds18b20_temperature(0);}  //читаем температуру  
          
          if (Tnew>1000){               //если датчик выдаёт больше 1000
             Tnew=4096-Tnew;            //отнимаем от данных 4096
             Tnew=-Tnew;                //и ставим знак "минус"
          }
Очень жаль, когда люди упираются лбом в что-то, хотя это и не логично совсем. А свою логику не объясняют.
Ответить

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