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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
totty
Первый раз сказал Мяу!
Сообщения: 39
Зарегистрирован: Ср авг 03, 2011 22:26:02
Откуда: Севастополь

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

Сообщение totty »

pyzhman писал(а):Оставить заглушенным, т.е. 000. Не забыть разрешить прерывание по переполнению.
Вообще говоря, что за изврат? Для чего? Если событие по условиям, формируемым в таймере1, то там и обрабатывать. Или флажок взвести.


не извращение,та вынужденное решение, требуется рисовать синусоиду шимом, менять коэфффициент заполнения синуса, таймер 0, и менять частоту синусоиды 30-60Гц , таймер 0, а чтобы менять частоту необходимо в широких пределеах менять частоту самого генератора, а это не возможно, поэтому приходит на мысль использовать таймер 1 как источник регулированнй частоты для таймера 0
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

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

Сообщение Мастер Ломастер »

totty писал(а):не извращение,та вынужденное решение, требуется рисовать синусоиду шимом, менять коэфффициент заполнения синуса, таймер 0, и менять частоту синусоиды 30-60Гц , таймер 0, а чтобы менять частоту необходимо в широких пределеах менять частоту самого генератора, а это не возможно, поэтому приходит на мысль использовать таймер 1 как источник регулированнй частоты для таймера 0
почитайте про DDS - там и частота генерируемого сигнала меняется, и частота генератора неизменна - принцип просто другой. на этом принципе вам будет достаточно одного-единственного таймера, работающего на постоянной частоте.
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
totty
Первый раз сказал Мяу!
Сообщения: 39
Зарегистрирован: Ср авг 03, 2011 22:26:02
Откуда: Севастополь

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

Сообщение totty »

Мастер Ломастер, таймера то достаточно, но вот наличие ЦАП у контроллера крайне необходимо, но С ЦАПом на выходе у меня не получится сигнулов для управляющих ключей моста инвертора (речь идет о изменении скорости вращения асинхронного привода, частотой и пропорционально меняя напряжение)

Но если уж DDS для этой задачи самый оптимальный варинт, то как реализовать различное по амплитуде заполнение синусоиды?

и какой МК из не особо дорогих на борту имеет ЦАП?
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

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

Сообщение Мастер Ломастер »

в качестве ЦАП-а отлично выступает ШИМ, выходы которого отлично могут управлять мостом - для того они, собственно, и предназанчены. если будете использовать что-то простое из МК, то обязательно придется ставить драйверы со встроенным мертвым временем, а если возьмете что-то более продвинутое, то мертвое время можно формировать прямо внутри МК.
битва с дураками проиграна, победители торжествуют. слава победителям!
a.garkin
Нашел транзистор. Понюхал.
Сообщения: 175
Зарегистрирован: Вт сен 29, 2009 09:28:51
Откуда: Ульяновск
Контактная информация:

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

Сообщение a.garkin »

Никак не пойму почему в терминал выводит 0 градусов...

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

/*****************************************************
This program was produced by the
CodeWizardAVR V2.04.4a Advanced
Automatic Program Generator
© Copyright 1998-2009 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date    : 14.02.2012
Author  : NeVaDa
Company :
Comments:


Chip type               : ATmega32
Program type            : Application
AVR Core Clock frequency: 16,000000 MHz
Memory model            : Small
External RAM size       : 0
Data Stack size         : 512
*****************************************************/

#include <mega32.h>

// 1 Wire Bus functions
#asm
   .equ __w1_port=0x1B ;PORTA
   .equ __w1_bit=3
#endasm
#include <1wire.h>

// DS1820 Temperature Sensor functions
#include <ds1820.h>

// Standard Input/Output functions
#include <delay.h>
#include <stdio.h>

// Declare your global variables here
#include <ds18b20.h>

int temp;       //переменная для температуры

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: Off
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x08;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x67;

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

// 1 Wire Bus initialization
w1_init();

printf("1-Wire MicroLan Net demo\n\r");

while (1)
      {
      // Place your code here
      temp=ds18b20_temperature(0);      //меряем температуру с первого датчика
if(temp>1000)      //для минусовой температуры
{  temp=4096-temp;;       //отнимаем от значения 4096
temp=-temp;       //ставим противоположный знак
}
printf("Temperature: %f\r",temp,temp%1);       //выводим температуру на ПК
printf("\n\r");       //переходим на следующую строку
delay_ms(1100);       //ждём
      };
}


в итоге на терминале вижу Temperature: 0.000000

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

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

Сообщение vitalik_1984 »

пробуйте перед самым выводом присвоить переменной произвольное значение.так узнаете на каком этапе косяк.или отдельно делайте вывод от остальной программы.Отлаживайте отдельно вывод,когда добьетесь правильной работы подключать к проекту.
В поисках истины человек развивается.
a.garkin
Нашел транзистор. Понюхал.
Сообщения: 175
Зарегистрирован: Вт сен 29, 2009 09:28:51
Откуда: Ульяновск
Контактная информация:

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

Сообщение a.garkin »

vitalik_1984 писал(а):пробуйте перед самым выводом присвоить переменной произвольное значение.так узнаете на каком этапе косяк.или отдельно делайте вывод от остальной программы.Отлаживайте отдельно вывод,когда добьетесь правильной работы подключать к проекту.

а е подскажите как это? левое значение присвоить?
a.garkin
Нашел транзистор. Понюхал.
Сообщения: 175
Зарегистрирован: Вт сен 29, 2009 09:28:51
Откуда: Ульяновск
Контактная информация:

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

Сообщение a.garkin »

vitalik_1984 писал(а):пробуйте перед самым выводом присвоить переменной произвольное значение.так узнаете на каком этапе косяк.или отдельно делайте вывод от остальной программы.Отлаживайте отдельно вывод,когда добьетесь правильной работы подключать к проекту.

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

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

Сообщение vitalik_1984 »

ну это вот так

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

temp=16.5;
printf("Temperature: %f\r",temp,temp%1);       //выводим температуру на ПК
printf("\n\r");       //переходим на следующую строку
delay_ms(1100);       //ждём
      };

если при этом покажет правильные цифры,значит раньше косяк
В поисках истины человек развивается.
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

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

Сообщение IfoR »

Стоп, как вы так делаете?

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

printf("Temperature: %f\r",temp,temp%1);       //выводим температуру на ПК   


Вы передаёте функции printf 2 параметра, а ей самой говорите, что передали только одну переменную float. Это ещё повезло, что программа ещё пытается работать. Оставьте так, хотя бы:

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

printf("Temperature: %f\r\n", temp);       //выводим температуру на ПК   

Но это ещё не всё: переменная temp имеет тип int, а printf сказали, что она имеет тип float. Вероятно, именно по этому программа не вывалилась с крушением стека: вы передаёте printf два целых параметра (2 по 2 байта), а printf читает как одну float - 4 байта. В итоге количество данных считалось верно, но при этом функция приняла мусор в виде float переменной. Такое нужно писать так:

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

printf("Temperature: %d\r\n", temp);       //выводим температуру на ПК   

%d - знаковое десятичное целое, %u - беззнаковое целое.

А что это за конструкция такая: ?
Это же остаток от деления целого числа на 1. А деление целого на 1 всегда даёт в остатке 0. Так что не знаю чем temp%1 лучше 0.


Ну ещё придирки, вот это место:

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

temp=ds18b20_temperature(0);      //меряем температуру с первого датчика
if(temp>1000)      //для минусовой температуры
{  temp=4096-temp;;       //отнимаем от значения 4096
temp=-temp;       //ставим противоположный знак
} 


Почему бы это

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

temp=4096-temp;;       //отнимаем от значения 4096
temp=-temp;       //ставим противоположный знак   

Не написать просто как:

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

temp-=4096; 

?
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
John79
Родился
Сообщения: 15
Зарегистрирован: Сб дек 24, 2011 21:40:20

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

Сообщение John79 »

Ребят подскажите пожалуйста, в чем разница между:

putsf
putshar
printf
udr

В каком случае я какой оператор должем применять?

Я сейчас балуюсь с мобильником, и когда отправляю ему команду atd +7хххххххххх; (команда звонка на номер) из Hyper Terminal, то все работает (телефон начинает звонить), а если ту же команду отправляю из контроллера mega16 с помощью оператора printf, то ничего не происходит, хотя если опять же подцепить Hyper Terminal к МК то команда выводится правильно.

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

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

Сообщение vitalik_1984 »

блин вы сначала русский язык выучите,а потом уже программные языки учите.Пробовал Пробую пробуйте попробовать пишется
В поисках истины человек развивается.
John79
Родился
Сообщения: 15
Зарегистрирован: Сб дек 24, 2011 21:40:20

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

Сообщение John79 »

Спасибо за совет, я ПОПРОБУЮ, думаю он мне поможет. А вы не могли бы еще и пунктуацию проверить?
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

John79, так вопросы не задают. "Я что-то там делаю, но у меня ничего не работает. Что я не так делаю ? ...."
Прежде чем задать вопрос, напишите что Вы конкретно сделали и как (выложите код, если необходимо), а потом уже задавайте вопрос.
Вы, скорее всего, не передаёте (или передаёте, но не правильно) конец строки.
John79
Родился
Сообщения: 15
Зарегистрирован: Сб дек 24, 2011 21:40:20

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

Сообщение John79 »

Аlex, по моему я задал вопрос очень корректно:

Ребят подскажите пожалуйста, в чем разница между:

putsf
putshar
printf
udr

В каком случае я какой оператор должем применять?

Дальше я просто пояснил, что я пытаюсь сделать. Я не спрашиваю, что я делаю не так, я в этом сам разберусь, когда смылс этих опреаторов мне ясен будет. Сейчас я плохо себе это представляю, и справка CVAVR мне слабо помогла, поэтому я здесь и спросил об этом.

Но если вы настаиваете, то проблема в том, что когда я из терминала отправляю строку atd +7хххххххххх, мобильник подключенный к ПК начинает дозвон, а если прошить МК таким кодом:

while (1)
{

printf ("atd +7хххххххххх");
delay_ms(1000);

};

то дозвон не происходит.

Если применить такой код

while (1)
{

putsf ("atd +7хххххххххх");
delay_ms(1000);

};
то тоже ничего не происходит за исключение того, что МК отправляет еще и символ возврата каретки.

Телефон рабочий, уровни согласованы
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

John79 писал(а):Аlex, по моему я задал вопрос очень корректно:
Не совсем корректно. Вы не показали каким образом передаёте строку, т.е. сам код.

printf ("atd +7хххххххххх");
Ну вот, видите, про конечные символы забыли :)
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

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

Сообщение IfoR »

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

printf ("ATD +7хххххххххх;\n"); 

или

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

printf ("ATD +7хххххххххх;\n\r"); 

?
Или ";" в конце не нужно?
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

IfoR не выдержал. А я хотел помучить, что бы человек сам додумался. Ну или доку немного покурил :)

John79, во первых, в конце строки должен быть символ ";", а во вторых, строка должна заканчиваться символами 0x0D ("/r") и 0x0A ("/n").
Всё это есть в документах по AT-командам.
John79
Родился
Сообщения: 15
Зарегистрирован: Сб дек 24, 2011 21:40:20

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

Сообщение John79 »

да, верно, правда, я другим способом этого добился :))

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

putsf ("\x61\x74\x64\x20\x2B\x37\xхх\xxx\xxx\xxx\xxx\xxx\xxx\xxx\xxx\xxx\x0D")


Так, а все таки, когда какой оператор нужен?

И не зачем меня мучать, тем более AT команды у всех разные, мог бы и не додуматься вообще
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

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

Сообщение IfoR »

Аlex, а-а, это было это...
Ну по крайней мере, на счёт ";" я сам тогда долго тупил, пока где-то не прочёл.
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Ответить

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