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

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

Сообщение Kill17 »

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

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

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

Сообщение Kill17 »

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

Сообщение Alexeyslav »

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

Сообщение 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 Теряю надежду, помогите...
Контактная информация:
Реклама
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

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

Сообщение Kill17 »

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

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

Сообщение Alexeyslav »

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

Сообщение 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

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

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

Сообщение Alexeyslav »

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

Сообщение Kill17 »

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

так это -
.org $0000

jmp $1F10

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

Сообщение 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
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

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

Сообщение Kill17 »

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

Сообщение kobzar »

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

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

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

Сообщение mak36999 »

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

Сообщение vitalik_1984 »

kobzar Банальный и не банальный автокомплит можно получить из студии шестой.
Если нужен быстрый IDE пользуемся тем, что есть...
Либо переходим на квавр там даже из истории копирования можно код вставить.
mak36999 писал(а):почему не может войти в программинг мод?
Возможно это происходит из–за того, что у вас запущен дебаггер? Ставьте на паузу, либо оставливайте перед программированием
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Сообщение zero648 »

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

Сообщение vitalik_1984 »

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

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