Страница 5 из 8

Re: Микроконтроллер от и до.......

Добавлено: Ср янв 12, 2011 20:54:07
путник
Доюрого времени.
YS писал(а):mr december[/b], заучивать сразу все команды совершенно необязательно. Некоторые из них вообще используются преимущественно компиляторами языков высокого уровня. Перечисленного списка хватит Вам пока за глаза и за уши.
А говорили за глаза и за уши, в этом коде есть команда def и метка cseg. Значение org не определил.

Что бы зажеч св-ды по порядку.

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

.include "2313def.inc" ; библиотека 2313

.def t=R16 ;присваиваем регистру R16 символическое имя t
.def t=R17 ;
.......
.def t=R23

.cseg ;собираемся писать код
.org 0 ;размещаем первую команду в начале памяти

  ldi   r16,   0b10000000 ;первый
  ldi   r17,   0b11000000 ;
  ......
  ldi   r23,   0b11111111 ;
 
   out DDRB,t ;конфигурируем порт на выход

   out portB,t ;зажигаем светодиоды

LOOP:       ;этот пустой бесконечный цикл нужен для однозначноcти завершения программы

  rjmp LOOP
Для бегущ св-да

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

 ldi   r16,   0b10000000 ;первый
  ldi   r17,   0b01000000 ;
  ......
  ldi   r23,   0b00000001 ;
  ldi   r22,   ob00000010 ;
  ......
  ldi   r16,   0b10000000 ;


Какая команда для повторения цикла бег. св-ов.

Спасибо.

Re: Микроконтроллер от и до.......

Добавлено: Ср янв 12, 2011 21:01:20
YS
Нет, Вы не поняли принципа...
команда def и метка cseg. Значение org не определил.
.def это не команда. Все перечисленное - директивы препроцессора.

По поводу огоньков - читаем начиная отсюда и далее (в конце каждой страницы есть ссылка "дальше"): http://radiokot.ru/start/mcu_fpga/avr/05/

Re: Микроконтроллер от и до.......

Добавлено: Ср янв 12, 2011 21:04:05
путник
Gudd-Head писал(а): Конечно понимаю, хороший стиль указывать что, как и куда. Но в первый раз можно ведь и без этого?!?
Я считаю что надо сразу писать с коменариями, так легче на будущее.

Re: Микроконтроллер от и до.......

Добавлено: Ср янв 12, 2011 21:14:17
Gudd-Head
mr december писал(а):Я считаю что надо сразу писать с коменариями, так легче на будущее.
Я имел в виду не комменты, а директивы компилятору .cseg .org 0

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

.def t=R16 ;присваиваем регистру R16 символическое имя t
.def t=R17 ;
.......
.def t=R23
Бред. Какой смысл присваивать всем регистрам одно и то же имя???

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

  ldi   r16,   0b10000000 ;первый
  ldi   r17,   0b11000000 ;
  ......
  ldi   r23,   0b11111111 ;
Тем более что дальше оно нигде не используется?
Какая команда для повторения цикла бег. св-ов.
У вас же выше цикл LOOP написан.

Re: Микроконтроллер от и до.......

Добавлено: Ср янв 12, 2011 21:45:45
DX168B
mr december Вы назначили одно и то же имя "t" трём регистрам.
.def(от англ. "define" - определить) - это команда не микроконтроллеру, а компилятору. Такие команды называют директивами препроцессора. К ним так же относятся:
.include "filename.inc" - включить заголовочный файл с описаниями регистров конкретного МК
.cseg - указание компилятору, что всё, что ниже - является по сути программой МК для Flash
.dseg - указание компилятору, что тут будут описываться имена ячейкам и массивам ОЗУ.
.eseg - указание компилятору, что тут будут располагаться данные для EEPROM.
.org 0x0XXX(адрес в ПЗУ, ОЗУ или в EEPROM) - указание компилятору, что все строки ниже этой директивы будут располагаться начиная с указанного адреса и далее.
.def - назначить или определить. Например:

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

.include "tn2313def.inc"
;----------------------------------
.def  temp  = R16 ; Назовём регистр r16 именем temp.
; Теперь вместо r16 мы можем писать temp.
;----------------------------------
.cseg
.org 0x0000
ldi  temp,   0xFF ; или 0b11111111
out  DDRB,   temp
ldi  temp,   0x0F ; Или 0b00001111
out  PORTB,  temp ; зажигаем первые 4 светодиода.
.equ - практически тоже самое, что и .def
.db - байтовый массив.
.dw - массив слов. (в основном массив меток имеющихся в программе)
Используется в основном для косвенных переходов через регистровые пары с использованием команд icall и ijmp.
.byte XX - выделение определённого количества байт в ОЗУ. Например:

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

.dseg
buffer:   .byte  10 ; Выделим 10 ячеек(байтов) в ОЗУ под имя buffer

Re: Микроконтроллер от и до.......

Добавлено: Ср янв 12, 2011 21:50:48
путник
Gudd-Head писал(а):У вас же выше цикл LOOP написан.
Я почему то подумал, что это завершение программы. Цикл другой

строка 1
строка 2
строка 3

команда возврата к строке 1.
Gudd-Head писал(а):.def t=R16 ;присваиваем регистру R16 символическое имя t
.def t=R17 ;
.......
.def t=R23

Бред. Какой смысл присваивать всем регистрам одно и то же имя???
Код:
ldi r16, 0b10000000 ;первый
ldi r17, 0b11000000 ;
......
ldi r23, 0b11111111 ;

Тем более что дальше оно нигде не используется?


Это мое мышление, но похоже я сильно ошибся.

Re: Микроконтроллер от и до.......

Добавлено: Ср янв 12, 2011 21:55:48
Gudd-Head
mr december писал(а):Я почему то подумал, что это завершение программы. Цикл другой
строка 1
строка 2
строка 3
команда возврата к строке 1.
Нет, это именно цикл. Вам надо сделать так:

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

Метка:
строка 1 
строка 2
строка 3 
rjmp Метка
Где Метка - это ссылка на область кода, адрес которой вычислит компилятор и потом вставит в команду rjmp. В предыдущем примере Метка = LOOP.

Re: Микроконтроллер от и до.......

Добавлено: Ср янв 12, 2011 22:06:49
путник
Мона так

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

.def temp r16
.def temp1 r17
.def temp2 r18
или эта ошибка. Как тогда зажечь св-ды по очереди?

Re: Микроконтроллер от и до.......

Добавлено: Ср янв 12, 2011 22:17:02
DX168B
Это уже вернее, но Вы забыли добавить = между именем и регистром.
Вот правильный вариант:

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

.def  temp   = r16
.def  temp1  = r17
.def  temp2  = r18
А зажечь светодиоды можно так:
Разберём один байт:
0b00001111

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

__________________
|128| 64| 32| 16|  8|  4|  2|  1|
---------------------------------
| 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 |
---------------------------------
Чтобы получить нам например 0b00000011 из 0b00000001
Нам надо прибавить 2 к 0b00000001
Чтобы получить нам например 0b00000111 из 0b00000011
Нам надо прибавить 4 к 0b00000011
Делается это так:

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

.include "tn2313def.inc"
;--------------------------
.def temp0  = r16
.def temp1  = r17
;--------------------------
.cseg
.org 0x0000
ldi temp0, Low(ramend) ; Указываем адрес конца ОЗУ
out SPL, temp0   ; Это инициализация стека. Без неё не будет работать команда rcall
ldi  temp0, 0b11111111
out  DDRB,  temp0 ; настроим порт Б на выход.
;------------------------
LOOP:
ldi  temp0, 0b00000001
out  PORTB,  temp0 ; зажигаем первый светодиод.

ldi  temp1, 2
add  temp0, temp1 ; прибавим 2 из temp1 к 0b00000001 из temp0
; В итоге в temp0 получится 0b00000011
rcall DELAY ; вызовем подпрограмму задержки на исполнение.
; как она закончится, вернёмся суда. 
out  PORTB,  temp0 ;Отправим после задержки в портб обновлённое значение 
; этим мы зажжём следующий светодиод

ldi  temp1, 4
add  temp0, temp1 ; прибавим 4 из temp1 к 0b00000011 из temp0
; В итоге в temp0 получится 0b00000111
rcall DELAY ; вызовем подпрограмму задержки на исполнение.
; как она закончится, вернёмся суда. 
out  PORTB,  temp0 ;Отправим после задержки в портб обновлённое значение 
; этим мы зажжём следующий светодиод

ldi  temp1, 8
add  temp0, temp1 ; прибавим 8 из temp1 к 0b00000111 из temp0
; В итоге в temp0 получится 0b00001111
rcall DELAY ; вызовем подпрограмму задержки на исполнение.
; как она закончится, вернёмся суда. 
out  PORTB,  temp0 ;Отправим после задержки в портб обновлённое значение 
; этим мы зажжём следующий светодиод

ldi  temp1, 16
add  temp0, temp1 ; прибавим 16 из temp1 к 0b00001111 из temp0
; В итоге в temp0 получится 0b00011111
rcall DELAY ; вызовем подпрограмму задержки на исполнение.
; как она закончится, вернёмся суда. 
out  PORTB,  temp0 ;Отправим после задержки в портб обновлённое значение 
; этим мы зажжём следующий светодиод

ldi  temp1, 32
add  temp0, temp1 ; прибавим 32 из temp1 к 0b00011111 из temp0
; В итоге в temp0 получится 0b00111111
rcall DELAY ; вызовем подпрограмму задержки на исполнение.
; как она закончится, вернёмся суда. 
out  PORTB,  temp0 ;Отправим после задержки в портб обновлённое значение 
; этим мы зажжём следующий светодиод
; Дальше продолжи сам c числами 64 и 128

rjmp LOOP
;-----------------------------------
DELAY:   ;это подпрограмма задержки
dec r18
brne DELAY
dec r19
brne DELAY
dec r20
brne DELAY
dec r21
brne DELAY
ret ;Выходим из задержки
Можно сделать и так:

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

.include "tn2313def.inc"
;--------------------------
.def temp0  = r16
;--------------------------
.cseg
.org 0x0000
ldi temp0, Low(ramend) ; Указываем адрес конца ОЗУ
out SPL, temp0   ; Это инициализация стека. Без неё не будет работать команда rcall
ldi  temp0, 0b11111111
out  DDRB,  temp0 ; настроим порт Б на выход.
ldi  temp0, 0b00000000
out PORTB, temp0 ;Гасим на всякий порт Б
;------------------------------------
LOOP:
sbi PORTB, 0 ;зажигаем 1й светодиод
rcall  DELAY ; вызовем задержку
sbi PORTB, 1 ;зажигаем 2й светодиод
rcall  DELAY ; вызовем задержку
sbi PORTB, 2 ;зажигаем 3й светодиод
rcall  DELAY ; вызовем задержку
sbi PORTB, 3 ;зажигаем 4й светодиод
rcall  DELAY ; вызовем задержку
sbi PORTB, 4 ;зажигаем 5й светодиод
rcall  DELAY ; вызовем задержку
sbi PORTB, 5 ;зажигаем 6й светодиод
rcall  DELAY ; вызовем задержку
sbi PORTB, 6 ;зажигаем 7й светодиод
rcall  DELAY ; вызовем задержку
sbi PORTB, 7 ;зажигаем 8й светодиод
rcall  DELAY ; вызовем задержку
out PORTB, temp0 ;гасим все светодиоды (мы уже кинули в начале 0b00000000 в temp0)
rjmp LOOP ;вернёмся в начало
;-----------------------------------
DELAY:   ;это подпрограмма задержки
dec r18
brne DELAY
dec r19
brne DELAY
dec r20
brne DELAY
dec r21
brne DELAY
ret ;Выходим из задержки
P.S. Если нет AVR Studio, то советую скачать. Неплохая среда разработки.
Изображение

Re: Микроконтроллер от и до.......

Добавлено: Чт янв 13, 2011 23:09:14
путник
Доброго времени.

AVR Studio скачена еще с первых постов, еще изучаю.

Что обозначает стрелочка и вкладки processor, build, message, find in files, breakpoint and tracepoints.

Спасибо.

Re: Микроконтроллер от и до.......

Добавлено: Чт янв 13, 2011 23:15:58
DX168B
Зелёная стрелочка - запуск отладки программы.
biuld - скомпилировать.
build and run - скомпилировать и запустить программу на отладку.
messages - сообщения, выводимые в ходе работы AVR Studio.
breakpoint - точка останова. Очень полезная штука в ходе отладки программы.
А вообще, есть тема, касающаяся AVR Studio.

AVR Studio 4 в вопросах и ответах.

Re: Микроконтроллер от и до.......

Добавлено: Пт янв 21, 2011 16:44:21
путник
Доброго времени.

Помогит прошить AT90S2313. AVR Studio выдает ошибку, прошивал два раза. Прошил - ошибка, стер - прошил - ошибка(так мона и загубить МК). Стал искать инфу по МК, что то все его ругают. Какая правильная плата адаптера (собирал эту http://www.radiokot.ru/start/mcu_fpga/avr/03/). Винете их много, какой нужен кварц для работы МК(у меня поставлен на 4 МГц).

Спасибо.

Да. В чем разница "delay" и "my delay"

Re: Микроконтроллер от и до.......

Добавлено: Вт янв 25, 2011 10:09:15
путник
Доброго времени.

Где же Вы учителя, помогит разобраться с AT90S2313 (другого нет).

Спасибо.

Re: Микроконтроллер от и до.......

Добавлено: Вт янв 25, 2011 12:42:15
DX168B
Как я понял, у Вас есть LPT порт. Так?

Re: Микроконтроллер от и до.......

Добавлено: Вт янв 25, 2011 21:24:53
путник
Доброго времени.

У меня ноутбук, только USB.
mr december писал(а): Однажды собрал прогер AVR 910. Повторил схему, прикольно, работает. К схеме была прошивка.
По указанной ссылки собрал адаптер.

Из описания на МК.

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

Полностью статический режим работы:
    От 0 до 10 МГц, при питании от 4.0 В до 6.0 В
    От 0 до 4 МГц, при питании от 2.7 В до 6.0 В
Питал 4,5 В кварц 4МГц.

Спасибо.

Re: Микроконтроллер от и до.......

Добавлено: Вт янв 25, 2011 23:23:01
Gudd-Head
mr december писал(а):Питал 4,5 В кварц 4МГц.
Здорово :)
Пожалуйста, формулируйте свои вопросы конкретнее, используя слова "ЧТО", "КДЕ", "КОГДА" и т.д. и знак вопроса "?", а то каждый ваш пост больше похож на утверждение, нежели на вопрос. С уважением.

Re: Микроконтроллер от и до.......

Добавлено: Вт янв 25, 2011 23:55:50
путник
Доброго времени.


Gudd-Head, немного выше я просил о помощи. Надо прошить AT90S2313, сделал две попытки(не удачно).

Спасибо.

Re: Микроконтроллер от и до.......

Добавлено: Ср янв 26, 2011 00:32:10
ploop
DX168B писал(а): .include "filename.inc" - включить заголовочный файл с описаниями регистров конкретного МК
Так же, как и включить любой другой файл (например свой). Туда можно засунуть определения регистров, констант, макросов. Здорово разгружает основной листинг, повышая читабельность.

Re: Микроконтроллер от и до.......

Добавлено: Ср янв 26, 2011 02:52:32
DX168B
Начинающему пока и этого хватит. :)
Я конечно большие программы леплю из нескольких файлов.
Обычно вызываемые подпрограммы оформляю в отдельном файле и большие массивы данных в отдельных. Получается где-то так в основном файле:

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

.include "tn26def.inc"
.include "reg_dseg_equals.inc"
.include "eseg_arrays.asm"
.cseg
.org   0x0000
..................
...........
..................
...........
..................
...........
.include "subrutines.asm"
.include "cseg_arrays.asm"
В основном файле лежит сам алгоритм программы, векторы и обработчики прерываний. Всё остальное располагаю в отдельных файлах.
Адресное расположение и порядок включаемых частей во флеше не указываю (.org 0x0XXX), так как компилятор не тупой и всё правильно делает.

Re: Микроконтроллер от и до.......

Добавлено: Чт янв 27, 2011 00:52:54
путник
Доброго времени.

Есть прогер AVR910, адаптер на МК AT90S2313.
Прошивал два раза (не удачно), AVR Studio выдает ошибку.
Питание на адатер отдельное 4,5 В кварц на 4МГц
Что не так? Почему ошибка?

Спасибо.