не извращение,та вынужденное решение, требуется рисовать синусоиду шимом, менять коэфффициент заполнения синуса, таймер 0, и менять частоту синусоиды 30-60Гц , таймер 0, а чтобы менять частоту необходимо в широких пределеах менять частоту самого генератора, а это не возможно, поэтому приходит на мысль использовать таймер 1 как источник регулированнй частоты для таймера 0pyzhman писал(а):Оставить заглушенным, т.е. 000. Не забыть разрешить прерывание по переполнению.
Вообще говоря, что за изврат? Для чего? Если событие по условиям, формируемым в таймере1, то там и обрабатывать. Или флажок взвести.
CodeVision AVR в вопросах и ответах
- Реклама
почитайте про DDS - там и частота генерируемого сигнала меняется, и частота генератора неизменна - принцип просто другой. на этом принципе вам будет достаточно одного-единственного таймера, работающего на постоянной частоте.totty писал(а):не извращение,та вынужденное решение, требуется рисовать синусоиду шимом, менять коэфффициент заполнения синуса, таймер 0, и менять частоту синусоиды 30-60Гц , таймер 0, а чтобы менять частоту необходимо в широких пределеах менять частоту самого генератора, а это не возможно, поэтому приходит на мысль использовать таймер 1 как источник регулированнй частоты для таймера 0
битва с дураками проиграна, победители торжествуют. слава победителям!
Мастер Ломастер, таймера то достаточно, но вот наличие ЦАП у контроллера крайне необходимо, но С ЦАПом на выходе у меня не получится сигнулов для управляющих ключей моста инвертора (речь идет о изменении скорости вращения асинхронного привода, частотой и пропорционально меняя напряжение)
Но если уж DDS для этой задачи самый оптимальный варинт, то как реализовать различное по амплитуде заполнение синусоиды?
и какой МК из не особо дорогих на борту имеет ЦАП?
Но если уж DDS для этой задачи самый оптимальный варинт, то как реализовать различное по амплитуде заполнение синусоиды?
и какой МК из не особо дорогих на борту имеет ЦАП?
в качестве ЦАП-а отлично выступает ШИМ, выходы которого отлично могут управлять мостом - для того они, собственно, и предназанчены. если будете использовать что-то простое из МК, то обязательно придется ставить драйверы со встроенным мертвым временем, а если возьмете что-то более продвинутое, то мертвое время можно формировать прямо внутри МК.
битва с дураками проиграна, победители торжествуют. слава победителям!
Никак не пойму почему в терминал выводит 0 градусов...
в итоге на терминале вижу Temperature: 0.000000
Почему так? На LCD нормально шлет... float,wigt,precision в свойствах проекта стоит... Помогите плиз.
Код: Выделить всё
/*****************************************************
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); //ждём
};
}
Почему так? На LCD нормально шлет... float,wigt,precision в свойствах проекта стоит... Помогите плиз.
- Реклама
пробуйте перед самым выводом присвоить переменной произвольное значение.так узнаете на каком этапе косяк.или отдельно делайте вывод от остальной программы.Отлаживайте отдельно вывод,когда добьетесь правильной работы подключать к проекту.
В поисках истины человек развивается.
а е подскажите как это? левое значение присвоить?vitalik_1984 писал(а):пробуйте перед самым выводом присвоить переменной произвольное значение.так узнаете на каком этапе косяк.или отдельно делайте вывод от остальной программы.Отлаживайте отдельно вывод,когда добьетесь правильной работы подключать к проекту.
а е подскажите как это? левое значение присвоить?vitalik_1984 писал(а):пробуйте перед самым выводом присвоить переменной произвольное значение.так узнаете на каком этапе косяк.или отдельно делайте вывод от остальной программы.Отлаживайте отдельно вывод,когда добьетесь правильной работы подключать к проекту.
ну это вот так
если при этом покажет правильные цифры,значит раньше косяк
Код: Выделить всё
temp=16.5;
printf("Temperature: %f\r",temp,temp%1); //выводим температуру на ПК
printf("\n\r"); //переходим на следующую строку
delay_ms(1100); //ждём
};В поисках истины человек развивается.
Стоп, как вы так делаете?
Но это ещё не всё: переменная temp имеет тип int, а printf сказали, что она имеет тип float. Вероятно, именно по этому программа не вывалилась с крушением стека: вы передаёте printf два целых параметра (2 по 2 байта), а printf читает как одну float - 4 байта. В итоге количество данных считалось верно, но при этом функция приняла мусор в виде float переменной. Такое нужно писать так:
%d - знаковое десятичное целое, %u - беззнаковое целое.
А что это за конструкция такая:?
Это же остаток от деления целого числа на 1. А деление целого на 1 всегда даёт в остатке 0. Так что не знаю чем temp%1 лучше 0.
Ну ещё придирки, вот это место:
Почему бы это
Не написать просто как:
?
Вы передаёте функции printf 2 параметра, а ей самой говорите, что передали только одну переменную float. Это ещё повезло, что программа ещё пытается работать. Оставьте так, хотя бы:Код: Выделить всё
printf("Temperature: %f\r",temp,temp%1); //выводим температуру на ПК
Код: Выделить всё
printf("Temperature: %f\r\n", temp); //выводим температуру на ПК Код: Выделить всё
printf("Temperature: %d\r\n", temp); //выводим температуру на ПК А что это за конструкция такая:
Код: Выделить всё
temp%1Это же остаток от деления целого числа на 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; - Сообщения: 15
- Зарегистрирован: Сб дек 24, 2011 21:40:20
Ребят подскажите пожалуйста, в чем разница между:
putsf
putshar
printf
udr
В каком случае я какой оператор должем применять?
Я сейчас балуюсь с мобильником, и когда отправляю ему команду atd +7хххххххххх; (команда звонка на номер) из Hyper Terminal, то все работает (телефон начинает звонить), а если ту же команду отправляю из контроллера mega16 с помощью оператора printf, то ничего не происходит, хотя если опять же подцепить Hyper Terminal к МК то команда выводится правильно.
Пробывал другие операторы, но он либо какие то доп символы начинал слать, либо при компилировании ругался.
putsf
putshar
printf
udr
В каком случае я какой оператор должем применять?
Я сейчас балуюсь с мобильником, и когда отправляю ему команду atd +7хххххххххх; (команда звонка на номер) из Hyper Terminal, то все работает (телефон начинает звонить), а если ту же команду отправляю из контроллера mega16 с помощью оператора printf, то ничего не происходит, хотя если опять же подцепить Hyper Terminal к МК то команда выводится правильно.
Пробывал другие операторы, но он либо какие то доп символы начинал слать, либо при компилировании ругался.
блин вы сначала русский язык выучите,а потом уже программные языки учите.Пробовал Пробую пробуйте попробовать пишется
В поисках истины человек развивается.
- Сообщения: 15
- Зарегистрирован: Сб дек 24, 2011 21:40:20
Спасибо за совет, я ПОПРОБУЮ, думаю он мне поможет. А вы не могли бы еще и пунктуацию проверить?
John79, так вопросы не задают. "Я что-то там делаю, но у меня ничего не работает. Что я не так делаю ? ...."
Прежде чем задать вопрос, напишите что Вы конкретно сделали и как (выложите код, если необходимо), а потом уже задавайте вопрос.
Вы, скорее всего, не передаёте (или передаёте, но не правильно) конец строки.
Прежде чем задать вопрос, напишите что Вы конкретно сделали и как (выложите код, если необходимо), а потом уже задавайте вопрос.
Вы, скорее всего, не передаёте (или передаёте, но не правильно) конец строки.
- Сообщения: 15
- Зарегистрирован: Сб дек 24, 2011 21:40:20
Аlex, по моему я задал вопрос очень корректно:
Ребят подскажите пожалуйста, в чем разница между:
putsf
putshar
printf
udr
В каком случае я какой оператор должем применять?
Дальше я просто пояснил, что я пытаюсь сделать. Я не спрашиваю, что я делаю не так, я в этом сам разберусь, когда смылс этих опреаторов мне ясен будет. Сейчас я плохо себе это представляю, и справка CVAVR мне слабо помогла, поэтому я здесь и спросил об этом.
Но если вы настаиваете, то проблема в том, что когда я из терминала отправляю строку atd +7хххххххххх, мобильник подключенный к ПК начинает дозвон, а если прошить МК таким кодом:
while (1)
{
printf ("atd +7хххххххххх");
delay_ms(1000);
};
то дозвон не происходит.
Если применить такой код
while (1)
{
putsf ("atd +7хххххххххх");
delay_ms(1000);
};
то тоже ничего не происходит за исключение того, что МК отправляет еще и символ возврата каретки.
Телефон рабочий, уровни согласованы
Ребят подскажите пожалуйста, в чем разница между:
putsf
putshar
printf
udr
В каком случае я какой оператор должем применять?
Дальше я просто пояснил, что я пытаюсь сделать. Я не спрашиваю, что я делаю не так, я в этом сам разберусь, когда смылс этих опреаторов мне ясен будет. Сейчас я плохо себе это представляю, и справка CVAVR мне слабо помогла, поэтому я здесь и спросил об этом.
Но если вы настаиваете, то проблема в том, что когда я из терминала отправляю строку atd +7хххххххххх, мобильник подключенный к ПК начинает дозвон, а если прошить МК таким кодом:
while (1)
{
printf ("atd +7хххххххххх");
delay_ms(1000);
};
то дозвон не происходит.
Если применить такой код
while (1)
{
putsf ("atd +7хххххххххх");
delay_ms(1000);
};
то тоже ничего не происходит за исключение того, что МК отправляет еще и символ возврата каретки.
Телефон рабочий, уровни согласованы
Не совсем корректно. Вы не показали каким образом передаёте строку, т.е. сам код.John79 писал(а):Аlex, по моему я задал вопрос очень корректно:
Ну вот, видите, про конечные символы забылиprintf ("atd +7хххххххххх");
Код: Выделить всё
printf ("ATD +7хххххххххх;\n"); Код: Выделить всё
printf ("ATD +7хххххххххх;\n\r"); Или ";" в конце не нужно?
IfoR не выдержал. А я хотел помучить, что бы человек сам додумался. Ну или доку немного покурил
John79, во первых, в конце строки должен быть символ ";", а во вторых, строка должна заканчиваться символами 0x0D ("/r") и 0x0A ("/n").
Всё это есть в документах по AT-командам.
John79, во первых, в конце строки должен быть символ ";", а во вторых, строка должна заканчиваться символами 0x0D ("/r") и 0x0A ("/n").
Всё это есть в документах по AT-командам.
- Сообщения: 15
- Зарегистрирован: Сб дек 24, 2011 21:40:20
да, верно, правда, я другим способом этого добился
Так, а все таки, когда какой оператор нужен?
И не зачем меня мучать, тем более AT команды у всех разные, мог бы и не додуматься вообще
Код: Выделить всё
putsf ("\x61\x74\x64\x20\x2B\x37\xхх\xxx\xxx\xxx\xxx\xxx\xxx\xxx\xxx\xxx\x0D")И не зачем меня мучать, тем более AT команды у всех разные, мог бы и не додуматься вообще
Аlex, а-а, это было это...
Ну по крайней мере, на счёт ";" я сам тогда долго тупил, пока где-то не прочёл.
Ну по крайней мере, на счёт ";" я сам тогда долго тупил, пока где-то не прочёл.



