![]() |
Модераторы: PILOT, ManiaK, Mazzi |
![]() ![]() ![]() |
|
fol |
|
|||
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 22.10.2006 Репутация: нет Всего: нет |
Все пропало, все пропало!!! Гипс снимают, клиент уезжает…
Всем привет. На медне начал заниматься AVR-ками. До этого программил ПИКИ, но все время глядел на AVR, и вот наконец взялся и как обычно, за малое время (всего несколько дней юзаний) накопилось много вопросов. Вначале мое общее впечатление, а затем несколько вопросов, и может кто и поможет начинающему AVR-щику. Вначале как положено новичку сделал дополнительный модуль к своему программатору PonyProg. Зарядил в софт *.HEX файл простенькой программы-мигалки и атаковал кристалл под названием Atmega16. Все прошло гладко. Причем с первой же попытки. Мега замигала, задрыгала ногами. И с радость во внутри себя начал я извращатся с теми штуковинами которые все обзывают фьюзами. И тут была (как многие в рунете и говорят) засада. Все фьюзы довольно дружелюбны, а вот "CKSEL" подгадить так и норовит. При установке фьюза "CKSEL": CKSEL 0001 (внутренний RC генератор) После записи проги в память контроллера программатор выдает сообщение "Write successful" (Успешная запись) то есть все нормально. CKSEL 1010 (внешний резонатор) После записи проги в память контроллера программатор выдает сообщение "Write successful" (Успешная запись) то есть все нормально. CKSEL 1111 (внешний резонатор) После записи проги в память контроллера программатор выдает сообщение "Write Failed" (Неудачная Запись) то есть НЕ ВСЕ нормально. При этом светодиод LED1 на плате адаптера остается светящимся (это у меня индикация того что транзистор который землит ногу RST проца, остался открытым). Не смотря на это, когда проц ставлю на макет, программа работает нормально. Вот и пойми в чем дело. Странности. Может при установке CKSEL = 1111 не очень хороший режим для этого кварца (что стоит на плате адаптера) и частота не устойчива... Не знаю. Кстати после этих процедур выяснил вот что. Если по каким либо причинам кварц или внешний генератор на плате программатора не работают, то не дай вам бог установить фьюз "CKSEL" в режим внешнего генератора. После загрузки программы вы не достучитесь до камня. Это я говорю для таких же новичков как сам. Но есть способ. После того как сам попал. Нужно вначале прикоснуться пальцем к ногам XTAL и держать все время пока в проц грузится программа. Я думаю это наводка в теле выдает клоки в ядро проца, и программа хоть и медленнее но загрузится. Позанимавшись с железом перешел к работе с программой. Работаю в AVR-Studio 3.56. Дело в том что два раза пробовал юзать новую AVR-Studio 4.12 но все время она во время компиляции завешивает систему. Да и вообще как то медленно и не устойчиво работает. Или это моя личная проблема.? Ладно я не гордый, пока и с версией 3.56 нормально. Но и она не идеал. Продолжаю исследовать мегу16. Тренируюсь на маленьких программках. И начались проблемы. С самого начала, как положено начал строить структуру проекта. Вначале установка режимов эмулятора. Дабы AVR-Studio эмулировала тот камень который я поставил. Заглянул в окно настройки эмулятора. И что я увидел? Студия почему то считает что мега16 содержит 8192 кБа памяти? Ладно нет проблем, в НАСТРОЙКАХ СИМУЛЯТОРА я изменил вместо 8 поставил 16 (в даташите заявлено 16). После этого симулятор принял изменения и стал показывать что теперь мол кристалл имеет 16192 кБа памяти. Причем после этого никакие изменения в окне НАСТРОЙКА СИМУЛЯТОРА (в части изменения параметров памяти) не принимаются. То есть AVR студия "вцепился" в значение 16192 кБа и как крабик, и не выпускает. Причем для обоих вариантов установленной глубины памяти, компиляция и прогон по симулятору простых тестовых программ проходит без замечаний, софт считает что все OK, и не видит разницы. Я изъелозил весь ДатаШит на мегу16, и не пойму, где лукавство, где WDT зарыта. В даташите говорится (ВАЖНО ЗАЯВЛЕНО) что мол имеется аж целых 16 кило памяти. Затем мелко (как в договорах на кредит) мол память эта сконфигурирована как 8 кило 16 битных регистров. И что? Это ведь по сути 8 кБа памяти. Ячеек то не 16 а 8 килограмм !!! Где я не понимаю? И какое значение объявлять симулятору AVR студии ??? Вот такие пироги. Это общее, и не полное первое впечатление. Хотя здесь я конечно только жалуюсь. Есть и приятные впечатления. Такие как удобная работа с портами, да и много чего. Как то в следующий раз. Теперь несколько вопросов. Если кто поможет, буду признателен. Кроме того не я один, много народу путешествует в сети, и многим эта инфа может помочь. Может даже, страшно сказать, жизнь чью спасет. О как. 1. Фьюз "CKSEL" при установке 1111 для меги16 – почему софт программатора ругается, но программа тем не менее работает? 2. У меня ли одного не устойчиво работает AVR-Studio версии 4.12 ? 3. Сколько у меги16 памяти 8 или 16 кБа? 4. Почему нельзя наблюдать в AVR-Studio изменения регистров таймера/счетчика 0, 1. ???? Или можно ? Я по всякому пробовал. Не получается. Только в окне I/O изменения фиксируются при переполнении счетчика, то есть при переходе в 0 (при переполнении). А промежуточные значения где смотреть ??? Или запрещено, не законно? 5. В AVR-Studio (при ее запуске), начиная работать с проектом, в окне просмотра РОН, некоторые регистры имеют какое либо (не нулевое) значение. Точно так же открывая окно EEPROM, там тоже какой то хаос, многие регистры имеют не нулевое значение. Это что, глюк AVR-Studio, или я чего то не знаю? 6. Наверно самый глупый вопрос. Что все таки такое «определение начала стека» в программе для AVR. Зачем? Коротко (примерно) или ссылку? 7. Сколько конкретно вложений на возврат может содержать стек меги16 при вызове ПП по CALL. И где в AVR-Studio можно контролировать адреса возврата? От всех начинающих заранее благодарю. Вот. |
|||
|
||||
PILOT |
|
|||
![]() производство ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2724 Регистрация: 4.4.2002 Где: москва Репутация: 20 Всего: 54 |
1) Смотри внимательно даташит, там есть таблица, где указано какую комбинацию фьюзов CLKSEL в какой ситуации нужно применять. Если хочется экспериментировать, то нужно сначала обзавестись генератором, чтобы в случае чего запустить микроконтроллер. Но цель эксперимента мне не совсем понятна. Никакой выгодя я тут не вижу.
2) а что значит неустойчиво? Вообще любой софт рано или поздно обнаруживает в себе ошибки. 3) 16килобайт = 8 килослов. Организована память программ словами, т.к. каждая команда двухбайтовая, и это тоже описано в даташите. 4) TCNT0, TCNT1L, TCNT1H. При правильной установке режима работы они изменяются согласно настройке. 5) Вот поэтому существует методика инициализации перед началом работы основной программы. в частности это обнуление СРАМ и РОН (руками, специальной команды нет). 6) Стек нужен для временного сохранения точки в памяти программ (значение ПрограмКаунтера) где ты вызываешь подпрограмму или случается прерывание с тем, чтобы потом, после окончания завершения выполнения прерывания либо подпрограммы, вернуться обратно, а также для временного хранения данных другого процесса, чтобы не испортить значения которые до вызова хранились в регистрах общего назначения. 7) Столько сколько разрешишь устанавливая вершину стека, но не более СРАМ/10 (ориентировочно). SP тебе поможет. СУВ. -------------------- тут могла быть Ваша реклама... |
|||
|
||||
fol |
|
|||
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 22.10.2006 Репутация: нет Всего: нет |
Спасибо большое за ответ.
Вроде потихоньку начал въезжать. Поломаю пока голову над стеком. Конечно знаю что это такое, были времена, сам паял на логике длиныые и довольно широкие регистры. Работа стека внутри камня AVR может быть понята, это несомненно. Я же ломаю голову не над тем как, а на тему типа "зачем"? Зачем именно так... Сам знаю что это бред, но... Если стек аппаратный его включают, если стек программный инициируют (запускают) определяют параметры и т.д... Ладно не буду грузить форум, это мое личное. В конце концов вставка прцедур инициирования стека не сложная, чисто автоматическая, ее нужно просто принять как должное, как факт и не ломать голову. С памятью программ все же есть какое то коммерческое лукавство... Ладно все, закругляюсь. Вот только один не христоматийный (в глобальный даташит не заглянешь) вопрос, как бы риторический. 2) AVR-Studio. Я понимаю что багов в каждом софте хватает, и как часто они вылезают - дело индивидуальной эксплуатации софта. Я просто хочу узнать, стоит ли мне вообще стремится к версии 4.12. бороться и биться за нее, за ее работу на благо меня. Пытаться искать нестыковки софта и моей системы. Много ли в AVR-Studio 4.12 отличий, кроме как большее к-во поддерживаемых камней. Насколько и чего в ней лучше. Может она вообще вся такая никакая. Просто я ее не смог попользовать и 5 минут, сразу вешает операционку во время компиляции проекта и кирдык. То есть КАКОВЫ ОТЛИЧИЯ НОВОЙ ВЕРСИИ AVR-Studio ? Еще раз благодарю за ответы. |
|||
|
||||
Слава |
|
|||
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 25.6.2006 Репутация: нет Всего: нет |
У меня AVR-Studio 4.12 работает стабильно. В эту версию встроена GCC , да и макросы уже более продвинутые. Ещё вот WDR команда не работает, по этому при отладке я этот WD отключаю. |
|||
|
||||
PILOT |
|
|||
![]() производство ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2724 Регистрация: 4.4.2002 Где: москва Репутация: 20 Всего: 54 |
Стек в AVR аппаратный требующий обязательной инициализации (а точнее указания вершины стека), иначе не одна из команд вызова подпрокрам и прерываний не будет выполнятся корректно (а точнее всегда будет иметь место сброс или неправильная работа программы)
СУВ. -------------------- тут могла быть Ваша реклама... |
|||
|
||||
Severyanin |
|
|||
![]() Исследователь ![]() ![]() Профиль Группа: Участник Сообщений: 554 Регистрация: 31.7.2007 Где: Россия, Омск Репутация: нет Всего: 9 |
Хм, насчет стека. А как Вы хотели работать с вызовами подпрограмм без его инициализации? Программе просто некуда будет возвращаться. А с FUSE-битами все же лучше не шутить. они могут не переписаться и влиять на работу программы при следующей прошивке камня. У меня была как-то такая проблема. И, на мой взгляд, лучше использовать не прямые вызовы и переходы jmp и call, а относительные - rjmp и rcall соответственно. А еще лучше - писать в IAR на С.
![]() -------------------- "Звонким вереском скроются наши следы, и не вспомнят о них. Кто поверит нам, рыцарям павшей звезды из отвергнутых книг? Пусть в узоре времен ни стихов. ни имен, но напомнит забывшим их полуночный крик." Тэм Гринхилл "Ужели суслик твоего коварства нагадит в плов доверья моего?". Л.Филатов |
|||
|
||||
Severyanin |
|
|||
![]() Исследователь ![]() ![]() Профиль Группа: Участник Сообщений: 554 Регистрация: 31.7.2007 Где: Россия, Омск Репутация: нет Всего: 9 |
да, и еще .Есть книга Джона Мортона "микроконтроллеры AVR. Вводный курс" издательства "ДОДЭКА". В ней изложение материала по AVR идет с постоянным сравнением с PIC, обстоятельно рассказывается, что в этих камнях надо делать по-другому.
![]() -------------------- "Звонким вереском скроются наши следы, и не вспомнят о них. Кто поверит нам, рыцарям павшей звезды из отвергнутых книг? Пусть в узоре времен ни стихов. ни имен, но напомнит забывшим их полуночный крик." Тэм Гринхилл "Ужели суслик твоего коварства нагадит в плов доверья моего?". Л.Филатов |
|||
|
||||
klukva |
|
|||
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 6.11.2012 Репутация: нет Всего: нет |
дОБРОЕ ВРЕМЯ СУТОК) ребята нужна ваша помощь..
есть програма но сделана не до конца помогите дописать , вот условие . Буду очень благодарна если поможете! Використання інтерфейсу І2С. Мета: Освоїти програмні методи реалізації інтерфейсу І2С та взаємодію контролера з інтегральним датчиком температури та годинником реального часу. Хід роботи. 1. В середовищі AVR Studio скласти та відлагодити підпрограми необхідні для програмної реалізації інтерфейсу І2С: 1.1. генератора синхроімпульсів та запису байту; 1.2. генератора синхроімпульсів та читання байту; 1.3. формування умови «старт» та «рестарт»; 1.4. формування умови прийому та передачі імпульсу підтвердження; 1.5. формування умови «стоп». 2. Скласти програму читання коду температури з цифрового датчика DS1621, апаратний адрес 0х90. Записати програму в пам'ять ЕОМ, та перевірити її роботу на лабораторному макеті. Цифровий код перетворити в 0С та відобразити на екрані, в разі потреби удосконалити програму. 3. Скласти програму котра зчитує поточну дату та час з годинника реального часу DS 1302 та відображає результат на дисплеї. Записати програму в пам'ять ЕОМ та перевірити роботу на макеті. 4. Доповнити програму п.3 можливістю корекції дати та часу; вводу нових значень дати та часу. Для наглядності роботи використати РК – дисплей, текстові пояснення та мигаючий курсор. Короткі теоретичні відомості. Мереж І2С передбачає використання пристроями ліній як на вхід так і на вихід; всі пристрої, що об’єднані в мережу І2С мають вихід відкритий колектор. Вони можуть видавати лише сигнал лог. 0 (підкороти на нульову шину), а сигнал лог. 1 формується за допомогою додаткових резисторів, котрі «підтягують» мережу до шини живлення. Сигнал лог. 1 присутній лише тоді, коли виводи всіх абоненти мережі знаходяться в стані «на вхід», а видача хоча б одним абонентом лог. 0 встановить нуль на шині. Будь трансакція по інтерфейсу І2С починається з умови «Старт»: обидві лінії мережі знаходяться в стані лог. 1, це передумова старту, пристрій Майстер переводить шину SDA з 1 в 0 при одиниці на шині SLC. При програмній реалізації І2С необхідно, як мінімум, два рази перевірити наявність лог. 1 на шині SDA (передумова старту). Всі передачі по шині виконуються 8-ми розрядними байтами, починаючи з старшого біту. Кількість байт в посилці – необмежена, однак кожен байт повинен супроводжуватись бітом підтвердження (ASC). Сигнал свідчить про успішне отримання приймачем байту та про готовність приймати наступний. Якщо приймач не готовий отримувати наступний байт даних він не видає сигналу підтвердження, це може свідчити також про несправність приймача, його відсутність, чи помилку в передачі. Посилка складається з байту адресу відомого пристрою, молодший біт вказує на операцію читання якщо він рівний 1, чи запису молодший біт 0; потім пристрій майстер передає адрес регістру в пристрої слейв з котрим буде запис/читання, далі рестарт для читання чи байт для запису в вибраний регістр. ReStart: ; Перевірка можливості старту SCL_Dwn ;перевести шину SCL в лог.0 nop SDA_Hi ; Шину SDA в 1 nop rcall wait5us ; Цикл затримкики nop SCL_Up ; Наростаючий фронт SCL->1 RS1: sbis PinB,SCL ; Стан очікування відомого пристрою? rjmp RS1 rcall wait5us ; Цикл затримки Start: SDA_Lo ; SDA = 0: умова старту rcall wait4us ; Цикл затримки Підпрограма запису байта в відомий пристрій: WriteByte: sec ; Прапорець переносу C = 1 rol dbyt ; Зсув вліво C->LSB, MSB->C rjmp bit1 ; Особлива обробка для розряду 1 WriteBit: lsl dbyt ; Якщо dbyt пустий, ... bit1: breq GetAck ; ... то передача завершена SCL_Dwn ; Спадаючий фронт SCL brcc WriteLow ; Перехід, якщо прапорець C = 0 nop ; Щоб урівняти час виконання SDA_Hi ; Встановити SDA в 1 rjmp SCL_High WriteLow: SDA_Lo ; Встановити SDA в 0 rjmp SCL_High ; Щоб зрівняти тривалість такту SCL_High: rcall wait4us ; Цикл затримки SCL_Up ; Спадаючий фронт SCL WB1:sbis PinB,SCL ; Стан очікування відомого пристрою? rjmp WB1 rcall wait5us ; Цикл затримки rjmp WriteBit Підпрограма читання біта підтвердження: GetAck: SCL_Dwn ; Спадаючий фронт SCL SDA_Hi ; SDA – високоомний стан rcall wait5us ; Цикл затримки SCL_Up ; Наростаючий фронт SCL GA1:sbis PinB,SCL ; Стан очікування відомого пристрою rjmp GA1 cbr Flg,1<<Ack ; Прапорець Ack = 0 sbic PinB,SDA ; якщо SDA = 1, sbr Flg,1<<Ack ; прапорець Ack = 1 rcall wait4us ; Цикл затримки ret Підпрограма читання байту з відомого пристрою: ReadByte: ldi dbyt,1 ; Назначаємо в якості лічильника бітів RB1: SCL_Dwn ; спадаючий фронт SCL rcall wait5us SCL_Up ; Наростаючий фронт SCL RB2: sbis PinB,SCL ; Стан очікування відомого пристрою rjmp RB2 rcall wait5us clc ; Прапорець C = 0 sbic PinB,SDA ; Якщо SDA = 1 sec ;то Carry = 1 rol dbyt ; Зсуваємо прочитаний біт в байті brcc RB1 ; Перехід, якщо читання не завершено SetAck: ; Видача біту підтвердження SCL_Dwn ; Спадаючий фронт SCL sbrs Flg,Ack ;Пропускаємо наступну команду, якщо ;Ack=1 rjmp SA1 ; Перехід, якщо Ack = 0 SDA_Hi ; Встановить SDA в 1 rjmp SA2 SA1: SDA_Lo ; Встановити SDA в 0 SA2: rcall wait5us SCL_Up ; Наростаючий фронт SCL SA3: sbis PinB,SCL ; Стан очікування відомого пристрою rjmp SA3 rcall wait5us ret Видача умови завершення трансакції: Stopp: SCL_Dwn ; спадаючий фронт SCL SDA_Lo ; SDA в 0 rcall wait5us SCL_Up ; SCL в 1 rcall wait5us SDA_Hi ; Наростаючий фронт SCL rcall wait5us ret Это сообщение отредактировал(а) klukva - 6.11.2012, 23:40 |
|||
|
||||
UniBomb |
|
|||
Новичок ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 1754 Регистрация: 24.10.2006 Где: Санкт-Петербург Репутация: 9 Всего: 97 |
klukva, первое - на русскоязычном форуме принято просить на соответствующем языке. Второе - правило форума гласит "одна тема - один вопрос", следовательно надо создать новую тему. Третье - просьбы о помощи постят в раздел "центр помощи". Если нет желания просить помощи в рамках местных норм и правил, то откуда у участников возникнет желание помогать?
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "Микроконтроллеры (MCU) и микропроцессоры (MPU)" | |
|
На данный раздел помимо Правил форума распространяются текже следующие правила:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, PILOT, ManiaK, UniBomb, Mazzi. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Микроконтроллеры (MCU) и микропроцессоры (MPU) | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |