CodeVision AVR в вопросах и ответах
вы прочитали предыдущий пост там где я про goto спрашиваю.все таки его не заменить кроме таймера, и про delay_us(переменная ) я писал . компилятор ошибку пишет если туда вписываешь переменую а не число, это происходит только с us с delay_ms такого не наблюдаетя
- Реклама
видимо не прочитал
начсет goto - заменить можно, просто я непрявильно понял логику работы(словесное описание понимается хуже блок схемы, поэтому рекомендуется составить ее)
вот полезная программка, сложные ветвления она конечно не осилит, но поможет

c delay_us()действительно есть такая фишка, совсем об этом забыл - надо ей передавать число, поэтому делаем под разные звуки разные функции с жестко прописанными задержками
..........
нашел еще одну простенькую программку, поинтереснее
http://watts.cs.sonoma.edu/SFC/
начсет 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% коктейля "Рекурсивный"...
спасибо за програмку))) скачал такую же как у вас. да жаль что посложнее ветвления не получаются. и поэтому я даже в ней не могу блок схему составить для опроса ручника в нужном мне режиме. проще на листочке набросать, я кстати так и делал , только не знаю чем можно заменить goto? или точнее как ее перестроить чтобы не использовать goto все было бы проще если бы я мог использовать таймер.((( я писал прогу для работы с таймером выставлял прерывание про совпадению , но прерывание не происходило , проверял в симуляторе аврстудио. счет битов таймера шел, а вот прерывания так ине наступило(( хотя все переписывал как в уроке было показанно
это для затравкиpashaumnov писал(а):жаль что посложнее ветвления не получаются
кстати поковырял намедни вторую прогу по ссылке, там уже возможности побогаче
насчет гото, кину на днях шаблоны, как что делать
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
- Реклама
- Сообщения: 166
- Зарегистрирован: Вт янв 22, 2013 16:31:22
извиняюсь возможно за неразумный если вопрос .Связываю 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
Народ просветите, кто нацарапал CVAVR посвежее с клизмой.
Сам доси пользую 1.25.9. На мой взгляд само правильно вылеченая.
Сам доси пользую 1.25.9. На мой взгляд само правильно вылеченая.
- Сообщения: 19
- Зарегистрирован: Вт апр 06, 2010 09:50:34
И как не глючит? Лечится генератором ключей или заменой файлов?
Местами они все глючат.. Все лечится.
Коты! Подскажите пожалуйста, собрал устройство, слишком дофига ест (2,40 миллиампер), какой выбрать режим работы, необходимо что бы работали лишь нулевой и второй таймер! Пробовал понижать потребление методом записывания в регист MCUCR |= 0b0010000; не помогает...
Пробовал вызывать с помощью функций библиотеки <sleep.h> powerdown и все остальные режимы. Однако таймера продолжали работать только в режиме adc noise reduction...
А так же подскажите, как его будить(что в принципе не нужно, если таймеры будут работать). Микроконтроллер Atmega8L
Спасибо за помощь!
Коты! Подскажите пожалуйста, собрал устройство, слишком дофига ест (2,40 миллиампер), какой выбрать режим работы, необходимо что бы работали лишь нулевой и второй таймер! Пробовал понижать потребление методом записывания в регист MCUCR |= 0b0010000; не помогает...
Пробовал вызывать с помощью функций библиотеки <sleep.h> powerdown и все остальные режимы. Однако таймера продолжали работать только в режиме adc noise reduction...
А так же подскажите, как его будить(что в принципе не нужно, если таймеры будут работать). Микроконтроллер Atmega8L
Спасибо за помощь!
Есть программа на 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;
}
}
}
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;
}
}
}
Используйте режим Power-save,Сериг писал(а):Местами они все глючат.. Все лечится.
Коты! Подскажите пожалуйста, собрал устройство, слишком дофига ест (2,40 миллиампер), какой выбрать режим работы, необходимо что бы работали лишь нулевой и второй таймер! Пробовал понижать потребление методом записывания в регист MCUCR |= 0b0010000; не помогает...
Пробовал вызывать с помощью функций библиотеки <sleep.h> powerdown и все остальные режимы. Однако таймера продолжали работать только в режиме adc noise reduction...
А так же подскажите, как его будить(что в принципе не нужно, если таймеры будут работать). Микроконтроллер Atmega8L
Спасибо за помощь!
Код: Выделить всё
MCUCR |= (1 << SM0)|(1 << SM1)|(0 << SM2)|(1 << SE); // Power-save enable- Пахнет котом, - подумал Штирлиц.
- Зачем он нюхает мою лапу? - подумал кот.
- Зачем он нюхает мою лапу? - подумал кот.
Спасибо огромное! Буду пробовать. Но остался вопрос, как будить мк?
Подскажите пожалуйста как уменшить время розжига ШИМ в коде. Сейчас розжиг примерно 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;}
Спойлер
/*****************************************************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 раз.
В даташите есть табличка Active Clock Domains and Wake-up Sources in the Different Sleep Modes где показано в каком режиме чем можно разбудить.Сериг писал(а):Спасибо огромное! Буду пробовать. Но остался вопрос, как будить мк?
P.S. Каким боком это относится к CVAVR?
«И всё-таки она вертится!»
- Сообщения: 166
- Зарегистрирован: Вт янв 22, 2013 16:31:22
Попробую ещё раз.В CV 2.03.4 написал програмку,которую отлаживаю в AvrStidio 4.19.Отлаживается хорошо,но по выходу из прерывания UART возвращается не в текст на Си а в ассемблерный код.Может что не так поставил в настройках AStudio ?
Самое интересное то что тот-же код,написанный в CV 1.25.9 отлаживается в AStudio 3.56 нормально...Конечно можно сказать что отлаживай на старых программах,но в старых нет поновее микроконтроллеров да и в большинстве на W7 x64 они даже запускаться не желают (кстати можно их запустить ?)
С уважением...
Самое интересное то что тот-же код,написанный в CV 1.25.9 отлаживается в AStudio 3.56 нормально...Конечно можно сказать что отлаживай на старых программах,но в старых нет поновее микроконтроллеров да и в большинстве на W7 x64 они даже запускаться не желают (кстати можно их запустить ?)
С уважением...
С уважением...
в секции main поставить #asm("Sei") - разрешение прерываний,Сериг писал(а):Спасибо огромное! Буду пробовать. Но остался вопрос, как будить мк?
ну а будится он от таймера будет сам, так ка возникнет прерывание по переполнению например.
Усыплять можно по окончанию отработанных действий командой #asm("Sleep")
- Пахнет котом, - подумал Штирлиц.
- Зачем он нюхает мою лапу? - подумал кот.
- Зачем он нюхает мою лапу? - подумал кот.
Сделал так MCUCR |= (1<<SM0) | (1 << SM1) | (0 << SM2) | (1 << SE);
ASSR = (0 << AS2);
Не запускается таймер 2, не могу понять почему...
ASSR = (0 << AS2);
Не запускается таймер 2, не могу понять почему...
в ДШ на стр.34 сказано after wake-up in Power-save mode if AS2 is 0.Сериг писал(а):Сделал так MCUCR |= (1<<SM0) | (1 << SM1) | (0 << SM2) | (1 << SE);
ASSR = (0 << AS2);
Не запускается таймер 2, не могу понять почему...
т.е. этот бит сбрасывается в 0, думаю его тогда нужно устанавливать в 1-цу. ASSR = (1 << AS2);
- Пахнет котом, - подумал Штирлиц.
- Зачем он нюхает мою лапу? - подумал кот.
- Зачем он нюхает мою лапу? - подумал кот.


