Страница 356 из 421
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср мар 09, 2016 19:12:38
ARV
COKPOWEHEU и L.O.D, к вам обращаюсь:
1. мериться крутизной в познании глубин Си вы могли бы и где-нибудь в другой теме, или даже в личке.
2. вы, наверное, не в курсе, но сейчас вы находитесь в теме про CVAVR, которому глубоко покласть на volatile
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср мар 09, 2016 22:21:35
COKPOWEHEU
Да? А как он регулирует доступ к переменным из прерывания? С cvavr дела не имел, было бы интересно узнать. Модификатор volatile это свойство самого языка Си, а не расширение какого-то диалекта как PROGMEM/flash или побитовый доступ к числам.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт мар 10, 2016 05:53:22
WiseLord
Есть мнение (не раз его уже слыхал на этом же форуме), что такое поделие как CVAVR, - это даже не язык C, а какой-то C-подобный диалект (взять тот же доступ к битам портов, не укладывающийся в рамки C). Поэтому лучше и не пытаться описать его поведение в рамках языка C.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт мар 10, 2016 06:04:21
gdoom
gdoom писал(а):Товарищи подскажите, что то не могу понять. Делаю простой счётчик вот к примеру код для mega8^
Код: Выделить всё
#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);
};
}
- как видите на ногах B висит жки - частота 8Мгц работает всё, секунды считает.
Но вот когда пишу для 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 чашек кофе

Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт мар 10, 2016 10:42:27
Rtmip
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...
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт мар 10, 2016 11:10:10
ARV
Rtmip писал(а):Примерно так
судя по тому, что отсутствие volatile никак не меняет работоспособность программы с обработчиками прерываний, CVAVR использует volatile снова по-своему, а не по стандарту.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт мар 10, 2016 22:05:28
DataLife
Ребят, как сделать программный Reset ?
Нужно, чтобы при достижения некого условия устройство прыгало в самое начало программы, как после аппаратного ресета.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пт мар 11, 2016 01:39:56
L.O.D
ARV писал(а):COKPOWEHEU и L.O.D, к вам обращаюсь:
1. ... вы могли бы и где-нибудь в другой теме, или даже в личке.
2. ... вы находитесь в теме про CVAVR
1. Человеку, задавшему вопрос, был дан не вполне точный ответ, корректировать который в личке было бы глупо.

2. Вы и сами отметились в обсуждении этой темы, так что советовать кому-либо не делать этого не можете.

Re: CodeVision AVR в вопросах и ответах
Добавлено: Пт мар 11, 2016 08:33:22
ARV
DataLife писал(а):Ребят, как сделать программный Reset ?
Нужно, чтобы при достижения некого условия устройство прыгало в самое начало программы, как после аппаратного ресета.
просто прыгала или все-таки выполнялся аппаратный сброс?
я бы рекомендовал следующий метод, осуществляющий "настоящий" сброс программным способом: запрещаете все прерывания, настраиваете WDT на самый короткий интервал срабатывания и уходите в бесконечный цикл. после того, как WDT отсчитает заданный интервал, МК пересбросится.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пт мар 11, 2016 13:23:15
DataLife
ARV, большое спасибо
Буду пробовать.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб мар 12, 2016 18:26:47
pashaumnov
друзья , подскажите пожалуйста, кто нибудь подключал к контролеру серво привод??? заказал на эбее себе вот такой sg90 но не совсем понятно как им управлять, шимом или обычными импульсами с нулем и единицей и с временной задержкой
задумка такая , по наступлению какого либо события привод начинает движение от своей начальной точки до конечной и останавливается. затем при наступлении еще раз такого же события привод совершает обратное движение от конечной точки к начальной и останавливается.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб мар 12, 2016 18:34:18
Jack_A
ARV писал(а):[
запрещаете все прерывания, настраиваете WDT на самый короткий интервал срабатывания и уходите в бесконечный цикл. после того, как WDT отсчитает заданный интервал, МК пересбросится.
А я бы поступил проще: выполнить несуществующую команду или обратиться по несуществующему адресу. Сколько раз сам так ресетился, сам того не желая, из-за незамеченного бага в проге.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб мар 12, 2016 18:47:08
ARV
Jack_A писал(а):А я бы поступил проще
видите ли, я дал 100% надежный, гарантированно работающий на любой платформе вариант получить аппаратный сброс без любых побочных эффектов. а что вы советуете что-то хорошее, еще надо доказать.
реакцию МК на несуществующую команду я не знаю, и ни в одном из даташитов не встречал описания поведения при этом. почему-то мне кажется, что несуществующий опкод будет воспринят, как NOP. обращение по несуществующему адресу? тоже сильно сомневаюсь, что данный метод, во-первых, не имеет побочных эффектов, и, во-вторых, вообще сработает, как источник сброса. понятное дело, я не говорю о всяких ARMах, где на такое поведение генерируется exception
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб мар 12, 2016 22:11:41
oleg110592
был еще метод программного сброса AVR, с форума аврфрекс:
Код: Выделить всё
void reboot(void)
{
void (*fn_ptr) (void) = (void (*) (void)) 0;
fn_ptr();
}
давно было - на железе вроде работало (но делал все таки для перестраховки на ватчдоге), в протеусе сейчас пробовал - похоже ресетится
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс мар 13, 2016 08:39:03
Jack_A
Хорошо, снимаю свое предложение как недостаточно аргументированное и основанное на воспоминаниях об выносе мозга непонятными ресетами из-за законспирировавшейся ошибки . В ДШ действительно молчок. В симуляторе попробовал читать из несуществующей памяти - он облизнулся и дальше продолжил. Видимо, это у меня фантомная память еще DECовской архитектуры

Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс мар 13, 2016 08:53:54
COKPOWEHEU
oleg110592 писал(а):
Код: Выделить всё
void reboot(void)
{
void (*fn_ptr) (void) = (void (*) (void)) 0;
fn_ptr();
}
Короче можно записать так ((void(*)(void))0)(); (
отсюда). Но это опять не ресет, а только прыжок в начало - rcall 0. Кстати, это не сработает в области бутлоадера, потому что прыгнет не на его начало, а на начало основной программы.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс мар 13, 2016 09:26:25
ARV
COKPOWEHEU писал(а):Но это опять не ресет, а только прыжок в начало - rcall 0
вот именно! об этом с самого начала я и говорю.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс мар 13, 2016 09:32:53
oleg110592
дык
DataLife писал(а):Нужно, чтобы при достижения некого условия устройство прыгало в самое начало программы, как после аппаратного ресета.
листинг gcc:
Код: Выделить всё
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
}
указатель стека заново проинициализуруется... и т.д.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс мар 13, 2016 10:35:39
ARV
oleg110592 писал(а):указатель стека заново проинициализуруется... и т.д.
господи, ну сколько можно одно и то же пережевывать?
бог знает когда я сказал:
ARV писал(а):просто прыгала или все-таки выполнялся аппаратный сброс?
и с тех пор ничего более нового никто не предложил, все повторяют одно и то же.
прыжок на 0 адрес != аппаратный сброс
неужели это не очевидно?!
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс мар 13, 2016 10:53:34
oleg110592
ARV писал(а):прыжок на 0 адрес != аппаратный сброс неужели это не очевидно?!
для тупых просьба объяснить в чем отличие, посмотрел в иаре для тини13 - не вижу почему прыжок на 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