Траблы с Atmega'ой

Тема в разделе "WASM.ELECTRONICS", создана пользователем riban, 4 окт 2005.

  1. riban

    riban New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2005
    Сообщения:
    51
    Адрес:
    Russia
    Есть нехитрая тестовая плата с атмегой, у кот. используются только два порта на вывод. Сама атмега ATMega 128 16AI-L. Пишу программу, кот. выводит бегущую единицу на порты. Работает. То же, но на атмеге 64 16AI - не пашет. Залипают состояния на выводах. Подключил к ней внешн. источник опорного напряжения и получилась следующая вещь

    1я программа:
    Код (Text):
    1.  
    2.    ldi tmp_r,0xff
    3.  
    4. start:
    5.    com tmp_r
    6.    out PORTB,tmp_r
    7.    rjmp start
    8.  


    --

    работает, чередует единицы и нули на выводах



    2я программа:
    Код (Text):
    1.  
    2.    ldi tmp_r,0xff
    3.  
    4. start:
    5.    com tmp_r
    6.    out PORTB,tmp_r
    7.    rcall aaa
    8.    rjmp start
    9.  
    10. aaa:
    11.    ret
    12.  


    --

    Не работает. Из-за пустой процедуры (стек и остальные необходимые элементы я, ессно конфигурировал). На выводах залипает 1. И всё. Почему - загадка. Может быть, конечно, что это из-за того, что оставшиеся ноги висят в воздухе, НО! во-первых, на первом мк работает всё даже без ВИОН, а во-вторых, насколько я помню на каждом выводе есть подтягивающий резистор и по-умолчанию они включены.



    Кто сталкивался с проблемой или какие мысли есть подскажите!
     
  2. Dimson

    Dimson New Member

    Публикаций:
    0
    Регистрация:
    7 июл 2005
    Сообщения:
    59
    Адрес:
    Russia
    А ты абсолютно уверен, что правильно стек конфигурируешь во втором МК? Тут вся разница как-раз в его использовании.

    Кстати, если имеется микросхема-драйвер RS-232, то можно попробовать через неё поотлаживать, т.к. возможности отладки через JTAG я так понимаю нет. Посмотри, куда указатель стека реально указывает.

    Кстати, у тебя RAM внешняя? tmp_r, я так понимаю, один из регистров r(или всё-таки область памяти). Возможно ошибка при обращении к внешней памяти.
     
  3. compnet

    compnet New Member

    Публикаций:
    0
    Регистрация:
    19 сен 2004
    Сообщения:
    10
    Адрес:
    Russia
    А как насчет работы в симуляторе avrstudio или vmlab?

    Там тоже самое? Выложи полный текст второго примера, вместе с процедурами инициализации...
     
  4. VaStaNi

    VaStaNi Member

    Публикаций:
    0
    Регистрация:
    1 июн 2004
    Сообщения:
    203
    Адрес:
    Ukraine
    Привет!

    Если конечно нет возможности в симуляторе покопаться, хотя это ОЧЕНЬ НЕВЕРНО, т.к. такие проблемы будут и их надо уметь решать... + освоить "инструмент" для этого на будущее + себя уважать будешь...

    Так вот, если уж смекалку проявлять, то в подобных случаях, ну например, все нужное (симулятор, среда, полезняшки) где то там.., а тебе типа "в полевых, окопных" условиях деять нядо, то я бы смекал так:

    1. разчленить на еще более пошаговые действия даже такую программу(!), с тем, чтобы даже тестером можно было "вынюхать" причину и "точку клина".

    2. впреть использовать второй, третий... порт как ОТЛАДОЧНО-ДИСПЛЕЙНЫЙ, выдавая в него нечто уникальное на каждом шаге, вплоть до особо интересующих регистров. В данном случае, скажем выдавать регистр стека на другой порт ДО и ВНУТРИ и ПОСЛЕ rcall(!)...

    3. Самое продвинутое после победы над посл.портом. Настроить и использовать последовательный порт, соединив его нуль-модемным соединением с машиной на COM порт + программа-терминалка(НЕХ режим в ней должOн быть!), как простейшее и первейшее средство работы с контроллером в диалоге+"его отчетность". Делее можно "учить" свою прогу реагировать на твои коды клавиш от машины и делать то, что нужно или ветвить(!) алгоритм на неких узловых моментах твоей проги... Словом полезно во многих аспектах, т.к. это и освоение и продвижение и эффективность и пробирование сил, железа, методов, процедур...

    В данном случае, простейшая, но уже эффективная мутация твого кода в данном направлении следующая:



    start:

    com tmp_r

    out PORTB,tmp_r

    rcall aaa

    com tmp_r

    out PORTB,tmp_r

    ;; rjmp start

    stop:

    rjmp stop



    aaa:

    com tmp_r

    out PORTB,tmp_r

    ret



    Что в итоге имеем? Имеем на твоем порту бит на 3ей позиции и пустой цикл в конце(но ты будешь это знать и уверен). Это будет свидетельствовать, о том, что со стеком все в норме. Очень похоже, что он у тебя не работает правильно, ребята правы.

    Еще посмотри, проверь тип RET(!)соответствует ли rcall т.е. короткий, длинный... вызов должен соответствовать АНАЛОГИЧНОМУ RET! Иначе стек невыровнен и по RET`у можно "улететь" в дремучие степи...

    Да, если ты всеже "улетаешь по выходу", но заходишь в

    aaa:

    com tmp_r

    out PORTB,tmp_r

    ret

    то понятно, что будешь иметь бит только на 2 позиции и "висяк" т.д. АГА!???

    Успехов в смекалке и анализе!
     
  5. riban

    riban New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2005
    Сообщения:
    51
    Адрес:
    Russia
    Dimson

    конфигурирую так:

    ldi tmp_r,LOW(RAMEND);Установка стека

    out SPL,tmp1_r

    ldi tmp_r,HIGH(RAMEND)

    out SPH,tmp_r



    tmp_r = r16



    compnet

    В симуляторе всё ессно работает.



    VaStaNi

    Я уже и так расчленил проблему и дочленил её до вышеописанных примеров. И если ты внимательно читал, то у меня залипают состояния на ногах, поэтому я ничего мониторить, к сож., не могу



    --

    Продолжаю грешить на ВИОН

    сконфигурирован только бит ACBG. Больше ничего не трогал. Включение Brown-out и выключение PUD ничего не дают
     
  6. riban

    riban New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2005
    Сообщения:
    51
    Адрес:
    Russia
    Кстати если добавить push/pop конструкцию в первый пример - всё работает.
     
  7. Dimson

    Dimson New Member

    Публикаций:
    0
    Регистрация:
    7 июл 2005
    Сообщения:
    59
    Адрес:
    Russia
    А если всё-таки попробовать через RS-232 отладить? Или выводы в альтернативном режиме тоже не работают? Необходимо узнать следующее: выполняется-ли программа во втором случае или где-то зависает? Если выполняется, то трабл точно аппаратный, а если нет, то ты скорее всего где-то что-то недоконфигурировал и из-за этого всё очень нестабильно может работать. В любом случае интересно знать куда "улетает" программа после rcall aaa.

    Возможно в reset всё уходит. Кстати, выполнение кода в симуляторе далеко ещё не значит, что он будет также в реальном МК работать. В симуляторе стек можно хоть на регистровую область сконфигурить и всё будет очень даже замечательно выполняться :)(по крайней мере в AVR Studio 3.5 так было)
     
  8. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    А как сконфигурированы регистры PORTB/DDRB ?
     
  9. riban

    riban New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2005
    Сообщения:
    51
    Адрес:
    Russia
    gilg

    Конечно на вывод



    Dimson

    Буду пробовать.



    Сразу вопрос на будущее, если это аппаратый глюк, то может быть стоит обезопасить себя подключением земли через резисторы на свободные выводы? Включить brown-out? Поднять напряжение на ВИОН почти равным напряжению питания???
     
  10. Dimson

    Dimson New Member

    Публикаций:
    0
    Регистрация:
    7 июл 2005
    Сообщения:
    59
    Адрес:
    Russia
    Кстати, не может такого быть, что какое-нибудь прерывание разрешено?



    И ещё: ты говорил, что push/pop работает, а вот значение, которое ты берёшь из стека после push-а точно соответсвует тому, что ты туда заталкиваешь?

    На мой взгляд тут дело в работе с внешней памятью всё-таки (если она есть). Или ты только внутреннюю RAM юзаешь? Скорее всего идет прыжок куда-нибудь не туда, а после этого reset, инициализация и т.д.
     
  11. riban

    riban New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2005
    Сообщения:
    51
    Адрес:
    Russia
    Dimson

    Память только внутренняя. Вообще кроме атмеги почти ничего нет:) Да и не включено ничего.



    Вот полный текст 1й версии
    Код (Text):
    1.  
    2. .include "m64def.inc"
    3.     .def    tmp1_r       =r16
    4.  
    5.     .org    0
    6.         rjmp init
    7.  
    8.     init:
    9.         cli
    10.         ldi tmp1_r,LOW(RAMEND)
    11.         out SPL,tmp1_r
    12.         ldi tmp1_r,HIGH(RAMEND)
    13.         out SPH,tmp1_r
    14.  
    15.         ldi tmp1_r,(1<<ACME)
    16.         out SFIOR,tmp1_r
    17.         ldi tmp1_r,(1<<ACBG)
    18.         out ACSR,tmp1_r
    19.  
    20.         ldi tmp1_r,0xff
    21.         out DDRA,tmp1_r
    22.  
    23.    loop:
    24.         com tmp1_r
    25.         out PORTA,tmp1_r
    26.         rjmp loop
    27.  
    28.  




    А значение выковыренное из стека чё-то не догадался посмотреть. Вечером гляну.
     
  12. Dimson

    Dimson New Member

    Публикаций:
    0
    Регистрация:
    7 июл 2005
    Сообщения:
    59
    Адрес:
    Russia
    Можно попробовать провести чистый эксперимент и выкинуть всё "ненужное":

    1) Инициализацию компаратора (а вдруг поможет :)).

    2) Всякие там макросы типа LOW(RAMEND) и HIGH(RAMEND) можно попробовать заменить на обычные числа (просто какой-нибудь адрес памяти вбить и проверить).
     
  13. riban

    riban New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2005
    Сообщения:
    51
    Адрес:
    Russia
    Dimson

    Компаратор используется в роли внешнего источника опорного напряжения. Без него на новых микрухах даже первый пример не катит. RAMEND проверял в map-файле - всё корректно.

    Это уже "чистый" эксперимент:dntknw:
     
  14. Dimson

    Dimson New Member

    Публикаций:
    0
    Регистрация:
    7 июл 2005
    Сообщения:
    59
    Адрес:
    Russia
    А тактируется там всё нормально? Reset нормально формируется при запуске? Всё как в мануалах написано ? Очень странно, что без ВИОНА не работает.
     
  15. riban

    riban New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2005
    Сообщения:
    51
    Адрес:
    Russia
    Глюк был связан с тем, что был записан бит совместимости с Atmega103. Снял и всё стало работать.

    Всем спасибо.
     
  16. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    riban

    :) А вот у меня как-то на 162-й какой-то умник установил фуз JTAG, а он рубит старшие линии адреса... два месяца долбались :)))) да, СЕЙЧАС это уже смешно...