CodeVision AVR в вопросах и ответах
да у меня уже была идея, было бы хорошо, во первых чтобы там были часы, и можно было задавать время включения и выключения - в жёлтый моргающий, во вторых чтобы можно было при желании набирать время работы для каждого направления, но для этого нужно либо просить, либо брать длительный отпуск, садиться и с нуля учиться писать программы.
Пишу с ошибками и опечатками.На это у меня есть разрешение и справка
- Реклама
учили мы такой светофор на лекциях (образование дорожник неоконченное)
там за счет едущих автомобилей отодвигается включение красного сигнала,но не более определенного предела.
там за счет едущих автомобилей отодвигается включение красного сигнала,но не более определенного предела.
В поисках истины человек развивается.
- Сообщения: 812
- Зарегистрирован: Ср мар 18, 2009 21:14:33
Здорова Коты
ТАкой вопрос по 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 вели себя как их "родитель"?
код вижн вообще мало что сам делает.если вручную прописать и не работает,значит нужно через наследование делать и вообще по другому объявлять.
это уже си ++.
тут лучше спросить у совести.(есть такой спец в коте)
это уже си ++.
тут лучше спросить у совести.(есть такой спец в коте)
В поисках истины человек развивается.
- Сообщения: 106
- Зарегистрирован: Пн мар 26, 2012 05:25:06
Синтаксис верный, с++ тут вообще не при чем. Судя по руководству в CV автозаполнение можно либо включить, либо выключить, ничего более. Так что видимо не судьба.
- Реклама
я так и думал,что это кв.только проверить не на чем было.
этот кв. удивительно как в нем для структуры автозаполнение работает.
этот кв. удивительно как в нем для структуры автозаполнение работает.
В поисках истины человек развивается.
Возникла необходимость в приеме данных от 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
}
}
В чем ошибся или это глюк протеуса?
- Сообщения: 812
- Зарегистрирован: Ср мар 18, 2009 21:14:33
Да, таки не судьбаСовесть писал(а):Синтаксис верный, с++ тут вообще не при чем. Судя по руководству в CV автозаполнение можно либо включить, либо выключить, ничего более. Так что видимо не судьба.
- Сообщения: 812
- Зарегистрирован: Ср мар 18, 2009 21:14:33
только для глобальных переменных.vitalik_1984 писал(а):я так и думал,что это кв.только проверить не на чем было.
этот кв. удивительно как в нем для структуры автозаполнение работает.
переходи на тормознутую, зато с автозаполнением студию шесть.demiurg301 писал(а): Да, таки не судьбаШшшштож придётся ручками, ручками
Странно почему не сделали для вложеных структур...
вечером проверю как она это дело отрабатывает.
не зналdemiurg301 писал(а): только для глобальных переменных.
UPD
Проверил, STUDIO6 нормально реагирует.
Код: Выделить всё
pm.t1.address=50; Так что ленивых просим в студию
В поисках истины человек развивается.
А подскажите ка, как настроить timer1\counter1 на определённое время. Экспериментировал на часах. Пробовал так: частоту поставил 7813, Compare A Match, в значение А записал 1е85(7813). Работает отлично, вызывает прерывание раз в секунду(в Протэусе). Решил попробовать прерывание 4 раза в секунду. Поделил 7813 на 4, перевёл в хекс. И вот тут вот произошло "чудо") Часы пошли так, что разглядеть можно было только "часы". Минуты бежали, что поймать невозможно, а в секундах вообще одни восьмёрки) Или я чё-то не понял, или Протэус прикалывается, или создатели CVAVR'a делили не по-русски) Подскажите 
Очень жаль, когда люди упираются лбом в что-то, хотя это и не логично совсем. А свою логику не объясняют.
Если надо 0.5 сек или 1 сек для часов, то лучше взять контроллер со спец таймером и часовым кварцем. Оно для этого и предназначено
.
Обычные таймеры, работающие от основного генератора для этого плохо подходят.
PS.
Замечание в стиле "Омар фигня, лобстер круче"
.
У протеуса есть ряд "противных" особенностей. Лично у меня там даже тупая светодиодная мигалка не работала - мигала не раз в секунду, а гораздо реже ... Хотя в железе всё как часы.
Не исключено, что и у Вас родственный глюк.
Мой совет - выкиньте шпротеус на помойку и делайте всегда в железе.
Насчёт CvAvr - сколько лет пишу, тьфу-тьфу всё там чисто.
Это в WinAVR-е с delay_ms вечные приключения, а здесь чисто.
Обычные таймеры, работающие от основного генератора для этого плохо подходят.
PS.
Замечание в стиле "Омар фигня, лобстер круче"
У протеуса есть ряд "противных" особенностей. Лично у меня там даже тупая светодиодная мигалка не работала - мигала не раз в секунду, а гораздо реже ... Хотя в железе всё как часы.
Не исключено, что и у Вас родственный глюк.
Мой совет - выкиньте шпротеус на помойку и делайте всегда в железе.
Насчёт CvAvr - сколько лет пишу, тьфу-тьфу всё там чисто.
Это в WinAVR-е с delay_ms вечные приключения, а здесь чисто.
проще простого....., вот сдесь можна быстро расчитать....., сам пользуюсь и вам советуюwithin писал(а):А подскажите ка, как настроить timer1\counter1 на определённое время.
http://eugenemcu.ru/index/0-32
Tell Me The Truth
Комп менять не пробовали, протеус тормозит, потому что комп тормозной, кстати в протеусе есть внизу строка состояния, в которой видно загрузку процессора и часы во время симуляции, чё трудно сопоставить время. Если хотите, чтобы протеус работал быстрее, тогда убирайте обвязки из схемы в симуляторе, конечно же не в железе.hd44780 писал(а):У протеуса есть ряд "противных" особенностей. Лично у меня там даже тупая светодиодная мигалка не работала - мигала не раз в секунду, а гораздо реже ... Хотя в железе всё как часы.
Не исключено, что и у Вас родственный глюк.
Мой совет - выкиньте шпротеус на помойку и делайте всегда в железе.
Родственная душаhd44780 писал(а): Мой совет - выкиньте шпротеус на помойку и делайте всегда в железе.
Щас придут Прот-офилы и нам наваляют
Протэус хорош для изучения простых основ, типа включения транзистора, небольших простеньких схемок. А вот с более "умными" схемами трудновать( Ну, да ладно, это всё не в тему)
Очень жаль, когда люди упираются лбом в что-то, хотя это и не логично совсем. А свою логику не объясняют.
- Сообщения: 68
- Зарегистрирован: Вс ноя 13, 2011 15:09:58
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 КБ) 415 скачиваний
Тут вообще то не по ассемблеру справка, А по 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
Судя по программе она не видит метку turn_off
Видимо поменяв метку в переходе
Код: Выделить всё
rjmp turn_off PS. Неплохо было бы вместо того, чтобы фоткать экран скопировать текст и отправить, может какие то добрые, но ленивые люди взяли бы да скомпилировали вам прогу.
Ленивые это потому что лень забивать в редактор программу, которая уже кем то набрана,тем более не для себя.
Странная вообще прога, если она рассчитана на включение какого либо вентилятора - жмем кнопку - вентилятор работает.
Не проще было сделать на одном транзисторе?Или уж тогда вместо кнопки использовать датчик температуры - ведь в МК встроен вольтметр(АЦП) и с его помощью можно регулировать скорость работы данного вентилятора или, хотя бы определять периодичность включения.
В поисках истины человек развивается.
- Сообщения: 68
- Зарегистрирован: Вс ноя 13, 2011 15:09:58
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 вольт на базу транзистора- включение вентилятора.
А насчет АЦП- это уже следующий шаг.
Не обязательно указывать полный путь для библиотеки, он по умолчанию. Также тип устройства, он уже прописан в библиотеке препроцессора.
Код: Выделить всё
;************************************
; 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


