AVR studio в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Kill17
Открыл глаза
Сообщения: 63
Зарегистрирован: Вс май 30, 2010 20:27:33
Откуда: Санкт-Петербург
Контактная информация:

Re: AVR studio 4 в вопросах и ответах

Сообщение Kill17 »

не сочтите за наглость, но осваивать асму начал 5 дней назад, можите превести пример кода?
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: AVR studio 4 в вопросах и ответах

Сообщение Аlex »

АСМ тут не причём. Полазайте в ДШ на Ваш МК и посмотрите как можно программно включать и отключать сторожевой таймер.
После работы бутлодыря включите его и зациклите навечно программу, сброс произойдёт сам.
Аватара пользователя
Kill17
Открыл глаза
Сообщения: 63
Зарегистрирован: Вс май 30, 2010 20:27:33
Откуда: Санкт-Петербург
Контактная информация:

Re: AVR studio 4 в вопросах и ответах

Сообщение Kill17 »

Спасибо, уже в ДШ ползую, нашел по Спящую собаку главу, буду изучать :))
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

Re: AVR studio 4 в вопросах и ответах

Сообщение Alexeyslav »

Собака эта хитрая, включить легко а остановить нужна строгая процедура, собственно она описана в даташите.
Аватара пользователя
Kill17
Открыл глаза
Сообщения: 63
Зарегистрирован: Вс май 30, 2010 20:27:33
Откуда: Санкт-Петербург
Контактная информация:

Re: AVR studio 4 в вопросах и ответах

Сообщение Kill17 »

так, пробую

Код: Выделить всё

WDT_off:
wdr
ldi r16, (1<<WDCE) | (1<<WDE)
sts WDTCSR,r16
ldi r16, (0<<WDE)
sts WDTCSR,r16
ret

WDT_on:
wdr
ldi r16, (1<<WDCE) | (1<<WDE)
sts WDTCSR,r16
ldi r16, (1<<WDE) | (1<<WDP2) | (1<<WDP1) | (1<<WDP0)
sts WDTCSR,r16
ret


Один пень, при собакином ресете, камень виснет. Периферия не пашет до передергивания питания. Вообщем эффект такой же как при команде JMP $0000 Теряю надежду, помогите...
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

Re: AVR studio 4 в вопросах и ответах

Сообщение Alexeyslav »

Значит все-таки программа глючит.
Поставь ловушки по ходу инициализации основной программы, например выводи в какой-то порт число от нуля и до 255 в каждой точке-ловушке если программа где-то повиснет, то на порту будет номер предшествовавшей этому ловушки. Может это натолкнет на какую-то мысль.
Аватара пользователя
Kill17
Открыл глаза
Сообщения: 63
Зарегистрирован: Вс май 30, 2010 20:27:33
Откуда: Санкт-Петербург
Контактная информация:

Re: AVR studio 4 в вопросах и ответах

Сообщение Kill17 »

заливаю в качестве основной программы мигалку диодом, в ней ничего нету, кроме изменения одного пина на порту....

может я чего-то не понял, при ресети через собаку, перефирия и регистры должны сбрасываться или нет?
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

Re: AVR studio 4 в вопросах и ответах

Сообщение Alexeyslav »

А программа вообще переходит на нулевую метку?
Сейчас посмотрел даташит - она и не будет переходить. Когда у тебя активирован загрузчик(BOOTRST=0) то стартовый адрес переносится на адрес загрузчика и любые манипуляции со сбросом будут приводить именно туда.
Считай, что оттуда начинается твоя программа, просто с загрузчика когда он сделает своё дело - передай управление на программу. Можно всю инициализацию запихнуть в загрузчик, а программа в младших адресах будет состоять только из главного цикла. Вобщем, на ноль переходить не обязательно, можно перейти сразу на метку START не забыв перед этим проинициализировать стек.
Аватара пользователя
Kill17
Открыл глаза
Сообщения: 63
Зарегистрирован: Вс май 30, 2010 20:27:33
Откуда: Санкт-Петербург
Контактная информация:

Re: AVR studio 4 в вопросах и ответах

Сообщение Kill17 »

вот программа, для общего понимания

Спойлер;********************************************************************
; Подпрограмма загрузчик
;********************************************************************
; 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, то уходим в оснавную программу
;********************************************************************

.org $1F10 ; точка входа при Софтовом прыжке


ldi temp,low(RAMEND) ;инициализация стека
STS SPL,temp
ldi temp,high(RAMEND)
STS SPH,temp
clr temp ;задаем параметры USART: 115200, 8-N-1
STS UBRR0H,temp
ldi temp,NB
STS UBRR0L,temp
ldi temp,(1<<RXEN0)|(1<<TXEN0)
STS UCSR0B,temp
ldi temp,(1<<UCSZ00)|(1<<UCSZ01)
STS UCSR0C,temp

;********************************************************************
; Настройка портов для моргания светодиодов при входе в 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

;********************************************************************
;Функция моргания диодами
;********************************************************************
led:
lds temp,TCNT1L
lds temp,TCNT1H
sbrc temp,4
cbi portb,3
sbrc temp,4
cbi portb,4
sbrs temp,4
sbi portb,3
sbrs temp,4
sbi portb,4
ret
;********************************************************************
; Строки для отправки
;********************************************************************

version_string:
.db "BOOTLOADER "
sait_string:
.db "h "
id_string:
.db "R",0



Самое интересное, если из программы перейти в бут, то бут работает прекрасно, но выйти из него получается только после Хардового ресета.

После заливки основной программы и хардового ресета, основная программа запускается прекрасно и работает как положено.
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

Re: AVR studio 4 в вопросах и ответах

Сообщение Alexeyslav »

exit_boot:
...
jmp $0000 - как думаешь, куда будет произведен прыжок? попадаешь снова в бутлоадер.
ret - кстати его тут можно не ставить, управление сюда не попадет НИКОГДА.
Аватара пользователя
Kill17
Открыл глаза
Сообщения: 63
Зарегистрирован: Вс май 30, 2010 20:27:33
Откуда: Санкт-Петербург
Контактная информация:

Re: AVR studio 4 в вопросах и ответах

Сообщение Kill17 »

Alexeyslav писал(а):exit_boot:
...
jmp $0000 - как думаешь, куда будет произведен прыжок? попадаешь снова в бутлоадер.
ret - кстати его тут можно не ставить, управление сюда не попадет НИКОГДА.



так это -
.org $0000

jmp $1F10

а после заливки основной программы, то в теории в нее или я заблуждаюсь?
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Re: AVR studio 4 в вопросах и ответах

Сообщение zero648 »

Этой командой включаешь IVCE

Код: Выделить всё

 ldi r16,(1<<IVCE)
 out MCUCR ,r16

а этой командой отключаешь и IVSEL и IVCE

Код: Выделить всё

 ldi r16, (0<<IVSEL)
 out MCUCR,r16

сделай тогда так:

Код: Выделить всё

 ldi r16, (0<<IVSEL)|(1<<IVCE)
 out MCUCR,r16


PS: Да собственно оставь только это, что тоже самое

Код: Выделить всё

;********************************************************************
; Функции завершения работы BOOTLOADER
;********************************************************************
exit_boot:
 cli
 ldi r16,(1<<IVCE)
 out MCUCR ,r16
; ldi r16, (0<<IVSEL)
; out MCUCR,r16
 jmp $0000
 ret
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

Re: AVR studio 4 в вопросах и ответах

Сообщение Alexeyslav »

У тебя сейчас сделано так что по сбросу, что по переходу на адрес $0000 ты попадаешь в обработчик загрузчика. смысл?
Аватара пользователя
Kill17
Открыл глаза
Сообщения: 63
Зарегистрирован: Вс май 30, 2010 20:27:33
Откуда: Санкт-Петербург
Контактная информация:

Re: AVR studio 4 в вопросах и ответах

Сообщение Kill17 »

смысл очень простой, камень зашивается и ставится в готовое изделие, пин С2 подтянут к 0 резистором постоянно, и только после этого зашивается основная программа, те этим переходом с 0000 адреса обратно в бут, я избавляю себя от того, чтобы лишний раз разберать готовое устройство. После первой же заливки основной программы, она перезаписывает область с адреса 0000 и тем самым, оставляет только аварийный вход в бут, через пин С2.
kobzar
Грызет канифоль
Сообщения: 278
Зарегистрирован: Вт дек 03, 2013 11:04:04
Откуда: Киев
Контактная информация:

Re: AVR studio 4 в вопросах и ответах

Сообщение kobzar »

Ребята - в виду того что я не нашел поиска по топику - подскажите ! можно ли как то аврс4 подружить с людским редактором как-то?
Много не прошу но банальный автокомплит и главное подсветку скобок хотябы .....?
Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости
Аватара пользователя
Dr. Alex
Это не хвост, это антенна
Сообщения: 1438
Зарегистрирован: Вт окт 28, 2008 09:00:18
Откуда: Украина, Харьков
Контактная информация:

Re: AVR studio 4 в вопросах и ответах

Сообщение Dr. Alex »

Походу в 4 студии такого НИКАК не сделаешь.... Нигде в сети не пишется ни о каких скриптах на эту тему)
Порой мне кажется, что я делаю какое-то дерьмо, но когда я вижу, что делают другие, то я чувствую себя гением...
mak36999
Открыл глаза
Сообщения: 42
Зарегистрирован: Пн июн 10, 2013 14:39:50

Re: AVR studio 4 в вопросах и ответах

Сообщение mak36999 »

почему не может войти в программинг мод? как это исправить?
происходит довольно часто , особенно на маленьких бесконечных циклах
мк attiny13a, программатор avrisp mk2 clone
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: AVR studio 4 в вопросах и ответах

Сообщение vitalik_1984 »

kobzar Банальный и не банальный автокомплит можно получить из студии шестой.
Если нужен быстрый IDE пользуемся тем, что есть...
Либо переходим на квавр там даже из истории копирования можно код вставить.
mak36999 писал(а):почему не может войти в программинг мод?

Возможно это происходит из–за того, что у вас запущен дебаггер? Ставьте на паузу, либо оставливайте перед программированием
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Re: AVR studio 4 в вопросах и ответах

Сообщение zero648 »

kobzar писал(а):... и главное подсветку скобок хотябы .....?

Можно сделать подсветку и скобок и цифор и стрингов, но почему-то конфигурация не сохраняется после закрытия студии.
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: AVR studio 4 в вопросах и ответах

Сообщение vitalik_1984 »

На семерке нужно сохранить файл конфигурации с правами администратора. Уже где то ранее упоминалось....
А вообще это не подсветка скобок, а расцветка.
Подсветкой я считаю выделение парной скобки при выделении или по приближению курсора проверяемой скобке. Так есть в шестой студии. Мало того, там еще есть автозакрытие новой рукописной скобки! То есть при открытии скобки всё что дальше пишешь уже находится в скобке. В КВавр есть подсветка пары.
Ответить

Вернуться в «AVR»