Траблы с Atmega'ой

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

  1. riban

    riban New Member

    Публикаций:
    0
    Есть нехитрая тестовая плата с атмегой, у кот. используются только два порта на вывод. Сама атмега 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
    А ты абсолютно уверен, что правильно стек конфигурируешь во втором МК? Тут вся разница как-раз в его использовании.

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

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

    compnet New Member

    Публикаций:
    0
    А как насчет работы в симуляторе avrstudio или vmlab?

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

    VaStaNi Member

    Публикаций:
    0
    Привет!

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

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

    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
    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
    Кстати если добавить push/pop конструкцию в первый пример - всё работает.
     
  7. Dimson

    Dimson New Member

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

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

    gilg New Member

    Публикаций:
    0
    А как сконфигурированы регистры PORTB/DDRB ?
     
  9. riban

    riban New Member

    Публикаций:
    0
    gilg

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



    Dimson

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



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

    Dimson New Member

    Публикаций:
    0
    Кстати, не может такого быть, что какое-нибудь прерывание разрешено?



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

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

    riban New Member

    Публикаций:
    0
    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
    Можно попробовать провести чистый эксперимент и выкинуть всё "ненужное":

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

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

    riban New Member

    Публикаций:
    0
    Dimson

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

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

    Dimson New Member

    Публикаций:
    0
    А тактируется там всё нормально? Reset нормально формируется при запуске? Всё как в мануалах написано ? Очень странно, что без ВИОНА не работает.
     
  15. riban

    riban New Member

    Публикаций:
    0
    Глюк был связан с тем, что был записан бит совместимости с Atmega103. Снял и всё стало работать.

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

    Ustus New Member

    Публикаций:
    0
    riban

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