CodeVision AVR в вопросах и ответах
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
COKPOWEHEU и L.O.D, к вам обращаюсь:
1. мериться крутизной в познании глубин Си вы могли бы и где-нибудь в другой теме, или даже в личке.
2. вы, наверное, не в курсе, но сейчас вы находитесь в теме про CVAVR, которому глубоко покласть на volatile
1. мериться крутизной в познании глубин Си вы могли бы и где-нибудь в другой теме, или даже в личке.
2. вы, наверное, не в курсе, но сейчас вы находитесь в теме про CVAVR, которому глубоко покласть на volatile
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Реклама
- COKPOWEHEU
- Говорящий с текстолитом
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Re: CodeVision AVR в вопросах и ответах
Да? А как он регулирует доступ к переменным из прерывания? С cvavr дела не имел, было бы интересно узнать. Модификатор volatile это свойство самого языка Си, а не расширение какого-то диалекта как PROGMEM/flash или побитовый доступ к числам.
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Есть мнение (не раз его уже слыхал на этом же форуме), что такое поделие как CVAVR, - это даже не язык C, а какой-то C-подобный диалект (взять тот же доступ к битам портов, не укладывающийся в рамки C). Поэтому лучше и не пытаться описать его поведение в рамках языка C.
Re: CodeVision AVR в вопросах и ответах
gdoom писал(а):Товарищи подскажите, что то не могу понять. Делаю простой счётчик вот к примеру код для mega8^- как видите на ногах B висит жки - частота 8Мгц работает всё, секунды считает.Код: Выделить всё
#include <mega8.h> #asm .equ __lcd_port=0x18 ;PORTB #endasm #include <lcd.h> int s = 0; // Timer 1 output compare A interrupt service routine interrupt [TIM1_COMPA] void timer1_compa_isr(void) { s++; if(s>59) { s=0; } TCNT1H=0; TCNT1L=0; } void main(void) { TCCR1A=0x00; TCCR1B=0x05; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x1E; OCR1AL=0x85; TIMSK=0x10; lcd_init(8); #asm("sei") while (1) { lcd_gotoxy(0,0); lcd_putchar(s/10+0x30); lcd_putchar(s%10+0x30); }; }
Но вот когда пишу для tiny2313 молчит, вот код:- где ошибка подскажите пожалуйста?Код: Выделить всё
#include <lcd.h> #include <tiny2313.h> #asm .equ __lcd_port=0x18 ;PORTB #endasm int s = 0; // Timer 1 output compare A interrupt service routine interrupt [TIM1_COMPA] void timer1_compa_isr(void) { s++; if(s>59) { s=0; } TCNT1H=0; TCNT1L=0; } void main(void) { TCCR1A=0x00; TCCR1B=0x05; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x1E; OCR1AL=0x85; TIMSK=0x10; lcd_init(8); #asm("sei") while (1) { lcd_gotoxy(0,0); lcd_putchar(s/10+0x30); lcd_putchar(s%10+0x30); } }
- товарищи вопрос снят! - даташит всему голова, у ещё плюс 5 чашек кофе
-
Rtmip
- Держит паяльник хвостом
- Сообщения: 963
- Зарегистрирован: Чт апр 03, 2014 23:16:55
- Откуда: Россия
Re: CodeVision AVR в вопросах и ответах
Примерно так:COKPOWEHEU писал(а):Да? А как он регулирует доступ к переменным из прерывания?
...To instruct the compiler to allocate a variable to registers, the register modifier must be used.
Example:
register int abc;
The compiler may automatically allocate a variable to registers, even if this modifier is not used.
The volatile modifier must be used to warn the compiler that it may be subject to outside change
during evaluation.
Example:
volatile int abc;
Variables declared as volatile will not be allocated to registers...
- Реклама
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
судя по тому, что отсутствие volatile никак не меняет работоспособность программы с обработчиками прерываний, CVAVR использует volatile снова по-своему, а не по стандарту.Rtmip писал(а):Примерно так
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: CodeVision AVR в вопросах и ответах
Ребят, как сделать программный Reset ?
Нужно, чтобы при достижения некого условия устройство прыгало в самое начало программы, как после аппаратного ресета.
Нужно, чтобы при достижения некого условия устройство прыгало в самое начало программы, как после аппаратного ресета.
Только те, кто предпринимают абсурдные попытки, смогут достичь невозможного.
Re: CodeVision AVR в вопросах и ответах
1. Человеку, задавшему вопрос, был дан не вполне точный ответ, корректировать который в личке было бы глупо.ARV писал(а):COKPOWEHEU и L.O.D, к вам обращаюсь:
1. ... вы могли бы и где-нибудь в другой теме, или даже в личке.
2. ... вы находитесь в теме про CVAVR
2. Вы и сами отметились в обсуждении этой темы, так что советовать кому-либо не делать этого не можете.
- Из овощей я больше всего люблю пельмени... © Соседский Мальчик
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
просто прыгала или все-таки выполнялся аппаратный сброс?DataLife писал(а):Ребят, как сделать программный Reset ?
Нужно, чтобы при достижения некого условия устройство прыгало в самое начало программы, как после аппаратного ресета.
я бы рекомендовал следующий метод, осуществляющий "настоящий" сброс программным способом: запрещаете все прерывания, настраиваете WDT на самый короткий интервал срабатывания и уходите в бесконечный цикл. после того, как WDT отсчитает заданный интервал, МК пересбросится.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: CodeVision AVR в вопросах и ответах
ARV, большое спасибо
Буду пробовать.
Буду пробовать.
Только те, кто предпринимают абсурдные попытки, смогут достичь невозможного.
- pashaumnov
- Прорезались зубы
- Сообщения: 236
- Зарегистрирован: Чт июн 25, 2009 16:00:25
- Откуда: нижний новгород
Re: CodeVision AVR в вопросах и ответах
друзья , подскажите пожалуйста, кто нибудь подключал к контролеру серво привод??? заказал на эбее себе вот такой sg90 но не совсем понятно как им управлять, шимом или обычными импульсами с нулем и единицей и с временной задержкой
задумка такая , по наступлению какого либо события привод начинает движение от своей начальной точки до конечной и останавливается. затем при наступлении еще раз такого же события привод совершает обратное движение от конечной точки к начальной и останавливается.
задумка такая , по наступлению какого либо события привод начинает движение от своей начальной точки до конечной и останавливается. затем при наступлении еще раз такого же события привод совершает обратное движение от конечной точки к начальной и останавливается.
- Вложения
-
- mikro-servoprivod-sg90_s4.jpg
- (33.08 КБ) 471 скачивание
Re: CodeVision AVR в вопросах и ответах
А я бы поступил проще: выполнить несуществующую команду или обратиться по несуществующему адресу. Сколько раз сам так ресетился, сам того не желая, из-за незамеченного бага в проге.ARV писал(а):[
запрещаете все прерывания, настраиваете WDT на самый короткий интервал срабатывания и уходите в бесконечный цикл. после того, как WDT отсчитает заданный интервал, МК пересбросится.
Последний раз редактировалось Jack_A Вс мар 13, 2016 08:36:40, всего редактировалось 1 раз.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
видите ли, я дал 100% надежный, гарантированно работающий на любой платформе вариант получить аппаратный сброс без любых побочных эффектов. а что вы советуете что-то хорошее, еще надо доказать.Jack_A писал(а):А я бы поступил проще
реакцию МК на несуществующую команду я не знаю, и ни в одном из даташитов не встречал описания поведения при этом. почему-то мне кажется, что несуществующий опкод будет воспринят, как NOP. обращение по несуществующему адресу? тоже сильно сомневаюсь, что данный метод, во-первых, не имеет побочных эффектов, и, во-вторых, вообще сработает, как источник сброса. понятное дело, я не говорю о всяких ARMах, где на такое поведение генерируется exception
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: CodeVision AVR в вопросах и ответах
был еще метод программного сброса AVR, с форума аврфрекс:
давно было - на железе вроде работало (но делал все таки для перестраховки на ватчдоге), в протеусе сейчас пробовал - похоже ресетится
Код: Выделить всё
void reboot(void)
{
void (*fn_ptr) (void) = (void (*) (void)) 0;
fn_ptr();
}Re: CodeVision AVR в вопросах и ответах
Хорошо, снимаю свое предложение как недостаточно аргументированное и основанное на воспоминаниях об выносе мозга непонятными ресетами из-за законспирировавшейся ошибки . В ДШ действительно молчок. В симуляторе попробовал читать из несуществующей памяти - он облизнулся и дальше продолжил. Видимо, это у меня фантомная память еще DECовской архитектуры 
- COKPOWEHEU
- Говорящий с текстолитом
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Re: CodeVision AVR в вопросах и ответах
Короче можно записать так ((void(*)(void))0)(); (отсюда). Но это опять не ресет, а только прыжок в начало - rcall 0. Кстати, это не сработает в области бутлоадера, потому что прыгнет не на его начало, а на начало основной программы.oleg110592 писал(а):Код: Выделить всё
void reboot(void) { void (*fn_ptr) (void) = (void (*) (void)) 0; fn_ptr(); }
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
вот именно! об этом с самого начала я и говорю.COKPOWEHEU писал(а):Но это опять не ресет, а только прыжок в начало - rcall 0
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: CodeVision AVR в вопросах и ответах
дык
указатель стека заново проинициализуруется... и т.д.
листинг gcc:DataLife писал(а):Нужно, чтобы при достижения некого условия устройство прыгало в самое начало программы, как после аппаратного ресета.
Код: Выделить всё
void reboot(void)
{
void (*fn_ptr) (void) = (void (*) (void)) 0;
fn_ptr();
90: e0 e0 ldi r30, 0x00 ; 0
92: f0 e0 ldi r31, 0x00 ; 0
94: 09 95 icall
}- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
господи, ну сколько можно одно и то же пережевывать?oleg110592 писал(а):указатель стека заново проинициализуруется... и т.д.
бог знает когда я сказал:
и с тех пор ничего более нового никто не предложил, все повторяют одно и то же.ARV писал(а):просто прыгала или все-таки выполнялся аппаратный сброс?
прыжок на 0 адрес != аппаратный сброс
неужели это не очевидно?!если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: CodeVision AVR в вопросах и ответах
для тупых просьба объяснить в чем отличие, посмотрел в иаре для тини13 - не вижу почему прыжок на 0 адрес не равносилен сбросу:ARV писал(а):прыжок на 0 адрес != аппаратный сброс неужели это не очевидно?!
Код: Выделить всё
void reboot(void)
{
void (*fn_ptr) (void) = (void (*) (void)) 0;
fn_ptr();
}
void main( void )
{
while(1)
{
if((PINB & (1<<0)) == 0) reboot();
}
}Код: Выделить всё
000000 C012 RJMP 0x026
000002 9518 RETI
000004 9518 RETI
000006 9518 RETI
000008 9518 RETI
00000A 9518 RETI
00000C 9518 RETI
00000E 9518 RETI
000010 9518 RETI
000012 9518 RETI
000014 99B0 SBIC 0x16,0
000016 CFFE RJMP 0x014
000018 E0E0 LDI R30,0x00
00001A E0F0 LDI R31,0x00
00001C 9509 ICALL
00001E CFFA RJMP 0x014
000020 0000 NOP
000022 9588 SLEEP
000024 CFFE RJMP 0x022
000026 E90F LDI R16,0x9F
000028 BF0D OUT SP,R16
00002A E8C0 LDI R28,0x80
00002C D003 RCALL 0x034
00002E DFF2 RCALL 0x014
000030 DFF7 RCALL 0x020
000032 CFF6 RJMP 0x020
000034 E001 LDI R16,0x01
000036 9508 RET 


