реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> АТмега 128 с внешней памятью и светодиоды на порту F, странное поведение
GDI
сообщение Nov 9 2006, 08:17
Сообщение #16


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



Наконец то найдена ошибка (или не ошибка)... если включить бас кипер XMCRB = 0x80; то все эффекты пропадают, но даже и с выключенным бас кипером во время операций чтения-записи линия A0 перестает дергаться на время собственно записи-чтения - по-этому и не было ошибок чтения. Cпасибо Kurtу.


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
ARIM
сообщение Nov 9 2006, 08:58
Сообщение #17


Частый гость
**

Группа: Свой
Сообщений: 94
Регистрация: 14-04-05
Из: Россия
Пользователь №: 4 130



Цитата(GDI @ Nov 9 2006, 11:17) *
Cпасибо Kurtу.

а почему не SasaVitebsk'у?
Go to the top of the page
 
+Quote Post
KRS
сообщение Nov 9 2006, 09:59
Сообщение #18


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(GDI @ Nov 9 2006, 11:17) *
Наконец то найдена ошибка (или не ошибка)... если включить бас кипер XMCRB = 0x80; то все эффекты пропадают, но даже и с выключенным бас кипером во время операций чтения-записи линия A0 перестает дергаться на время собственно записи-чтения - по-этому и не было ошибок чтения. Cпасибо Kurtу.


Так это просто помеха, может плата криво разведена. или наводка на оцилограф! Шина то в 3ьем состоянии если баскипер выключить
Go to the top of the page
 
+Quote Post
=GM=
сообщение Nov 10 2006, 10:18
Сообщение #19


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(GDI @ Nov 8 2006, 15:56) *
Похоже этот эффект не влияет на работу шины внешней памяти.. Сейчас сделал бесконечный тест на чтение с проверкой содержимого внешней памяти на фоне мигающего светодиода - 20 минут, полет нормальный сбоев чтения нет.
В архиве находится тестовый проект - мигающий светодиод на PF0, при добавлении в файле main.c в функцию init() строки MCUCR |= 0x80; появляются импульсы на PA0
Проект под IAR 4.20a для ATmega128L при питании 3.3В

Удосужился взглянуть на вашу тестовую пограмму, не могу понять, как она работает.

В программе обработки прерывания от таймера вызывается программа led_act_fsm. В первой строке этой подпрограммы инициализируется переменная led_act_delay=10. Затем в следующей строке из этой переменной вычитается единица. Затем проверяется, не равна ли нулю эта переменная. Если она равна нулю, то инвертируется ножка, управляющая светодиодом. Но эта переменная никогда не будет равна 0, т.к. на входе в подпрограмму устанавливается на 10, на выходе - 9. Смотрите фрагмент ниже.

Код
#define LED_ACT_NORMAL_DELAY    10
#pragma vector = TIMER1_OVF_vect
__interrupt void timer_isr(void)
{
  TCNT1 = TIMER_VALUE;
  led_act_fsm();
}

void led_act_fsm(void)
{
  static byte led_act_delay = LED_ACT_NORMAL_DELAY;
  led_act_delay--;
  if(!led_act_delay)
  {
   leds_act_tgl();
   switch(led_act_state)
   {
    case ACT_LED_NORMAL:
     led_act_delay = LED_ACT_NORMAL_DELAY;
     break;
    case ACT_LED_QF_ERROR:
     led_act_delay = LED_ACT_QF_ALARM_DELAY;
     break;
   }
  }
}


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
vooon
сообщение Nov 10 2006, 22:15
Сообщение #20


Участник
*

Группа: Свой
Сообщений: 72
Регистрация: 27-06-06
Из: Msk
Пользователь №: 18 401



Цитата
Но эта переменная никогда не будет равна 0, т.к. на входе в подпрограмму устанавливается на 10, на выходе - 9
Код
static byte led_act_delay = LED_ACT_NORMAL_DELAY;


Хм, мне всегда казалось что static инициализируется только один раз wacko.gif
Go to the top of the page
 
+Quote Post
=GM=
сообщение Nov 13 2006, 15:14
Сообщение #21


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(vooon @ Nov 10 2006, 22:15) *
Цитата
Но эта переменная никогда не будет равна 0, т.к. на входе в подпрограмму устанавливается на 10, на выходе - 9
Код
static byte led_act_delay = LED_ACT_NORMAL_DELAY;


Хм, мне всегда казалось что static инициализируется только один раз wacko.gif


Объясните тогда, что делает этот оператор static byte led_act_delay = LED_ACT_NORMAL_DELAY;?
Делается ли присвоение каждый раз при входе в подпрограмму или нет?

Вообще непонятно, зачем объявлять static в подпрограмме, переменная static является такой же глобальной переменной, как и extern, только в пределах файла, где она объявлена, и для удобства пользования должна быть объявлена на внешнем уровне. Объявление переменной может, конечно, включать инициализацию.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
vooon
сообщение Nov 13 2006, 16:48
Сообщение #22


Участник
*

Группа: Свой
Сообщений: 72
Регистрация: 27-06-06
Из: Msk
Пользователь №: 18 401



Цитата
Объясните тогда, что делает этот оператор static byte led_act_delay = LED_ACT_NORMAL_DELAY;?


Попробую smile.gif

в программе определена символическая константа:
#define LED_ACT_NORMAL_DELAY 10

препроцессор везде где встретит LED_ACT_NORMAL_DELAY заменит на 10
т.е. мы получим код:
static byte led_act_delay = 10;

Переменные типа static инициализируются только один раз (только при первом вызове функции)
т.е. мы определяем led_act_delay имеющую тип byte (typedef unsigned char byte;) которой присваивается 10.

Цитата
Вообще непонятно, зачем объявлять static в подпрограмме, переменная static является такой же глобальной переменной, как и extern, только в пределах файла, где она объявлена, и для удобства пользования должна быть объявлена на внешнем уровне. Объявление переменной может, конечно, включать инициализацию.


С этим не соглашусь, static является локальной => виден только
в этой функции, а не в пределах файла.

Два простых примера:
Код
/* Демонстрация автоматических и статических локальных переменных */
#include <stdio.h>

void func1 (void)
{
    static int x = 20;
    int y = 20;

    printf ( "x = %i, y = %i\r\n", x--, y-- );
}

void main (void)
{
    int count;

    for ( count = 0; count < 20; count++ )
    {
        printf ( "Iteration %i: ", count );
        func1 ();
    }
}

Код
/* Демонстрация автоматических и статических локальных переменных
** попробуем узнать x из основной программы
*/
#include <stdio.h>

void func1 (void)
{
    static int x = 20;
    int y = 20;

    printf ( "x = %i, y = %i\t", x--, y-- );
}

void main (void)
{
    int count;

    for ( count = 0; count < 20; count++ )
    {
        printf ( "Iteration %i: ", count );
        func1 ();
        printf ( "x = %i\r\n", x );
    }
}


PS: пытался обьяснить точно (чтобы небыло недоразумений smile.gif )
Go to the top of the page
 
+Quote Post
=GM=
сообщение Nov 13 2006, 17:36
Сообщение #23


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(vooon @ Nov 13 2006, 16:48) *
Цитата
Объясните тогда, что делает этот оператор static byte led_act_delay = LED_ACT_NORMAL_DELAY;?

Попробую smile.gif
PS: пытался обьяснить точно (чтобы небыло недоразумений smile.gif )

Как я понял, объявляя статическую переменную внутри функции, мы как бы сохраняем ее текущее значение вне этой функции, но использовать ее вне функции не можем. Тогда понятно, как вышеупомянутый фрагмент работает, но так неудобно для понимания...Присваивание делается один раз, скорее всего, при инициализации, а видится как будто, переменная присваивается каждый раз при вызове функции. Я ж и говорю, птичий язык(:-).


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
GDI
сообщение Nov 14 2006, 08:29
Сообщение #24


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



Цитата
(GDI @ Nov 9 2006, 11:17)

Cпасибо Kurtу.


а почему не SasaVitebsk'у?


Потому что Kurt на #ru_embedded подсказал мне про бас-кипер.

Цитата
Так это просто помеха, может плата криво разведена. или наводка на оцилограф! Шина то в 3ьем состоянии если баскипер выключить


Плата разведена нормально - минимальное расстояние между этими проводниками ~1см (как между ножками PA0 и PF0), да и наводкой это не назовешь - красивый сигнал размахом 3.3 вольта.

Цитата
Я ж и говорю, птичий язык(:-).


Это Си.


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 08:25
Рейтинг@Mail.ru


Страница сгенерированна за 0.01493 секунд с 7
ELECTRONIX ©2004-2016