Заголовок сообщения: Re: AVR studio 4 в вопросах и ответах
Добавлено: Вс дек 08, 2013 01:43:31
Модератор
Карма: 90
Рейтинг сообщений: 1430
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4573 Откуда: Планета Земля
Рейтинг сообщения:1 Медали: 1
АСМ тут не причём. Полазайте в ДШ на Ваш МК и посмотрите как можно программно включать и отключать сторожевой таймер. После работы бутлодыря включите его и зациклите навечно программу, сброс произойдёт сам.
Один пень, при собакином ресете, камень виснет. Периферия не пашет до передергивания питания. Вообщем эффект такой же как при команде JMP $0000 Теряю надежду, помогите...
Значит все-таки программа глючит. Поставь ловушки по ходу инициализации основной программы, например выводи в какой-то порт число от нуля и до 255 в каждой точке-ловушке если программа где-то повиснет, то на порту будет номер предшествовавшей этому ловушки. Может это натолкнет на какую-то мысль.
А программа вообще переходит на нулевую метку? Сейчас посмотрел даташит - она и не будет переходить. Когда у тебя активирован загрузчик(BOOTRST=0) то стартовый адрес переносится на адрес загрузчика и любые манипуляции со сбросом будут приводить именно туда. Считай, что оттуда начинается твоя программа, просто с загрузчика когда он сделает своё дело - передай управление на программу. Можно всю инициализацию запихнуть в загрузчик, а программа в младших адресах будет состоять только из главного цикла. Вобщем, на ноль переходить не обязательно, можно перейти сразу на метку START не забыв перед этим проинициализировать стек.
Заголовок сообщения: Re: AVR studio 4 в вопросах и ответах
Добавлено: Вс дек 08, 2013 20:34:51
Открыл глаза
Зарегистрирован: Вс май 30, 2010 20:27:33 Сообщений: 63 Откуда: Санкт-Петербург
Рейтинг сообщения:0
вот программа, для общего понимания
Спойлер;******************************************************************** ; Подпрограмма загрузчик ;******************************************************************** ; BOOTLOADER Для ATmega168 ; Версия 1.2 ; Автор: -=-Kill17-=- ;******************************************************************** ; R16 - регистр для приема данных по USART ; R17 - регистр для промежуточных операций ; R18 - используется как счетчик слов ; R19 - регистр для передачи данных по USART ; R20 - регистр счетчика принятых байт ; ZH:ZL - регистр с адресом страницы и указатель на строку ; R1,R0 - используются с инструкцией spm ;********************************************************************
.nolist .include "m168def.inc" .list
.equ XTAL = 20000 ;частота генератора в кГц .equ BAUD = 115200 ;необходимая скорость обмена в бит/с .equ NB = ((10000*XTAL)/(16*BAUD)-5)/10
.def temp = R16 ;вспомогательный регистр
.cseg
.org $0000
jmp $1F10
.org $1F00 ; точка входа при RESET
cli ; Выключаем прерывания
;******************************************************************** ; Проверка входа в BOOTLOADER хардова ;******************************************************************** cbi DDRC,2 ;Настраиваем пин на вход sbi PORTC,2 ;ВЫключаем резистор подтяжки sbiS PINC,2 ;Проверяем пин jmp $0000 ;Если 0, то уходим в оснавную программу ;********************************************************************
;******************************************************************** ; Настройка портов для моргания светодиодов при входе в BOOTLOADER ;********************************************************************
ldi temp,(1<<PB3)|(1<<PB4) ; 0b00011000 - порты PВ3 и PB4 out DDRB, temp ; ; на выход ldi temp,(1<<CS12)|(0<<CS11)|(1<<CS10); установка таймера (clk/1024) sts TCCR1B,temp ;******************************************************************** ; Тело BOOTLOADER ;********************************************************************
boot_loader:
rcall getc ;принимаем через порт команду cpi r16,'D' ;если "D", то передаем строку brne bl1 rjmp device_id ;подтверждения присутствия на линии bl1: cpi R16,'R' ;если "R", то завершение подпрограммы brne bl2 jmp exit_boot ;и переход к старту основной программы bl2: cpi R16,'P' ;если "P", то переходим к brne bl3 rjmp program_flash ;программированию страницы FLASH-памяти ;если принят иной символ, то возвращаем bl3: cpi R16,'V' ;если "V", то Выдаем версию brne bl4 rjmp Version_id bl4: cpi R16,'S' ;если "S", то Выдаем сайт brne bl5 rjmp Sait_id bl5: rjmp boot_loader
;******************************************************************** ; Функции завершения работы BOOTLOADER ;******************************************************************** exit_boot: cli ldi r16,(1<<IVCE) out MCUCR ,r16 ldi r16, (0<<IVSEL) out MCUCR,r16 jmp $0000 ret ;******************************************************************** ; Функции отправки опознования девайса ;******************************************************************** device_id: ldi ZH,high(2*id_string);заносим в указатель Z адрес ldi ZL,low(2*id_string) ;начала строки подтверждения di1: lpm r19,Z+ ;передаем символы до тех пор, пока tst r19 ;не встретится 0 (конец строки) breq boot_loader rcall putc rjmp di1
Sait_id: ldi ZH,high(2*sait_string) ;заносим в указатель Z адрес ldi ZL,low(2*sait_string) ;начала строки подтверждения di2: lpm r19,Z+ ;передаем символы до тех пор, пока tst r19 ;не встретится 0 (конец строки) breq boot_loader rcall putc rjmp di2
Version_id: ldi ZH,high(2*version_string);заносим в указатель Z адрес ldi ZL,low(2*version_string) ;начала строки подтверждения di3: lpm r19,Z+ ;передаем символы до тех пор, пока tst r19 ;не встретится 0 (конец строки) breq boot_loader rcall putc rjmp di3
;******************************************************************** ; Подпрограмма передачи байта ; R19 - байт для передачи на входе в подпрограмму ;******************************************************************** putc: LDs R16, UCSR0A sbrs R16, UDRE0 rjmp putc ;данных передатчика USART sts UDR0,R19 ;передаем байт данных ret ;******************************************************************** ; Подпрограмма приема байта ; R16 - принятый байт на выходе из подпрограммы ;******************************************************************** getc: rcall Led LDs R16, UCSR0A sbrs R16, RXC0 rjmp getc LDS R16,UDR0 ;переносим байт в рабочий регистр ret ;******************************************************************** ; Подпрограмма стерания страници памяти ;******************************************************************** erase_flash: rcall get_adr ldi R16,(1<<PGERS)|(1<<SELFPRGEN) rcall do_spm ;стираем страницу rcall put_ret ;отсылаем символ подтверждения "!" rjmp boot_loader ;******************************************************************** ; Подпрограмма приема адреса страницы ; ZH:ZL - принятый адрес на выходе из подпрограммы ;******************************************************************** get_adr: rcall getc ;принимаем младший байт адреса страницы mov ZL,R16 rcall getc ;принимаем старший байт адреса страницы mov ZH,R16 ret ;******************************************************************** ; Подпрограмма запуска команды spm ; R16 - байт для передачи кода в регистр SPMCR ;******************************************************************** do_spm: in R17,SPMCsR ;ожидаем пока не закончится предыдущая sbrc R17,SELFPRGEN ;операция rjmp do_spm ds1: sbic EECR,EEPE ;ожидаем пока не закончится запись rjmp ds1 ;в EEPROM-память out SPMCsR,R16 ;модифицируем регистр SPMCR spm ;в течении 4-х циклов выполняем команду spm ret ;******************************************************************** ; Подпрограмма передачи символа подтверждения "!" ;******************************************************************** put_ret: ldi R19,'!' rcall putc ret ;******************************************************************** ; Подпрограмма програмирования страници Flash ;******************************************************************** program_flash: rcall get_adr ;принемаем адрес страницы ldi R16,(1<<PGERS)|(1<<SELFPRGEN) rcall do_spm ;стираем страницу ldi R18,PAGESIZE ;инициализируем счетчик слов pf1: rcall getc ;принимаем младший байт кода mov R0,R16 rcall getc ;принимаем старший байт кода mov R1,R16 ldi R16,1<<SELFPRGEN rcall do_spm ;заносим слово в буфер записи adiw ZH:ZL,2 dec R18 ;повторяем 64 раза brne pf1 subi ZL,PAGESIZE ;восстанавливаем адрес страницы sbci ZH,0 ldi R16,(1<<PGWRT)|(1<<SELFPRGEN) rcall do_spm ;записываем страницу rcall put_ret ;отсылаем символ подтверждения "!" rjmp boot_loader
exit_boot: ... jmp $0000 - как думаешь, куда будет произведен прыжок? попадаешь снова в бутлоадер. ret - кстати его тут можно не ставить, управление сюда не попадет НИКОГДА.
Заголовок сообщения: Re: AVR studio 4 в вопросах и ответах
Добавлено: Вс дек 08, 2013 21:19:35
Открыл глаза
Зарегистрирован: Вс май 30, 2010 20:27:33 Сообщений: 63 Откуда: Санкт-Петербург
Рейтинг сообщения:0
Alexeyslav писал(а):
exit_boot: ... jmp $0000 - как думаешь, куда будет произведен прыжок? попадаешь снова в бутлоадер. ret - кстати его тут можно не ставить, управление сюда не попадет НИКОГДА.
так это - .org $0000
jmp $1F10
а после заливки основной программы, то в теории в нее или я заблуждаюсь?
PS: Да собственно оставь только это, что тоже самое
Код:
;******************************************************************** ; Функции завершения работы BOOTLOADER ;******************************************************************** exit_boot: cli ldi r16,(1<<IVCE) out MCUCR ,r16 ; ldi r16, (0<<IVSEL) ; out MCUCR,r16 jmp $0000 ret
Заголовок сообщения: Re: AVR studio 4 в вопросах и ответах
Добавлено: Вс дек 08, 2013 22:51:45
Открыл глаза
Зарегистрирован: Вс май 30, 2010 20:27:33 Сообщений: 63 Откуда: Санкт-Петербург
Рейтинг сообщения:0
смысл очень простой, камень зашивается и ставится в готовое изделие, пин С2 подтянут к 0 резистором постоянно, и только после этого зашивается основная программа, те этим переходом с 0000 адреса обратно в бут, я избавляю себя от того, чтобы лишний раз разберать готовое устройство. После первой же заливки основной программы, она перезаписывает область с адреса 0000 и тем самым, оставляет только аварийный вход в бут, через пин С2.
Ребята - в виду того что я не нашел поиска по топику - подскажите ! можно ли как то аврс4 подружить с людским редактором как-то? Много не прошу но банальный автокомплит и главное подсветку скобок хотябы .....?
_________________ Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости
почему не может войти в программинг мод? как это исправить? происходит довольно часто , особенно на маленьких бесконечных циклах мк attiny13a, программатор avrisp mk2 clone
kobzar Банальный и не банальный автокомплит можно получить из студии шестой. Если нужен быстрый IDE пользуемся тем, что есть... Либо переходим на квавр там даже из истории копирования можно код вставить.
mak36999 писал(а):
почему не может войти в программинг мод?
Возможно это происходит из–за того, что у вас запущен дебаггер? Ставьте на паузу, либо оставливайте перед программированием
На семерке нужно сохранить файл конфигурации с правами администратора. Уже где то ранее упоминалось.... А вообще это не подсветка скобок, а расцветка. Подсветкой я считаю выделение парной скобки при выделении или по приближению курсора проверяемой скобке. Так есть в шестой студии. Мало того, там еще есть автозакрытие новой рукописной скобки! То есть при открытии скобки всё что дальше пишешь уже находится в скобке. В КВавр есть подсветка пары.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 129
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения