zeconir

Proteus чудит с отладкой кода WinAVR

5 сообщений в этой теме

Добрый день (вечер)! Уже практически целый день голову ломаю, что же это может быть... Итак, в чем проблема. Имеется некий проект на ATmega8, компилятор - WinAVR, среда - встроенный в протеус редактор кода. Все бы хорошо, но вот незадача, при компилировании и запуске в отладчике отображается черт знает что. Пример:

fignya.JPG.e8fba7b755b45d46d83e25f08af30e0e.JPG

Строки 147, 153 и т.д. не должны иметь адресов, но они есть. А вот строки 143, 150 и т.д. наоборот. И это при выключенной оптимизации...

 

Никто не сталкивался с таким? Весь проект очень не хочется заново делать, но чувствую по-другому этот странный баг не одолеть. Так как остальные проекты открываются и редактируются нормально. Пробовал и менять версии протеуса, машины, оптимизацию. Результат 0.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

153 строка скорее всего if из строки выше. 

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я к этому тоже пришел, но вот только очень не удобно искать соответствия.

Плюс, как оказывается, не работает пошаговая отладка.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Это вы еще не пробовали в протеусе работать с AVR-GCC версии хотя бы 5.2... вот где ужас нерожденного © !

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Все так печально?

** Proteus у меня последний, 8.6...

Ну вот, сейчас создал новый проект, только кинул контроллер и вставил код из старого. Вуаля, все работает как и должно. Правда вот надолго ли...

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас

  • Сообщения

  • Похожие публикации

    • Автор: Max1201
      Код с помощью которого двигатель вращается в одном направлений по часовой стрелке.
      А нужно "составить программу на языке ассемблера для реверсивного управления электродвигателем постоянного тока". так написано в заданий
      Но я думаю можно новую не писать, а можно изменить эту так что бы двигатель вращался в одну сторону и потом в другую, наверно так. Помогите, а то я вообще не понимаю этот ассемблер(( 
      ;* На выходе OC1A МК АТmega16 получаем выходные импульсы ;* с частотой 50 Гц и коэффициентом заполнения g=0,025. ;* Тактовая частота MK AVR: 4 МГц .nolist .include"m16def.inc" .list .def STAT = r15 ;Регистр для хранения состояния главной программы .def WorkH = r16 ;Рабочий регистр для главной программы .def WorkI = r17 ;Рабочий регистр для прерывания от таймера .def AddLo = r18 ;Вспомогательный регистр для прибавления константы .equ Impuls = 9000 ;Число тактовых сигналов, соответствующее импултсу .equ Pause = 1000 ;Число тактовых сигналов, соответствующее паузе Reset: rjmp Initial ;Переход к части инициализации reti ;Внешнее прерывание 0 (не используется) reti ;Внешнее прерывание 1 (не используется) reti ;Прерывание по захвату (не используется) Timer1CompA: ;Прерывание CompareA для ATmega16 in STAT,SREG ;Сохраняем флаги главной программы in WorkI,TCCR1A ;Регистр управления А счетчика Т/С1 sbrs WorkI,COM1A0 ;Пропускаем следующую команду, если COM1A0 = 1 rjmp TC1 ;Пропускаем следующую команду, если COM1A0 = 0 cbr WorkI,1<<COM1A0 ;При следующем прерывании OC1A -> 1 out TCCR1A,WorkI ;Сохраняем новое значение in AddLo,OCR1AL ;Младший байт OCR1A subi AddLo,Low(-Impuls) ;Прибавляем младший байт значения импульса in WorkI,OCR1AH ;Старший байт OCR1A sbci WorkI,High(-Impuls) ;Прибавляем старший байт значения импульса rjmp IntEnde TC1: sbr WorkI,1<<COM1A0 ;При следующем прерывании OC1A -> 1 out TCCR1A,WorkI ;Сохраняем новое значение in AddLo,OCR1AL ;Младший байт OCR1A subi AddLo,Low(-Pause) ;Прибавляем младший байт значения длительности импульса in WorkI,OCR1AH ;Старший байт OCR1A sbci WorkI,High(-Impuls) ;Прибавляем старший байт значения длительности импульса IntEnde: out OCR1AH,WorkI ;Назад - старший байт нового значения out OCR1AL,AddLo ;Назад - младший байт нового значения out SREG,STAT ;Восстанавливаем старые флаги reti ;Выход из обработки прерывания CompareA Initial: ;Инициализация регистра ввода/вывода ldi WorkH,High(RamEnd) out sph,WorkH ldi WorkH,Low(RamEnd) out spl,WorkH ;Инициализируем стек clr WorkH ;Все разряды = 0 out PortD,WorkH ;Вывод в порт D ldi WorkH,$20 ;Разряд 5 - в 1, остальные - в 0 out DDRD,WorkH ;OC1A (PD5) - выход, остальные входы ldi WorkH,High(Pause) ;Старший байт значения паузы out OCR1AH,WorkH ;в старший байт регистра сравнения А ldi WorkH,Low(Pause) ;Младший байт значения паузы out OCR1AL,WorkH ;в младший байт регистра сравнения А ldi WorkH,$C0 ;OC1A -> 1 out TCCR1A,WorkH ;Сохраняем новое значение ldi WorkH,$02 ;Входной такт Т/С1 = такт сист. синхр./8 out TCCR1B,WorkH ;Запускаем Т/С1 ldi WorkH,$40 out TIMSK,WorkH ;Разрешаем прерывание CompareA sei ;Общее разряшение прерываний (разряд I) Haupt: rjmp Haupt ;Главная часть программы: ожидаем возникновения прерывания Программа работает двигатель крутиться по часовой стрелке, Препод сказал что на один вход мы сигнал подали теперь нужно его сохранить и подать на другой, на фотках схема подключения и установка




      В методичке это 4 лаба, там программа не та но теория та что и вновой методичке
      lab_rab_MK_AVR.pdf
    • Автор: A1essandro
      Atmel Studio 7.
      Здравствуйте. Занимаюсь в свободное время небольшим проектом. Пару дней был перерыв, всё работало. Сегодня делаю ребилд, вот Output:
      ------ Rebuild All started: Project: RF, Configuration: Debug AVR ------ Build started. Project "RF.cproj" (Clean target(s)): Target "Clean" in file "D:\Circuits\AtmelStudio\7.0\Vs\Compiler.targets" from project "D:\Circuits\AvrProjects\RadioNanny\RF\RF.cproj" (entry point): Task "RunCompilerTask" Shell Utils Path D:\Circuits\AtmelStudio\7.0\shellUtils D:\Circuits\AtmelStudio\7.0\shellUtils\make.exe clean rm -rf library.o rm -rf library.d rm -rf "libRF.elf" "libRF.a" "libRF.hex" "libRF.lss" "libRF.eep" "libRF.map" "libRF.srec" "libRF.usersignatures" Done executing task "RunCompilerTask". Done building target "Clean" in project "RF.cproj". Done building project "RF.cproj". Build succeeded. ------ Rebuild All started: Project: RF, Configuration: Debug AVR ------ Build started. Project "RF.cproj" (default targets): Target "PreBuildEvent" skipped, due to false condition; ('$(PreBuildEvent)'!='') was evaluated as (''!=''). Target "CoreBuild" in file "D:\Circuits\AtmelStudio\7.0\Vs\Compiler.targets" from project "D:\Circuits\AvrProjects\RadioNanny\RF\RF.cproj" (target "Build" depends on it): Task "RunCompilerTask" Shell Utils Path D:\Circuits\AtmelStudio\7.0\shellUtils D:\Circuits\AtmelStudio\7.0\shellUtils\make.exe all --jobs 2 --output-sync D:\Circuits\AvrProjects\RadioNanny\RF\Release\Makefile(79,1): error: recipe for target 'library.o' failed make: *** [library.o] Error 1 Done executing task "RunCompilerTask" -- FAILED. Done building target "CoreBuild" in project "RF.cproj" -- FAILED. Done building project "RF.cproj" -- FAILED. Build FAILED. ========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ========== В ошибках:
      Severity Code Description Project File Line Error recipe for target 'library.o' failed RF D:\Circuits\AvrProjects\RadioNanny\RF\Release\Makefile 79 Что находится в Makefile строка 78-82:
      78: ./%.o: .././%.c 79: @echo Building file: $< 80: @echo Invoking: AVR/GNU C Compiler : 5.4.0 81: $(QUOTE)D:\Circuits\AtmelStudio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin\avr-gcc.exe$(QUOTE) -x c -funsigned-char -funsigned-bitfields -DNDEBUG -I"D:\Circuits\AtmelStudio\7.0\Packs\atmel\ATtiny_DFP\1.2.118\include" -Os -ffunction-sections -fdata-sections -fpack-struct -fshort-enums -Wall -mmcu=attiny13 -B "D:\Circuits\AtmelStudio\7.0\Packs\atmel\ATtiny_DFP\1.2.118\gcc\dev\attiny13" -c -std=gnu99 -MD -MP -MF "$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)" -o "$@" "$<" 82: @echo Finished building: $< Перестало билдиться именно при ребилде. Если откатить изменения, и сделать просто билд - всё работает.
      Запускаю студию от администратора, т.е. с правами проблем нет. Да и по логике, если хватает прав удалить при clean файлы, то должно хватать и на создание.
      Вообще, мне не совсем понятна фраза recipe for target 'library.o' failed.
    • Автор: Роман «Anti» Потупин
      Здравствуйте!
      Не могу разобраться где же я ошибся.
      1-й сегмент на lm7806 c обвязкой из datasheet - проблем нет, все работает
      2-й сегмент на 2-х резисторах 1к и 5,1к, делитель, на стенде получал 5в. (но в схеме не работает, при нагрузке просаживается до 0,36)
      3-й сегмент 2 5-и вольтовых реле, если подаю отдельно напряжение с LM (6в) эта часть схемы запускается, при подачи 5В с БП, тоже все хорошо. Не работает при подаче напряжения через делитель 
      Знаний не хватает, обращаюсь за консультацией.
      Данная схема не будет применяться нигде, и все инженерные решения являются не более, чем попыткой разобраться в этом сложном искусстве. (учусь)
      Во вложении схема и плата.
       
       

      test.lay6

    • Автор: A1essandro
      Здравствуйте. Думаю кто-то сталкивался с таким.
      Пишу прошивку для двух контроллеров, которые будут общаться через RF модуль. Для них нужны некоторые общие настройки, например частота, время задержки при определенных действиях, и тд. Задавать в каждом проекте в коде - противоречит принципу DRY, да и вообще...
      Сделал два проекта, для передатчика и приемника. И сделал проект static library для общих настроек, назвал Common. Добавил референсы на статическую библиотеку.
      Определяю в common:
      unsigned char KEY = 0b10010110; Пытаюсь использовать в проекте передатчика:
      send(KEY); При ребилде получаю ошибку, что KEY не определена. 
    • Автор: si4karuk
      Привет. 
      Вот, озадачился такой, на первый взгляд, простой ерундой. Как подключить 24 релюшки к одному микроконтроллеру. Да еще и ножки микросхемы сэкономить. Конечно же 74hc595!!!
      Да не тут то было. Если с двумя регистрами проблем никаких не возникало, то с тремя, что то пошло не так.
      Пишу в AtmelStudio на Си.
      Макро
      #define DS_PORT PORTD #define DS_PIN 3 #define ST_CP_PORT PORTD #define ST_CP_PIN 4 #define SH_CP_PORT PORTA #define SH_CP_PIN 4 #define DS_low() DS_PORT&=~ (1 << DS_PIN) #define DS_high() DS_PORT|= (1 << DS_PIN) #define ST_CP_low() ST_CP_PORT&=~ (1 << ST_CP_PIN) #define ST_CP_high() ST_CP_PORT|= (1 << ST_CP_PIN) #define SH_CP_low() SH_CP_PORT&=~ (1 << SH_CP_PIN) #define SH_CP_high() SH_CP_PORT|= (1 << SH_CP_PIN) А это функция вывода числа через три последовательно подключенных регистра
      void output_led_state(unsigned long int __led_state) { SH_CP_low(); ST_CP_low(); for (long int i=0;i<24;i++) { if (((1 << i) & __led_state) == (1 << i)) DS_high(); else DS_low(); SH_CP_high(); SH_CP_low(); } ST_CP_high(); } А тут, в майне, я передаю число.
      output_led_state(0b000000010000000000000000); Но выводится только 16 бит а не 24!!!!!!
      Вопрос, что я делаю не так???  
      В архиве схема и прошивка.
      proyeck.rar