tiny2313, логика работы порта D
tiny2313, логика работы порта D
Пытаюсь вывести меандр на пины порта D.
Вывожу 1 в порт, ставлю 2 нопа (чтоб компенсировать два такта уходящие на rjmp), вывожу 0 в порт, jmp'аю на начало.
С битами 0 и 1 порта D прокатывает, а вот с 2 и 3 - почему-то меандр не получается. Исходник в AVR Studio и проект в Proteus 7.4 прилогаю.
Вывожу 1 в порт, ставлю 2 нопа (чтоб компенсировать два такта уходящие на rjmp), вывожу 0 в порт, jmp'аю на начало.
С битами 0 и 1 порта D прокатывает, а вот с 2 и 3 - почему-то меандр не получается. Исходник в AVR Studio и проект в Proteus 7.4 прилогаю.
- Вложения
-
- 3110p.rar
- (25.98 КБ) 224 скачивания
- Реклама
Куда именно в студии смотреть? Куда же деваются лишние 3 такта? Почему ноль длится 7ms, а не 4ms ?ikarab писал(а):Дак в Студии же видно чего МК делает и должно быть понятно в чем там дело .
ps: Если кто еще не понял, я не профи, я новичок. Соответственно не очень хорошо еще знаю все нюансы AVR Studio, иначеб я наверное не задавал вопросы.
Когда код написан в одну строку - его проще закоментировать, исключив из компиляции. Там несколько одинаковых кусков, только для разных битов прота D.akl писал(а):Странное какое-то написание команд. Лень ENTER нажать?
Ну и что поменялось? Как разделение команд (пробелом или переводом строки) влияет на готовый код? Никак. Соответственно и результат одинаков. НЕ работает. В случае с нолевым и первым битом порта D (и со всем портом B) длительность ноля и единицы - 4ре такта процессора (4ms при тактовой частоте 1MHz). Если этот-же код применяется ко вторму и третьему биту порта D - длительность ноля почему-то 7ms. Откуда берутся эти лишние 3ms? Что процессор делает лишних 3 такта?Вот так в студии работает
- Реклама
- Neekeetos
- Держит паяльник хвостом
- Сообщения: 993
- Зарегистрирован: Пн сен 18, 2006 11:16:05
- Откуда: Тула
- Контактная информация:
Yurivz писал(а):Ну и что поменялось? Как разделение команд (пробелом или переводом строки) влияет на готовый код? Никак. Соответственно и результат одинаков. НЕ работает. В случае с нолевым и первым битом порта D (и со всем портом B) длительность ноля и единицы - 4ре такта процессора (4ms при тактовой частоте 1MHz). Если этот-же код применяется ко вторму и третьему биту порта D - длительность ноля почему-то 7ms. Откуда берутся эти лишние 3ms? Что процессор делает лишних 3 такта?
cbi и sbi выполняются по два такта, нопы - по одному, но у тебя их два, плюс два такта относительный переход на начало цикла, итого 2+2+2+2 = 8 тактов на полный цикл, ты ни про 4 такта ни про 7 не угадал. Потом ты же понимаешь что твой код работает как ты задумал только если дрыгать одним битом, добавляя одновременно другие к длительности ноля у всех будет добавлено по 6 тактов - на обработку других каждого дополнительного.
Для тех кому лень открыть Proteus - прилагаю картинку, на которой достаточно наглядно отображена суть проблемы.
На картинке даны осциллограммы полученные в протеусе, а справа код, который их сгенерил. Как видно, код отличается только номером бита, который устанавливается и сбрасывается. Однако если я использую бит 2 - ноль затягивается на 3ms, как будто в коде стоят не 2 nop'а, а 5. Вот мне и интересно, что проц делает эти лишние 3 такта? Почему вместо положенных 4х тактов на нулевой полупериод - выползают 7.
На картинке даны осциллограммы полученные в протеусе, а справа код, который их сгенерил. Как видно, код отличается только номером бита, который устанавливается и сбрасывается. Однако если я использую бит 2 - ноль затягивается на 3ms, как будто в коде стоят не 2 nop'а, а 5. Вот мне и интересно, что проц делает эти лишние 3 такта? Почему вместо положенных 4х тактов на нулевой полупериод - выползают 7.
- Neekeetos
- Держит паяльник хвостом
- Сообщения: 993
- Зарегистрирован: Пн сен 18, 2006 11:16:05
- Откуда: Тула
- Контактная информация:
Yurivz писал(а):Осциллограммы в протеусе смотрел? Судя по всему нет. Открой протеусом приаттаченный в начале проект и посчитай сам. Потом говори угадал я или нет.Neekeetos писал(а):начало цикла, итого 2+2+2+2 = 8 тактов на полный цикл, ты ни про 4 такта ни про 7 не угадал.
Ну открыл, судя по 16 тактам на цикл шпротеус глючит. Так что спи спокойно дорогой товарищ, все работает.
Вот собственно такое подозрение у меня тоже закрадывалось... Учитывая что я еще только начинаю изучать AVR, а протеус глюками меня уже достал. Но для надежности хотелось бы быть уверенным, что это именно глюк протеуса, а не хитрая логика отработки порта D связанная с альтернативными функциями пинов к примеру. Увы это в реальном железе я проверить немогу за неимением реального железного осциллографа.Neekeetos писал(а):Ну открыл, судя по 16 тактам на цикл шпротеус глючит. Так что спи спокойно дорогой товарищ, все работает.
- Neekeetos
- Держит паяльник хвостом
- Сообщения: 993
- Зарегистрирован: Пн сен 18, 2006 11:16:05
- Откуда: Тула
- Контактная информация:
Yurivz писал(а):Вот собственно такое подозрение у меня тоже закрадывалось... Учитывая что я еще только начинаю изучать AVR, а протеус глюками меня уже достал. Но для надежности хотелось бы быть уверенным, что это именно глюк протеуса, а не хитрая логика отработки порта D связанная с альтернативными функциями пинов к примеру. Увы это в реальном железе я проверить немогу за неимением реального железного осциллографа.Neekeetos писал(а):Ну открыл, судя по 16 тактам на цикл шпротеус глючит. Так что спи спокойно дорогой товарищ, все работает.
Чисто теоретически можно собрать внешний тактовый генератор выдрав его из китайского будильника. Там частота 1 герц - можно считать такты в реальном времени просто привесив светодиод на порт
-
systemmind
- Родился
- Сообщения: 13
- Зарегистрирован: Сб апр 25, 2009 07:55:58
- Контактная информация:



