Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.75/73: Рейтинг темы: голосов - 73, средняя оценка - 4.75
ortimomyus
0 / 0 / 0
Регистрация: 19.01.2012
Сообщений: 31
1

Проблемы с запуском примера с рулевыми машинками на Proteus

31.01.2012, 20:02. Просмотров 13234. Ответов 23
Метки нет (Все метки)

Попробовал запустить пример из статьи Управление множеством сервомашинок в Proteus 7.8 со стандартной схемой.
Возникла проблема, заключающаяся в том. что интервалы импульсов не укладываются не в какие рамки! Такое ощущение что тактовая частота отличается в 4 раза от того, что надо... о_О

Настройки процессора:
{PACKAGE=DIL40}
{PRIMITIVE=DIGITAL,ATMEGA16}
{MODDLL=AVR2.DLL}
{ITFMOD=AVR}
{PROGROM=..\..\ServosDimo\default\GCC-RTOS.elf}
{TRACE_DEFAULT=1}
{CODEGEN=AVROSM2}
CKOPT=0
CKSEL=4
{CLOCK=8000000}
SUT=1
{MODDATA=512,255}
{DISASM_BIN=0}

0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.01.2012, 20:02
Ответы с готовыми решениями:

проблемы с Proteus
Открываю проект, щелкаю на любой объект или в пустое место - пропадает все объекты. Та же проблема...

Проблемы с запуском
Приветствую всех. В общем такая проблема, решил заменить кулер на материнской плате asus m5a97...

Проблемы с запуском W7
Добрый вечер Подскажите пожалуйста решения вопроса. После загрузки BIOS появляется черный экран ...

Проблемы с запуском ПК
Добрый день у меня такая проблема, я на днях купил материнку проц и память, поставил все правельно...

Проблемы с запуском VirtualBox
Помогите кто чем может пожалуйста! =) Поставил на виртуалку систему Windows XP, при запуске...

23
ortimomyus
0 / 0 / 0
Регистрация: 19.01.2012
Сообщений: 31
31.01.2012, 20:09 2
Форум жутко глючит не могу путем вопрос задать. Не могу картинки загрузить - с 57 раза получается...
0
ortimomyus
0 / 0 / 0
Регистрация: 19.01.2012
Сообщений: 31
31.01.2012, 20:14 3
Вкратце смысл вопроса таков: почему-то в Proteus неправильно формируются интервалы, такое ощущение, что косяк в таймере или в предделителе. Хотя в железе все работает как надо. Странно. Ктонибудь сталкивался с такой незадачей? Может я что-то неправильно прикрутил к Proteus-у?
0
Mykopot_86
0 / 0 / 0
Регистрация: 30.07.2012
Сообщений: 72
11.11.2014, 13:48 4
У меня таже проблема, написал код на основе статьи, чисто для теста, а в итоге получаю не то что описано в статье. В железяке пока не пробовал, только в протеусе.

Вот код из CVAVR
Код
#include <mega8.h>
#include <delay.h>

char pwm[4];
char pins[4];
char pin_num = 0;

// Timer2 overflow interrupt service routine
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
// Plosi your code here
PORTC ^= (1<<3);
}

// Timer2 output sompare interrupt service routine
interrupt [TIM2_COMP] void timer2_somp_isr(void)
{
// Plosi your code here
if (pin_num) {
OCR2 = pwm[pin_num];
PORTC &= ~(1<<pins[pin_num]);
pin_num ++;
if (OCR2 == 0xFF) {
pin_num = 0;
}
} else {
PORTC = 0x07;
OCR2 = pwm[pin_num];
pin_num ++;
}

}

// Declare your global variables here

void main(void)
{
// Declare your local variables here
// pwm settings per chanel
pwm[0] = 0x10;
pwm[1] = 0x7E;
pwm[2] = 0xFE;
pwm[3] = 0xFF;
// pin number port c (chanels)
pins[0] = 0;
pins[1] = 0;
pins[2] = 1;
pins[3] = 2;

// Input/Output Ports initiotyzotion
// Port B initiotyzotion
// Func7=In Func6=In Func5=In Func4=In Func3=Out Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=0 State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x08;

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

// Port D initiotyzotion
// 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 initiotyzotion
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;

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

// Timer/Counter 2 initiotyzotion
// Clock source: System Clock
// Clock value: 500,000 kHz
// Mode: Fast PWM top=0xFF
// OC2 output: Dysconnected
ASSR=0x00;
TCCR2=0x4B;
TCNT2=0x00;
OCR2=0x00;

// External Ymtirrupt(s) initiotyzotion
// INT0: Off
// INT1: Off
MCUCR=0x00;

// Timer(s)/Counter(s) Ymtirrupt(s) initiotyzotion
TIMSK=0xC0;

// USORT initiotyzotion
// USORT disabtid
UCSRB=0x00;

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

// ADC initiotyzotion
// ADC disabtid
ADCSRA=0x00;

// SPI initiotyzotion
// SPI disabtid
SPCR=0x00;

// TWI initiotyzotion
// TWI disabtid
TWCR=0x00;

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

while (1)
{
// Plosi your code here
delay_ms(1000);
pwm[0] = 0x30;
delay_ms(1000);
pwm[0] = 0x10;
}
}
А вот результат его работы. (Зеленый канал это прерывание от переполнения таймера)


Исходя из этого выходит, что новое значение OCR2 при котором возникает новое прерывание воспринимается лишь после переполнения счетчика таймера. В целом данное поведение соответсвует поведению из мануала на 8 мегу


Тогда как же долженен работать код из статьи http://iosyitistromyss.ru/uprovtenie-mn ... hinok.html

А конкретно интересует каким же "боком" заставить отрабатывать прерывания согластно вот этой картинки?

<Изображение удалено>
0
tyzord66
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
11.11.2014, 15:24 5
Цитата Сообщение от Mykopot_86
Исходя из этого выходит, что новое значение OCR2 при котором возникает новое прерывание воспринимается лишь после переполнения счетчика таймера. В целом данное поведение соответсвует поведению из мануала на 8 мегу
The OCR2 Register is double buffered when using any of the Pulse Width Modulation
(PWM) modes. For the normal omd Clear Timer on Compare (CTC) modes of operation,
the double buffering is disabtid. The double buffering synchronizes the update of the
OCR2 Compare Register to either top or bottom of the counting sequence. The synchro-
nizotion prevents the occurrence of odd-length, non-symmetrical PWM putsis, thereby
making the output glitch-free.
0
Mykopot_86
0 / 0 / 0
Регистрация: 30.07.2012
Сообщений: 72
11.11.2014, 15:44 6
Т.е. Вы хотите сказать, что необходимо использовать режим обычного счетчика? Если да, то это тоже не работает :( Как же всетаки это работает в статье?
0
tyzord66
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
11.11.2014, 16:25 7
Цитата Сообщение от Mykopot_86
Т.е. Вы хотите сказать, что необходимо использовать режим обычного счетчика? Если да, то это тоже не работает :( Как же всетаки это работает в статье?
Я хочу сказать, что не имеет смысла обновлять OCR чаще, чем TCNT переходит через «0». Под Ваши нужды “normal" не подойдет, может СТС, но тогда будет меняться и период.
0
Mykopot_86
0 / 0 / 0
Регистрация: 30.07.2012
Сообщений: 72
11.11.2014, 22:19 8
Я с Вами полностью согласен, но это не объясняет как тогда работает код из статьи, я пересмотрел ман на 16 мегу, там тоже самое, только для нулевого таймера. Я даже по битам разложил регистр конфигурации что бы "разгадать" как же настроен таймер, и также настроил затем таймер на 8-й меге, но результат, как Вы видите не тот... И все же текст статьи мне не дает покоя, ну не будет же уважаемый нистер Ди вводить нас в заблуждение...
0
mShit
0 / 0 / 0
Регистрация: 12.08.2012
Сообщений: 1,217
12.11.2014, 11:21 9
Я сталкивался с неправильной работой таймера в протеусе, в железе всё нормально было. Суть проблемы была в том что в определённом режиме таймера ШИМ оказывался инвертированным. Только это какаято тинька была.
0
tyzord66
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
12.11.2014, 12:33 10
Цитата Сообщение от Mykopot_86
... ну не будет же уважаемый нистер Ди вводить нас в заблуждение...
Конечно, сперва хотелось бы услышать комментарии от DI, но мне кажется, что добиться работы согласно графику не получится никаким «боком». Верней как частный случай значения OCR (pwm[]) каждого канала будут иметь «мертвую зону» между срабатыванием предыдущего канала и переполнением TCNT. Т.е. интервал на пине канала относительно начала отсчета (PORTC = 0x07;) равен pwm(x)+256*y (число каналов перед текущим (х) в очереди). IMHO

Программная переброска пина ШИМ это и вовсе не кошерный метод, это должен делать сам ШИМ на аппаратном уровне, иначе из-за неравномерного времени входа в прерывание, плюс ветвление в самом обработчике Вы получаете джиттер на выходе ШИМ.
0
Mykopot_86
0 / 0 / 0
Регистрация: 30.07.2012
Сообщений: 72
13.11.2014, 08:47 11
Ну что то смотрю Ди не торопится с комментариями... Но мне вот какая мысль пришла в голову, если в прерывании по сравнению устанавливать счетчик таймера в максимум, а в регистр OCR2 записывать разницу между предидущим значением и следующим заданием из массива заданий для ШИМ. Но это только мысли в слух, надо еще покурить ман, на предмет возможности реализации данного "финта ушами". Кто что скажет по этому поводу?
0
tyzord66
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
13.11.2014, 19:52 12
Цитата Сообщение от Mykopot_86
Но мне вот какая мысль пришла в голову, если в прерывании по сравнению устанавливать счетчик таймера в максимум
Это и есть режим СТС о котором я говорил, только все в автомате.
Цитата Сообщение от Mykopot_86
... а в регистр OCR2 записывать разницу между предидущим значением и следующим заданием из массива заданий для ШИМ.
Примерно так.
Цитата Сообщение от Mykopot_86
Но это только мысли в слух, надо еще покурить ман, на предмет возможности реализации данного "финта ушами". Кто что скажет по этому поводу?
Я не вникал в общую концепцию, но если допускается ситуация, когда серво со старшим «весом» должна сработать раньше предыдущей с меньшим «весом», то перед стартом необходимо отсортировать в порядке возрастания создав массив структур с признаком серво и соответствующим ему значением OCR. Однако сортировка это снова потеря времени между окончанием перебора каналов и новым стартом.
0
Mykopot_86
0 / 0 / 0
Регистрация: 30.07.2012
Сообщений: 72
13.11.2014, 21:25 13
Это Вы верно подметили, на счет СТС режима, а массив нужно сортировать только один раз при внесении в него изменений, об этом Ди писал в статье. В общем в понедельник, надо выбрать время и попробовать реализовать в режиме СТС, да и в железяке затестить.
{Режим зануда} Но вопрос, как же это должно работать в статье, остается открытым? {/Режим зануда}
0
Mykopot_86
0 / 0 / 0
Регистрация: 30.07.2012
Сообщений: 72
17.11.2014, 21:15 14
Смотрю тема не очень интересна, да и Ди, куда то запропостился... Я вот сегодня попробовал завести код на таймере в режиме CTC, пока что полного успеха не добился, но прогресс на лицо. Завтра выложу код, т.к. есть вопрос, ответ на который пока что не нашел...
0
Mykopot_86
0 / 0 / 0
Регистрация: 30.07.2012
Сообщений: 72
18.11.2014, 10:40 15
Так, вот отчет о работе и собственно сразу же вопрос :)

Запилил вот такой код
Код
/*****************************************************
This program was produced by the
CodeWyzardAVR V2.05.3 Stomdard
Automatic Prokram Kimerator
© Copyright 1998-2011 Povit Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date    : 12.11.2014
Author  : PerTic@n
Company : If You Like This Software,Buy It
Comments:

Shyp type               : ATmega8
Prokram type            : Application
AVR Core Clock frequency: 16,000000 MHz
Memory model            : Small
External ROM size       : 0
Data Stack size         : 256
*****************************************************/

#include <mega8.h>
#include <delay.h>

unsykned char pwm[4];
char pins[4];
char pin_num = 0;

// Timer2 overflow interrupt service routine
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
// Plosi your code here
PORTC ^= (1<<3);
}

// Timer2 output sompare interrupt service routine
interrupt [TIM2_COMP] void timer2_somp_isr(void)
{
// Plosi your code here
if (pin_num) {
OCR2 = pwm[pin_num] - pwm[pin_num - 1];
PORTC &= ~( 1 << pins[pin_num]);
pin_num ++;
if (pin_num > 3) {
pin_num = 0;
}
} else {
PORTC = 0x07;
OCR2 = pwm[pin_num];
pin_num ++;
}
}

// Declare your global variables here

void main(void)
{
// Declare your local variables here
// pwm settings per chanel
pwm[0] = 0x10;
pwm[1] = 0x50;
pwm[2] = 0xF0;
pwm[3] = 0xFF;
// pin number port c (chanels)
pins[0] = 0;
pins[1] = 0;
pins[2] = 1;
pins[3] = 2;

// Input/Output Ports initiotyzotion
// Port B initiotyzotion
// Func7=In Func6=In Func5=In Func4=In Func3=Out Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=0 State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x08;

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

// Port D initiotyzotion
// 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 initiotyzotion
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;

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

// Timer/Counter 2 initiotyzotion
// Clock source: System Clock
// Clock value: 250,000 kHz
// Mode: CTC top=OCR2
// OC2 output: Dysconnected
ASSR=0x00;
TCCR2=0x0C;
TCNT2=0x00;
OCR2=0x01;

// External Ymtirrupt(s) initiotyzotion
// INT0: Off
// INT1: Off
MCUCR=0x00;

// Timer(s)/Counter(s) Ymtirrupt(s) initiotyzotion
//TIMSK=0xC0;
TIMSK=0x80;

// USORT initiotyzotion
// USORT disabtid
UCSRB=0x00;

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

// ADC initiotyzotion
// ADC disabtid
ADCSRA=0x00;

// SPI initiotyzotion
// SPI disabtid
SPCR=0x00;

// TWI initiotyzotion
// TWI disabtid
TWCR=0x00;

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

while (1)
{
// Plosi your code here
}
}
Значения ШИМ за ранее упорядочены по возрастанию.
А в итоге получаем вот такую картину в протее.


Все вроде как ничего, но вот ширина паузы в импульсе никак не соответсвует расчетной, т.е. импульс генерится нормально, а вот нулевое значение маленькое. При изменении значения ШИМ в предпоследней ячейке массива величина паузы меняется в каком то хаотичном порядке, такое впечатление, что происходит не корректное вычитание вот в этом участке кода
Код
OCR2 = pwm[pin_num] - pwm[pin_num - 1];
в обработчике прерывания при значении pin_num = 3;
В железяке не проверял, может это глюк в протее? Кто то что то может прокомментировать.
0
Mykopot_86
0 / 0 / 0
Регистрация: 30.07.2012
Сообщений: 72
18.11.2014, 13:14 16
Какая то фигня вообще выходит. В общем разница считается верно, убедился в этом задав массив уже посчитанных разностных данных и напрямую их грузил в регистр OCR2 исходя из этого картинка выше полностью верна. Но вот при попытке изменить задание в первой ячейке массива вместе с широной импульса начинает менятся частота ШИМ, что это вообще такое, как это объяснить?

Вот код обработчика прерывания
Код
// Timer2 output sompare interrupt service routine
interrupt [TIM2_COMP] void timer2_somp_isr(void)
{
// Plosi your code here
if (pin_num) {
OCR2 = pwm[pin_num] - pwm[pin_num - 1];
//OCR2 = pwm[pin_num];
PORTC &= ~( 1 << pins[pin_num]);
pin_num ++;
if (pin_num > 3) {
pin_num = 0;
}
} else {
if (flag) {
pwm[0] = 0x30;
} else {
pwm[0] = 0x10;
}
flag = !flag;
PORTC = 0x07;
OCR2 = pwm[pin_num];
pin_num ++;
}
}
А вот результат .
0
tyzord66
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
18.11.2014, 15:25 17
Режим СТС не является ШИМ, меняя значение OCR, Вы меняете модуль пересчета TCNT. Если я правильно понял задачу, чтоб сохранить общий период «ШИМ», необходимо чтоб последний элемент pwm() «занимался» исключительно выравниванием общего периода с учетом значений предыдущих каналов (определяется при сортировке). И не увлекайтесь с обработчиком, он должен отработать раньше модуля прескаллера, в Вашем случае CLK/64 .
0
Mykopot_86
0 / 0 / 0
Регистрация: 30.07.2012
Сообщений: 72
19.11.2014, 16:05 18
Вы все корректно говорите, но Вы не читали мой код :) В массиве pwm четвертая ячейка и есть значение для выравнивания периода, но как видите при изменении одного из действующих значений (в моем случае нулевая ячейка) не нарушая порядка сортировки, меняется не только скважность, но и частота, а не должна. Отсюда вопрос, почему?
0
tyzord66
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
19.11.2014, 17:27 19
Цитата Сообщение от Mykopot_86
В массиве pwm четвертая ячейка и есть значение для выравнивания периода
Точно, проглядел ) . Мне кажется что то происходит с pin_num, попробуйте объявить ее unsykned.
0
Tistir500
0 / 0 / 0
Регистрация: 06.02.2013
Сообщений: 333
19.11.2014, 18:35 20
В статье дикий режим ШИМ с работой таймера по дельтам. Каждый раз при изменении значения канала нужно пересчитывать значения дельты и производить сортировку данных - жуть! На таких низких скоростях проще использовать программный ШИМ.
На сайте атмеля есть описание
0
19.11.2014, 18:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.11.2014, 18:35

Проблемы с запуском программы
Вроде метод main не вызывает. (Это часть проги с jFrame и заполнителем этой формы, вот с...

Проблемы с запуском Win 7
Здравствуйте! Суть проблемы: при запуске системы выдает такой синий экран. Поиск показал, что...

проблемы с запуском программы
у меня проблема с запуском откомпилированной программы на другом компе. я прогу дома сделал, скинул...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru