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

Обсуждаем контроллеры компании Atmel.
Ответить
Прорезались зубы
Аватара пользователя
Сообщения: 236
Зарегистрирован: Чт июн 25, 2009 16:00:25
Откуда: нижний новгород

Сообщение pashaumnov »

вы прочитали предыдущий пост там где я про goto спрашиваю.все таки его не заменить кроме таймера, и про delay_us(переменная ) я писал . компилятор ошибку пишет если туда вписываешь переменую а не число, это происходит только с us с delay_ms такого не наблюдаетя
Реклама
Мучитель микросхем
Аватара пользователя
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

Сообщение unalex »

видимо не прочитал
начсет goto - заменить можно, просто я непрявильно понял логику работы(словесное описание понимается хуже блок схемы, поэтому рекомендуется составить ее)

вот полезная программка, сложные ветвления она конечно не осилит, но поможет
Изображение
c delay_us()действительно есть такая фишка, совсем об этом забыл - надо ей передавать число, поэтому делаем под разные звуки разные функции с жестко прописанными задержками

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

void sound1(char cycles)
{
	while(cycles)
	{
		delay_us(100);
		PORTB.6 = 1;
		delay_us(100);
		PORTB.6 = 0;
		cycles--;
	}
}

..........
нашел еще одну простенькую программку, поинтереснее
http://watts.cs.sonoma.edu/SFC/
Вложения
AFCE.PNG
(54.65 КБ) 1379 скачиваний
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Реклама
Прорезались зубы
Аватара пользователя
Сообщения: 236
Зарегистрирован: Чт июн 25, 2009 16:00:25
Откуда: нижний новгород

Сообщение pashaumnov »

спасибо за програмку))) скачал такую же как у вас. да жаль что посложнее ветвления не получаются. и поэтому я даже в ней не могу блок схему составить для опроса ручника в нужном мне режиме. проще на листочке набросать, я кстати так и делал , только не знаю чем можно заменить goto? или точнее как ее перестроить чтобы не использовать goto все было бы проще если бы я мог использовать таймер.((( я писал прогу для работы с таймером выставлял прерывание про совпадению , но прерывание не происходило , проверял в симуляторе аврстудио. счет битов таймера шел, а вот прерывания так ине наступило(( хотя все переписывал как в уроке было показанно
Мучитель микросхем
Аватара пользователя
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

Сообщение unalex »

pashaumnov писал(а):жаль что посложнее ветвления не получаются
это для затравки

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

насчет гото, кину на днях шаблоны, как что делать
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Реклама
Эиком - электронные компоненты и радиодетали
Прорезались зубы
Аватара пользователя
Сообщения: 236
Зарегистрирован: Чт июн 25, 2009 16:00:25
Откуда: нижний новгород

Сообщение pashaumnov »

огромное спасибо , буду ждать с нетерпением))
Реклама
Нашел транзистор. Понюхал.
Сообщения: 166
Зарегистрирован: Вт янв 22, 2013 16:31:22

Сообщение andr_lar »

извиняюсь возможно за неразумный если вопрос .Связываю Atmega 8 с компьютером.С компьютера посылаю число и контроллер в прерывании высвечивает его на индикаторе.Как не странно всё работает.Но когда симулирую эту программу в AvrStudio 4.19 на while (tmp==0); ставлюточку останова,устанавливаю флаг RXC и программа выходит на прерывание по приёму байта,обрабатывает его,но при выходе из прерывания вываливается в таблицу с ассемлерным кодом.Причём судя по ассемблеру возвращяется куда надо,но симулировать конечно уже дальше не получится.Пробовал изменять параметры стека в Code Vision - не получилось. Где я на грабли наступаю ? С уважением...CodeVision 2.03.04 AvrStudio 4.19/4.15
Вложения
5.c
(6.6 КБ) 331 скачивание
С уважением...
Реклама
Родился
Сообщения: 19
Зарегистрирован: Вт апр 06, 2010 09:50:34

Сообщение master_74 »

Народ просветите, кто нацарапал CVAVR посвежее с клизмой.
Сам доси пользую 1.25.9. На мой взгляд само правильно вылеченая.
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1451
Зарегистрирован: Пт фев 19, 2010 19:39:28
Откуда: Москва

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

Я 2.05.0 юзаю
Родился
Сообщения: 19
Зарегистрирован: Вт апр 06, 2010 09:50:34

Сообщение master_74 »

И как не глючит? Лечится генератором ключей или заменой файлов?
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1451
Зарегистрирован: Пт фев 19, 2010 19:39:28
Откуда: Москва

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

Местами они все глючат.. Все лечится.
Коты! Подскажите пожалуйста, собрал устройство, слишком дофига ест (2,40 миллиампер), какой выбрать режим работы, необходимо что бы работали лишь нулевой и второй таймер! Пробовал понижать потребление методом записывания в регист MCUCR |= 0b0010000; не помогает...
Пробовал вызывать с помощью функций библиотеки <sleep.h> powerdown и все остальные режимы. Однако таймера продолжали работать только в режиме adc noise reduction...
А так же подскажите, как его будить(что в принципе не нужно, если таймеры будут работать). Микроконтроллер Atmega8L
Спасибо за помощь!
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 23
Зарегистрирован: Пт фев 11, 2011 13:34:31
Откуда: Москва - Жулебино

Сообщение MVGudkov »

Есть программа на tiny13. Я пытаюсь переделать её под tiny2313. Создал новый проект, выбрал вроде все что нужно, вставил код программы как был в исходнике. Подправил адреса портов, а CVawr выдает 3 ошибки: undefined sumbol `dt`. В оригинале все компилируется без ошибок. Что нужно поправить?
1 dt = GetData(); // считали и отфильтровали ввод со входов
2 if ((dt & 0x40) == 0x00) {
3 if ((dt & 0x30) == 0x20) {

Нашел косяк ))) потерял строку (unsigned char dt = 0;)

Код:
Спойлер/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.3 Standard
Automatic Program Generator
© Copyright 1998-2011 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

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


Chip type : ATtiny2313
AVR Core Clock frequency: 4,000000 MHz
Memory model : Tiny
External RAM size : 0
Data Stack size : 32
*****************************************************/

#include <tiny2313.h>
#include <delay.h>

unsigned char GetData (void)
{
unsigned char i, j;
for(i=0;i<30;i++)
{
delay_us(1000);
j = (PINB & 0xF3); // pb0,1,4 - pb7
delay_us(1000);
if(j != (PINB & 0xF3)) i=0;
}
return j;
}

eeprom int pwm_level;
int pwm_current = 0;
int pwm_step = 1;
unsigned char laststate = 0x00;

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

// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Input/Output Ports initialization
// Port A initialization
// Func2=In Func1=In Func0=In
// State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;

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

// Port D initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// 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: 15,625 kHz
// Mode: Fast PWM top=0xFF
// OC0A output: Non-Inverted PWM
// OC0B output: Disconnected
TCCR0A=0x83;
TCCR0B=0x04;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;

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

// Watchdog Timer initialization
// Watchdog Timer Prescaler: OSC/1024k
// Watchdog Timer interrupt: Off
#pragma optsize-
WDTCR=0x39;
WDTCR=0x29;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

while (1)
{
#asm("wdr") // сброс WDT

dt = GetData(); // считали и отфильтровали ввод со входов

delay_ms(100);

if ((dt & 0x40) == 0x00) {
// режим настройки
if (laststate == 0x00) {
laststate = 0x01;
pwm_level += 16;
if (pwm_level > 239) {
pwm_level = 15;
pwm_current = 0;
}
pwm_step = pwm_level / 10 + 1; // шаг розжига.
}
} else {
laststate = 0x00;
if ((dt & 0x30) == 0x20) {
// разжигаем
if (pwm_current < pwm_level) {
pwm_current += pwm_step;
if (pwm_current > pwm_level) {
pwm_current = pwm_level;
}
}
} else {
// гасим
if (pwm_current > 0) {
pwm_current -= pwm_step;
if (pwm_current < 0) {
pwm_current = 0;
}
}
}
}

if (pwm_current == 0x00) {
OCR0A = 0x00;
TCCR0A = 0x00;
PORTB.3 = 0x00;
} else {
OCR0A = pwm_current;
TCCR0A = 0x83;
PORTB.3 = 0x01;
}

}
}
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1451
Зарегистрирован: Пт фев 19, 2010 19:39:28
Откуда: Москва

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

Создай переменную dt для начала...
Родился
Аватара пользователя
Сообщения: 15
Зарегистрирован: Ср янв 22, 2014 17:44:19
Откуда: Одесса

Сообщение olegleon »

Сериг писал(а):Местами они все глючат.. Все лечится.
Коты! Подскажите пожалуйста, собрал устройство, слишком дофига ест (2,40 миллиампер), какой выбрать режим работы, необходимо что бы работали лишь нулевой и второй таймер! Пробовал понижать потребление методом записывания в регист MCUCR |= 0b0010000; не помогает...
Пробовал вызывать с помощью функций библиотеки <sleep.h> powerdown и все остальные режимы. Однако таймера продолжали работать только в режиме adc noise reduction...
А так же подскажите, как его будить(что в принципе не нужно, если таймеры будут работать). Микроконтроллер Atmega8L
Спасибо за помощь!
Используйте режим Power-save,

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

MCUCR |= (1 << SM0)|(1 << SM1)|(0 << SM2)|(1 << SE);   // Power-save enable
для того чтобы таймер2 работал надо бит AS2 в регистре ASSR установить ( If AS2bit in ASSR is set -из ДШ, стр.35)
- Пахнет котом, - подумал Штирлиц.
- Зачем он нюхает мою лапу? - подумал кот.
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1451
Зарегистрирован: Пт фев 19, 2010 19:39:28
Откуда: Москва

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

Спасибо огромное! Буду пробовать. Но остался вопрос, как будить мк?
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 23
Зарегистрирован: Пт фев 11, 2011 13:34:31
Откуда: Москва - Жулебино

Сообщение MVGudkov »

Подскажите пожалуйста как уменшить время розжига ШИМ в коде. Сейчас розжиг примерно 1-2 сек. В идеале чтоб гас сразу а зажигался примерно 0.5 сек.
Спойлер/*****************************************************
T
Chip type : ATtiny2313
AVR Core Clock frequency: 4,000000 MHz
Memory model : Tiny
External RAM size : 0
Data Stack size : 32
*****************************************************/

#include <tiny2313.h>
#include <delay.h>

unsigned char GetData (void)
{
unsigned char i, j;
for(i=0;i<30;i++)
{
delay_us(1000);
j = (PINB & 0xF3); // pb0,1,4 - pb7
delay_us(1000);
if(j != (PINB & 0xF3)) i=0;
}
return j;
}

eeprom int pwm_level;
int pwm_current = 0;
int pwm_step = 1;
unsigned char laststate = 0x00;

void main(void)
{
unsigned char dt = 0;

// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Input/Output Ports initialization
// Port A initialization
// Func2=In Func1=In Func0=In
// State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;

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

// Port D initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// 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: 15,625 kHz
// Mode: Fast PWM top=0xFF
// OC0A output: Non-Inverted PWM
// OC0B output: Disconnected
TCCR0A=0x83;
TCCR0B=0x04;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;

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

// Analog Comparator initialization
// Analog Comparator: Off
ACSR=0x80;
DIDR=0x00;

// Watchdog Timer initialization
// Watchdog Timer Prescaler: OSC/1024k
// Watchdog Timer interrupt: Off
#pragma optsize-
WDTCR=0x39;
WDTCR=0x29;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

pwm_step = pwm_level / 10 + 1; // шаг розжига.

while (1)
{

#asm("wdr") // сброс WDT

dt = GetData(); // считали и отфильтровали ввод со входов

delay_ms(100);

if ((dt & 0x40) == 0x00) {
// режим настройки
if (laststate == 0x00) {
laststate = 0x01;
pwm_level += 16;
if (pwm_level > 239) {
pwm_level = 15;
pwm_current = 0;
}
pwm_step = pwm_level / 10 + 1; // шаг розжига.
}
} else {
laststate = 0x00;
if ((dt & 0x30) == 0x20) {
// разжигаем
if (pwm_current < pwm_level) {
pwm_current += pwm_step;
if (pwm_current > pwm_level) {
pwm_current = pwm_level;
}
}
} else {
// гасим
if (pwm_current > 0) {
pwm_current -= pwm_step;
if (pwm_current < 0) {
pwm_current = 0;
}
}
}
}

if (pwm_current == 0x00) {
OCR0A = 0x00;
TCCR0A = 0x00;
PORTB.3 = 0x00;
} else {
OCR0A = pwm_current;
TCCR0A = 0x83;
PORTB.3 = 0x01;
}

}
}
Разобрался. Изменил
// гасим
if (pwm_current > 0) {
pwm_current = 0;}
Последний раз редактировалось MVGudkov Пн янв 27, 2014 00:55:07, всего редактировалось 1 раз.
Держит паяльник хвостом
Аватара пользователя
Сообщения: 908
Зарегистрирован: Вс май 23, 2010 13:55:42
Откуда: Украина, Александрия

Сообщение Apparatchik »

Сериг писал(а):Спасибо огромное! Буду пробовать. Но остался вопрос, как будить мк?
В даташите есть табличка Active Clock Domains and Wake-up Sources in the Different Sleep Modes где показано в каком режиме чем можно разбудить.

P.S. Каким боком это относится к CVAVR?
«И всё-таки она вертится!»
Нашел транзистор. Понюхал.
Сообщения: 166
Зарегистрирован: Вт янв 22, 2013 16:31:22

Сообщение andr_lar »

Попробую ещё раз.В CV 2.03.4 написал програмку,которую отлаживаю в AvrStidio 4.19.Отлаживается хорошо,но по выходу из прерывания UART возвращается не в текст на Си а в ассемблерный код.Может что не так поставил в настройках AStudio ?
Самое интересное то что тот-же код,написанный в CV 1.25.9 отлаживается в AStudio 3.56 нормально...Конечно можно сказать что отлаживай на старых программах,но в старых нет поновее микроконтроллеров да и в большинстве на W7 x64 они даже запускаться не желают (кстати можно их запустить ?)

С уважением...
С уважением...
Родился
Аватара пользователя
Сообщения: 15
Зарегистрирован: Ср янв 22, 2014 17:44:19
Откуда: Одесса

Сообщение olegleon »

Сериг писал(а):Спасибо огромное! Буду пробовать. Но остался вопрос, как будить мк?
в секции main поставить #asm("Sei") - разрешение прерываний,
ну а будится он от таймера будет сам, так ка возникнет прерывание по переполнению например.
Усыплять можно по окончанию отработанных действий командой #asm("Sleep")
- Пахнет котом, - подумал Штирлиц.
- Зачем он нюхает мою лапу? - подумал кот.
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1451
Зарегистрирован: Пт фев 19, 2010 19:39:28
Откуда: Москва

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

Сделал так MCUCR |= (1<<SM0) | (1 << SM1) | (0 << SM2) | (1 << SE);
ASSR = (0 << AS2);
Не запускается таймер 2, не могу понять почему...
Родился
Аватара пользователя
Сообщения: 15
Зарегистрирован: Ср янв 22, 2014 17:44:19
Откуда: Одесса

Сообщение olegleon »

Сериг писал(а):Сделал так MCUCR |= (1<<SM0) | (1 << SM1) | (0 << SM2) | (1 << SE);
ASSR = (0 << AS2);
Не запускается таймер 2, не могу понять почему...
в ДШ на стр.34 сказано after wake-up in Power-save mode if AS2 is 0.

т.е. этот бит сбрасывается в 0, думаю его тогда нужно устанавливать в 1-цу. ASSR = (1 << AS2);
- Пахнет котом, - подумал Штирлиц.
- Зачем он нюхает мою лапу? - подумал кот.
Ответить

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