Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: АТмега 128 с внешней памятью и светодиоды на порту F
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
GDI
странную картину наблюдаю сейчас... атмега128 в режиме с внешней памятью PA0-PA7 - адрес/данные , на порте F есть светодиоды PF0-PF2 (3 штуки) при мигании лобым светодиодом почему то дергается аналогичный бит на порте А, т.е. вывожу "1" на PF0 - выводится "1" и на PA0 , "0" - соответственно тоже выводится, что за фигня? никто не сталкивался? Для чистоты эксперимента оторвал ноги от платы - таже фигня. Проверял на нескольких платах - одно и то же - т.е. это не выход из строя одной меги.
otrog
Может быть включен режим совместимости с M103?
GDI
режим совместимости не включен. написал новую программу где просто мигаю светодиодом на порту PF0, если поставить галку в опциях проекта в IARe - использовать внешнюю память, то появляются импульсы на порте PA0
Petka
Цитата(GDI @ Nov 8 2006, 15:26) *
режим совместимости не включен. написал новую программу где просто мигаю светодиодом на порту PF0, если поставить галку в опциях проекта в IARe - использовать внешнюю память, то появляются импульсы на порте PA0

ещё попробуйте отключить jtag

для avreal это ключи "m103c=off,jtagen=off"
klop
Цитата(GDI @ Nov 8 2006, 15:26) *
режим совместимости не включен. написал новую программу где просто мигаю светодиодом на порту PF0, если поставить галку в опциях проекта в IARe - использовать внешнюю память, то появляются импульсы на порте PA0


Вы бы листинг(асм) глянули
GDI
чтобы предотвратить вопросы по фьюзам: стоят биты CKSEL0 = 0, CKSEL1 = 0, CKSEL3 = 0, SUT0 = 0 остальные не установлены

Пробовал разрешить внешнюю шину прямой установкой MCUCR |= 0x80, а не в опциях проекта, ничего не меняется - при разрешении внешней памяти начинает в такт со светодиодом дергаться линия А0

листинг смотрел, запись идет только в прорт F по адресу 0х98
Petka
Цитата(GDI @ Nov 8 2006, 15:44) *
чтобы предотвратить вопросы по фьюзам: стоят биты CKSEL0 = 0, CKSEL1 = 0, CKSEL3 = 0, SUT0 = 0 остальные не установлены

Пробовал разрешить внешнюю шину прямой установкой MCUCR |= 0x80, а не в опциях проекта, ничего не меняется - при разрешении внешней памяти начинает в такт со светодиодом дергаться линия А0


ОПАНЬКИ! как это не установлены?
GDI
= 0 - означает установленный фьюз бит
klop
Цитата(GDI @ Nov 8 2006, 15:44) *
листинг смотрел, запись идет только в прорт F по адресу 0х98

Ну наверное все таки 98(Decimal) = 0x62 -> Действительно PORTF
Но ето не помогает решить проблему
otrog
Что бы исключить догадки, приведите все фьюзы и листинг программы. И какой программой шьете.
GDI
причем проявляется этот эффект только при попытке управления портом F , если дергать ногой на порту E, то никаких эффектов на порте А не наблюдается..
GDI
Похоже этот эффект не влияет на работу шины внешней памяти.. Сейчас сделал бесконечный тест на чтение с проверкой содержимого внешней памяти на фоне мигающего светодиода - 20 минут, полет нормальный сбоев чтения нет.

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

В архиве находится тестовый проект - мигающий светодиод на PF0, при добавлении в файле main.c в функцию init() строки MCUCR |= 0x80; появляются импульсы на PA0
Проект под IAR 4.20a для ATmega128L при питании 3.3В


На ощущениях выглядит так. smile.gif
Поставь подпорку на шину данных (портА) примерно килоом так 4к7. Я думаю всё у нас будет хорошо. smile.gif
VDG
Цитата(GDI @ Nov 8 2006, 15:54) *
странную картину наблюдаю сейчас... атмега128 в режиме с внешней памятью PA0-PA7 - адрес/данные , на порте F есть светодиоды PF0-PF2 (3 штуки) при мигании лобым светодиодом почему то дергается аналогичный бит на порте А, т.е. вывожу "1" на PF0 - выводится "1" и на PA0 , "0" - соответственно тоже выводится, что за фигня? никто не сталкивался? Для чистоты эксперимента оторвал ноги от платы - таже фигня. Проверял на нескольких платах - одно и то же - т.е. это не выход из строя одной меги.

А вы не забыли запитать AVCC и AREF?
GDI
To SasaVitebsk Подпорки ставить не могу - платы уже готовые, может на новых сделаем, правда этих уже партия сделана.

To VDG AVCC запитан, на AREF стоит кондер 0.1 мкФ на землю.

Плату оставлял включенной с тестом чтения внешней памяти на ночь - сбоев не было, так что, считаю, что данный эффект можно считать безобидным.

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

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


Так это просто помеха, может плата криво разведена. или наводка на оцилограф! Шина то в 3ьем состоянии если баскипер выключить
=GM=
Цитата(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;
   }
  }
}
vooon
Цитата
Но эта переменная никогда не будет равна 0, т.к. на входе в подпрограмму устанавливается на 10, на выходе - 9
Код
static byte led_act_delay = LED_ACT_NORMAL_DELAY;


Хм, мне всегда казалось что static инициализируется только один раз wacko.gif
=GM=
Цитата(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, только в пределах файла, где она объявлена, и для удобства пользования должна быть объявлена на внешнем уровне. Объявление переменной может, конечно, включать инициализацию.
vooon
Цитата
Объясните тогда, что делает этот оператор 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 )
=GM=
Цитата(vooon @ Nov 13 2006, 16:48) *
Цитата
Объясните тогда, что делает этот оператор static byte led_act_delay = LED_ACT_NORMAL_DELAY;?

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

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

Cпасибо Kurtу.


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


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

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


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

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


Это Си.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.