CodeVision AVR в вопросах и ответах
- java
- Держит паяльник хвостом
- Сообщения: 962
- Зарегистрирован: Вт янв 04, 2011 13:26:17
- Откуда: Лен.Обл.
Re: CodeVision AVR в вопросах и ответах
да у меня уже была идея, было бы хорошо, во первых чтобы там были часы, и можно было задавать время включения и выключения - в жёлтый моргающий, во вторых чтобы можно было при желании набирать время работы для каждого направления, но для этого нужно либо просить, либо брать длительный отпуск, садиться и с нуля учиться писать программы.
Пишу с ошибками и опечатками.На это у меня есть разрешение и справка
- Реклама
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
учили мы такой светофор на лекциях (образование дорожник неоконченное)
там за счет едущих автомобилей отодвигается включение красного сигнала,но не более определенного предела.
там за счет едущих автомобилей отодвигается включение красного сигнала,но не более определенного предела.
В поисках истины человек развивается.
-
demiurg301
- Опытный кот
- Сообщения: 812
- Зарегистрирован: Ср мар 18, 2009 21:14:33
Re: CodeVision AVR в вопросах и ответах
Здорова Коты
ТАкой вопрос по CVAVR 2.05: Как сделать нормальную адресацию для структур?
Т.е. есть Nтое кол-во объектов с Mтым кол-вом свойств.
Делаю так
typedef struct
{
unsigned char address;
unsigned char activ;
unsigned char size;
unsigned char devider;
}data;
struct
{
data t1;
data t2;
}pm;
Вроде компилится, всё нормально. НО! Почему то pm. даёт выпадающий список, а pm.t1. - не даёт.
Т.е. вот что видно по распределению памяти
Как сделать, чтобы и t1 и t2 вели себя как их "родитель"?
Или это так, фантастика?
ТАкой вопрос по CVAVR 2.05: Как сделать нормальную адресацию для структур?
Т.е. есть Nтое кол-во объектов с Mтым кол-вом свойств.
Делаю так
typedef struct
{
unsigned char address;
unsigned char activ;
unsigned char size;
unsigned char devider;
}data;
struct
{
data t1;
data t2;
}pm;
Вроде компилится, всё нормально. НО! Почему то pm. даёт выпадающий список, а pm.t1. - не даёт.
Т.е. вот что видно по распределению памяти
Как сделать, чтобы и t1 и t2 вели себя как их "родитель"?
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
код вижн вообще мало что сам делает.если вручную прописать и не работает,значит нужно через наследование делать и вообще по другому объявлять.
это уже си ++.
тут лучше спросить у совести.(есть такой спец в коте)
это уже си ++.
тут лучше спросить у совести.(есть такой спец в коте)
В поисках истины человек развивается.
Re: CodeVision AVR в вопросах и ответах
Синтаксис верный, с++ тут вообще не при чем. Судя по руководству в CV автозаполнение можно либо включить, либо выключить, ничего более. Так что видимо не судьба.
- Реклама
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
я так и думал,что это кв.только проверить не на чем было.
этот кв. удивительно как в нем для структуры автозаполнение работает.
этот кв. удивительно как в нем для структуры автозаполнение работает.
В поисках истины человек развивается.
-
Demon
- Нашел транзистор. Понюхал.
- Сообщения: 164
- Зарегистрирован: Сб янв 20, 2007 20:44:33
- Откуда: Из закаулков вашей души
Re: CodeVision AVR в вопросах и ответах
Возникла необходимость в приеме данных от 3-х устройств по UART. Недостающие решил реализовать через внешние прерывание и таймер. Но прерывание генерируется 2 раза даже когда нет перепада из 1 в 0.
Инициализация визарда
// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Falling Edge
// INT1: On
// INT1 Mode: Falling Edge
// INT2: Off
GICR|=0xC0;
MCUCR=0x0A;
MCUCSR=0x00;
GIFR=0xC0;
Старт приема
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
// Place your code here
PORTB.0=1;
delay_us(1);
PORTB.0=0;
GICR=GICR&0x0b10111111; //запретили 0 прерывание
TCNT0=T1;
TCCR0=0x02; //ждем прохода стартового бита
Data0=0;
GIFR=GIFR|0x40; //сбрасываем флаг прерывания записью 1
}
Прием данных
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Reinitialize Timer 0 value
TCNT0=T2;
++State0;
if(State0<9){ if(P_INT0) Data0=Data0+0x80; //прием пакета
Data0=Data0>>1; }
if(State0==9){ if(P_INT0) OutM0=Data0; //принято 8 бит и есть стоп-бит
State0=0;
TCCR0=0; //останавливаем таймер 0
GICR=GICR|0x40; //разрешаем прерывание 0
}
}
В чем ошибся или это глюк протеуса?
Инициализация визарда
// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Falling Edge
// INT1: On
// INT1 Mode: Falling Edge
// INT2: Off
GICR|=0xC0;
MCUCR=0x0A;
MCUCSR=0x00;
GIFR=0xC0;
Старт приема
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
// Place your code here
PORTB.0=1;
delay_us(1);
PORTB.0=0;
GICR=GICR&0x0b10111111; //запретили 0 прерывание
TCNT0=T1;
TCCR0=0x02; //ждем прохода стартового бита
Data0=0;
GIFR=GIFR|0x40; //сбрасываем флаг прерывания записью 1
}
Прием данных
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Reinitialize Timer 0 value
TCNT0=T2;
++State0;
if(State0<9){ if(P_INT0) Data0=Data0+0x80; //прием пакета
Data0=Data0>>1; }
if(State0==9){ if(P_INT0) OutM0=Data0; //принято 8 бит и есть стоп-бит
State0=0;
TCCR0=0; //останавливаем таймер 0
GICR=GICR|0x40; //разрешаем прерывание 0
}
}
В чем ошибся или это глюк протеуса?
-
demiurg301
- Опытный кот
- Сообщения: 812
- Зарегистрирован: Ср мар 18, 2009 21:14:33
Re: CodeVision AVR в вопросах и ответах
Совесть писал(а):Синтаксис верный, с++ тут вообще не при чем. Судя по руководству в CV автозаполнение можно либо включить, либо выключить, ничего более. Так что видимо не судьба.
Да, таки не судьба
-
demiurg301
- Опытный кот
- Сообщения: 812
- Зарегистрирован: Ср мар 18, 2009 21:14:33
Re: CodeVision AVR в вопросах и ответах
vitalik_1984 писал(а):я так и думал,что это кв.только проверить не на чем было.
этот кв. удивительно как в нем для структуры автозаполнение работает.
только для глобальных переменных.
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
demiurg301 писал(а):Да, таки не судьбаШшшштож придётся ручками, ручками
Странно почему не сделали для вложеных структур...
переходи на тормознутую, зато с автозаполнением студию шесть.
вечером проверю как она это дело отрабатывает.
demiurg301 писал(а):только для глобальных переменных.
не знал
UPD
Проверил, STUDIO6 нормально реагирует.
Код: Выделить всё
pm.t1.address=50; список на все выпадает...
Так что ленивых просим в студию
В поисках истины человек развивается.
Re: CodeVision AVR в вопросах и ответах
А подскажите ка, как настроить timer1\counter1 на определённое время. Экспериментировал на часах. Пробовал так: частоту поставил 7813, Compare A Match, в значение А записал 1е85(7813). Работает отлично, вызывает прерывание раз в секунду(в Протэусе). Решил попробовать прерывание 4 раза в секунду. Поделил 7813 на 4, перевёл в хекс. И вот тут вот произошло "чудо") Часы пошли так, что разглядеть можно было только "часы". Минуты бежали, что поймать невозможно, а в секундах вообще одни восьмёрки) Или я чё-то не понял, или Протэус прикалывается, или создатели CVAVR'a делили не по-русски) Подскажите 
Очень жаль, когда люди упираются лбом в что-то, хотя это и не логично совсем. А свою логику не объясняют.
- hd44780
- Встал на лапы
- Сообщения: 132
- Зарегистрирован: Вт июл 14, 2009 09:27:37
- Откуда: Донецк, Украина
Re: CodeVision AVR в вопросах и ответах
Если надо 0.5 сек или 1 сек для часов, то лучше взять контроллер со спец таймером и часовым кварцем. Оно для этого и предназначено
.
Обычные таймеры, работающие от основного генератора для этого плохо подходят.
PS.
Замечание в стиле "Омар фигня, лобстер круче"
.
У протеуса есть ряд "противных" особенностей. Лично у меня там даже тупая светодиодная мигалка не работала - мигала не раз в секунду, а гораздо реже ... Хотя в железе всё как часы.
Не исключено, что и у Вас родственный глюк.
Мой совет - выкиньте шпротеус на помойку и делайте всегда в железе.
Насчёт CvAvr - сколько лет пишу, тьфу-тьфу всё там чисто.
Это в WinAVR-е с delay_ms вечные приключения, а здесь чисто.
Обычные таймеры, работающие от основного генератора для этого плохо подходят.
PS.
Замечание в стиле "Омар фигня, лобстер круче"
У протеуса есть ряд "противных" особенностей. Лично у меня там даже тупая светодиодная мигалка не работала - мигала не раз в секунду, а гораздо реже ... Хотя в железе всё как часы.
Не исключено, что и у Вас родственный глюк.
Мой совет - выкиньте шпротеус на помойку и делайте всегда в железе.
Насчёт CvAvr - сколько лет пишу, тьфу-тьфу всё там чисто.
Это в WinAVR-е с delay_ms вечные приключения, а здесь чисто.
Re: CodeVision AVR в вопросах и ответах
within писал(а):А подскажите ка, как настроить timer1\counter1 на определённое время.
проще простого....., вот сдесь можна быстро расчитать....., сам пользуюсь и вам советую
http://eugenemcu.ru/index/0-32
Tell Me The Truth
- zero648
- Вымогатель припоя
- Сообщения: 650
- Зарегистрирован: Пн июн 18, 2012 12:01:04
- Откуда: Челябинская область, Копейск
Re: CodeVision AVR в вопросах и ответах
hd44780 писал(а):У протеуса есть ряд "противных" особенностей. Лично у меня там даже тупая светодиодная мигалка не работала - мигала не раз в секунду, а гораздо реже ... Хотя в железе всё как часы.
Не исключено, что и у Вас родственный глюк.
Мой совет - выкиньте шпротеус на помойку и делайте всегда в железе.
Комп менять не пробовали, протеус тормозит, потому что комп тормозной, кстати в протеусе есть внизу строка состояния, в которой видно загрузку процессора и часы во время симуляции, чё трудно сопоставить время. Если хотите, чтобы протеус работал быстрее, тогда убирайте обвязки из схемы в симуляторе, конечно же не в железе.
Re: CodeVision AVR в вопросах и ответах
hd44780 писал(а):Мой совет - выкиньте шпротеус на помойку и делайте всегда в железе.
Родственная душа
Щас придут Прот-офилы и нам наваляют
Re: CodeVision AVR в вопросах и ответах
Протэус хорош для изучения простых основ, типа включения транзистора, небольших простеньких схемок. А вот с более "умными" схемами трудновать( Ну, да ладно, это всё не в тему)
Очень жаль, когда люди упираются лбом в что-то, хотя это и не логично совсем. А свою логику не объясняют.
Re: CodeVision AVR в вопросах и ответах
Help!!! AVRstudio выдает следующее:
AVRASM: AVR macro assembler version 1.77.3 (Dec 20 2006 14:29:41)
Copyright (C) 1995-2005 ATMEL Corporation
Assembling 'C:\Program Files\Atmel\AVR Tools\MY_PROJECTS\Button_Tranz_Cooler\Button_Tranz_Cooler.asm'
Including 'C:\Program Files\Atmel\AVR Tools\AvrAssembler\Appnotes\m8def.inc'
C:\Program Files\Atmel\AVR Tools\AvrAssembler\Appnotes\m8def.inc(39) : warning : Only one .device directive allowed (line ignored)
C:\Program Files\Atmel\AVR Tools\MY_PROJECTS\Button_Tranz_Cooler\Button_Tranz_Cooler.asm(39) : error : Undefined variable referenced
Assembly complete with 1 error
Программа:
AVRASM: AVR macro assembler version 1.77.3 (Dec 20 2006 14:29:41)
Copyright (C) 1995-2005 ATMEL Corporation
Assembling 'C:\Program Files\Atmel\AVR Tools\MY_PROJECTS\Button_Tranz_Cooler\Button_Tranz_Cooler.asm'
Including 'C:\Program Files\Atmel\AVR Tools\AvrAssembler\Appnotes\m8def.inc'
C:\Program Files\Atmel\AVR Tools\AvrAssembler\Appnotes\m8def.inc(39) : warning : Only one .device directive allowed (line ignored)
C:\Program Files\Atmel\AVR Tools\MY_PROJECTS\Button_Tranz_Cooler\Button_Tranz_Cooler.asm(39) : error : Undefined variable referenced
Assembly complete with 1 error
Программа:
- Вложения
-
- Button_TRanz_Cooler.JPG
- (73.31 КБ) 413 скачиваний
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Тут вообще то не по ассемблеру справка, А по CVAVR.
Сходу непонятно, но похоже что не нужно было вам включать
так как вы уже написали
Второе по ходу программы просто игнорируется.Так прям и написано.
Далее
Тут пишет:ссылка на неопределенную переменную.
Причем как то странно у вас на картинке в заголовке программы написано, что файл называется flash_led.asm, А в пути файла почему то Button_Tranz_Cooler.asm
Это типа ctrl+C,ctrl+V что ли?
Судя по программе она не видит метку turn_off
Видимо поменяв метку в переходе
забыли поменять само название метки LEDoff на turn_off
PS. Неплохо было бы вместо того, чтобы фоткать экран скопировать текст и отправить, может какие то добрые, но ленивые люди взяли бы да скомпилировали вам прогу.
Ленивые это потому что лень забивать в редактор программу, которая уже кем то набрана,тем более не для себя.
Странная вообще прога, если она рассчитана на включение какого либо вентилятора - жмем кнопку - вентилятор работает.
Не проще было сделать на одном транзисторе?Или уж тогда вместо кнопки использовать датчик температуры - ведь в МК встроен вольтметр(АЦП) и с его помощью можно регулировать скорость работы данного вентилятора или, хотя бы определять периодичность включения.
Сходу непонятно, но похоже что не нужно было вам включать
Код: Выделить всё
.include C:\Program Files\Atmel\AVR Tools\AvrAssembler\Appnotes\m8def.incтак как вы уже написали
Код: Выделить всё
.device atmega8Второе по ходу программы просто игнорируется.Так прям и написано.
Далее
Код: Выделить всё
C:\Program Files\Atmel\AVR Tools\MY_PROJECTS\Button_Tranz_Cooler\Button_Tranz_Cooler.asm(39): error : Undefined variable referencedПричем как то странно у вас на картинке в заголовке программы написано, что файл называется flash_led.asm, А в пути файла почему то Button_Tranz_Cooler.asm
Это типа ctrl+C,ctrl+V что ли?Судя по программе она не видит метку turn_off
Видимо поменяв метку в переходе
Код: Выделить всё
rjmp turn_off забыли поменять само название метки LEDoff на turn_off
PS. Неплохо было бы вместо того, чтобы фоткать экран скопировать текст и отправить, может какие то добрые, но ленивые люди взяли бы да скомпилировали вам прогу.
Ленивые это потому что лень забивать в редактор программу, которая уже кем то набрана,тем более не для себя.
Странная вообще прога, если она рассчитана на включение какого либо вентилятора - жмем кнопку - вентилятор работает.
Не проще было сделать на одном транзисторе?Или уж тогда вместо кнопки использовать датчик температуры - ведь в МК встроен вольтметр(АЦП) и с его помощью можно регулировать скорость работы данного вентилятора или, хотя бы определять периодичность включения.
В поисках истины человек развивается.
Re: CodeVision AVR в вопросах и ответах
1. Нужно удалить путь "C:\Program Files\Atmel\AVR Tools\AvrAssembler\Appnotes\m8def.inc" ?
2. По поводу заголовка, просто забыл исправить его.
3. Про метку я забыл совершенно.
4.Вчера пытался вставить но выдавало какую-то абра-кодабру, хотя сегодня вствляется нормально.
;************************************
; Author: Buffalo *
; Date: 4/7/2012 *
; Version: 1.0 *
; Name file: flash_led.asm *
; For AVR: ATMega8 *
; Clock frequence: 4 Mc *
;************************************
; Task: Включение вентилятора
.device atmega8
.nolist
.include "C:\Program Files\Atmel\AVR Tools\AvrAssembler\Appnotes\m8def.inc"
.list
;===============
; Advertise:
.def temp = r16
;===============
; Beginning program
rjmp Init ; Первая выполняемая программа
;===============
Init:
ldi temp, 0b11111110;
out DDRB, temp;
ldi temp, 0b00000001;
out PortB, temp;
;===============
;Основное тело программы
Start:
sbic PinB,0 ; Проверяем, нажата ли кнопка
rjmp turn_off ; Переходми к метке turn_off
sbi PortB,1 ; Подаем 5 вольт через резистор на базу транзистора
rjmp Start ; Возвращаемся к метке Start
LEDoff:
cbi PortB,1 ; Не подаем напряжение на транзистор
rjmp Start ; Возвращаемся к метке Start
5. Насчет включения, вы абсолютно правы, жмём кнопку- дальше МК делает своё дело-подает 5 вольт на базу транзистора- включение вентилятора.
А насчет АЦП- это уже следующий шаг.
2. По поводу заголовка, просто забыл исправить его.
3. Про метку я забыл совершенно.
4.Вчера пытался вставить но выдавало какую-то абра-кодабру, хотя сегодня вствляется нормально.
;************************************
; Author: Buffalo *
; Date: 4/7/2012 *
; Version: 1.0 *
; Name file: flash_led.asm *
; For AVR: ATMega8 *
; Clock frequence: 4 Mc *
;************************************
; Task: Включение вентилятора
.device atmega8
.nolist
.include "C:\Program Files\Atmel\AVR Tools\AvrAssembler\Appnotes\m8def.inc"
.list
;===============
; Advertise:
.def temp = r16
;===============
; Beginning program
rjmp Init ; Первая выполняемая программа
;===============
Init:
ldi temp, 0b11111110;
out DDRB, temp;
ldi temp, 0b00000001;
out PortB, temp;
;===============
;Основное тело программы
Start:
sbic PinB,0 ; Проверяем, нажата ли кнопка
rjmp turn_off ; Переходми к метке turn_off
sbi PortB,1 ; Подаем 5 вольт через резистор на базу транзистора
rjmp Start ; Возвращаемся к метке Start
LEDoff:
cbi PortB,1 ; Не подаем напряжение на транзистор
rjmp Start ; Возвращаемся к метке Start
5. Насчет включения, вы абсолютно правы, жмём кнопку- дальше МК делает своё дело-подает 5 вольт на базу транзистора- включение вентилятора.
А насчет АЦП- это уже следующий шаг.
- zero648
- Вымогатель припоя
- Сообщения: 650
- Зарегистрирован: Пн июн 18, 2012 12:01:04
- Откуда: Челябинская область, Копейск
Re: CodeVision AVR в вопросах и ответах
Не обязательно указывать полный путь для библиотеки, он по умолчанию. Также тип устройства, он уже прописан в библиотеке препроцессора.
Код: Выделить всё
;************************************
; Author: Buffalo *
; Date: 4/7/2012 *
; Version: 1.0 *
; Name file: flash_led.asm *
; For AVR: ATMega8 *
; Clock frequence: 4 Mc *
;************************************
; Task: Включение вентилятора
;.device atmega8
.nolist
.include "m8def.inc"
.list
;===============
; Advertise:
.def temp = r16
;===============
; Beginning program
rjmp Init ; Первая выполняемая программа
;===============
Init:
ldi temp, 0b11111110;
out DDRB, temp;
ldi temp, 0b00000001;
out PortB, temp;
;===============
;Основное тело программы
Start:
sbic PinB,0 ; Проверяем, нажата ли кнопка
rjmp turn_off ; Переходми к метке turn_off
sbi PortB,1 ; Подаем 5 вольт через резистор на базу транзистора
rjmp Start ; Возвращаемся к метке Start
turn_off:
cbi PortB,1 ; Не подаем напряжение на транзистор
rjmp Start ; Возвращаемся к метке Start


