Страница 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 чашек кофе :shock:

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. Человеку, задавшему вопрос, был дан не вполне точный ответ, корректировать который в личке было бы глупо. :dont_know:
2. Вы и сами отметились в обсуждении этой темы, так что советовать кому-либо не делать этого не можете. :dont_know:

Re: CodeVision AVR в вопросах и ответах

Добавлено: Пт мар 11, 2016 08:33:22
ARV
DataLife писал(а):Ребят, как сделать программный Reset ?
Нужно, чтобы при достижения некого условия устройство прыгало в самое начало программы, как после аппаратного ресета.
просто прыгала или все-таки выполнялся аппаратный сброс?
я бы рекомендовал следующий метод, осуществляющий "настоящий" сброс программным способом: запрещаете все прерывания, настраиваете WDT на самый короткий интервал срабатывания и уходите в бесконечный цикл. после того, как WDT отсчитает заданный интервал, МК пересбросится.

Re: CodeVision AVR в вопросах и ответах

Добавлено: Пт мар 11, 2016 13:23:15
DataLife
ARV, большое спасибо :beer:
Буду пробовать.

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