Вы не вошли.
Можно и так. Работая на Си почти всё равно, какая платформа. Я вот тоже к старости ленивый стал, раньше писал всё на асме, а сейчас последние проекты все на Си
Вне форума
Ну вот! Не успел Уго Чавес похвалить батьку Лукашенко за успехи в ненависти к "всемирной империи зла", как Лив на старость начал косить и на пенсию проситься.
Почему когда мы нарушаем, нас штрафуют, а когда всё делаем правильно, с нас берут налоги?....
Вне форума
██████
██████
██████
Отредактировано Liv (26.07.2006 10:20:18)
Вне форума
2 Liv. Один добрый человек дал мне AVRStudio. Кроме того, что он добрый, он еще и умный, жаль тока у нет времени (а может и желания) учить меня, идиота...
Можем попытаться ветку переименовать
Еще я прочитал ссылку, которую вы давали, чего-то там avr123. Блин, это ж надо так напряжно писать!!! У меня после первой страницы заболела голова. Даже даташиты вражеские легче читаются.
Но вернемся к нашим баранам. Как я и говорил, вопросы остались. Те же самые. Да кроме того добавились еще. AVR имеет другую систему команд, но тут ладно, разберемся. Я совершенно не знаком с ассемблером как таковым. Насколько я понимаю, имеются три важных вещи. 1 - команды самого МК, 2 - директивы ассемблера и 3 - какие-то псевдооператоры (жуть...). При написании программы при помощи директив объявляются сегменты кода, данных и т.д. Для чего это нужно?? Не нужно отвечать "для резервирования в памяти места под данные" (к примеру) путано и нифига не ясно, для чего это может пригодиться в реальности. Хотелось бы видеть пример какой-нибудь простой програмки (типа той, чтоя выше писал), но написанной по всем правилам, чтоб компилятор не давал ошибок. А то у меня ругается даже на .CSEG, говорит неверный синтаксис, хотя пишу один к одному как в хелпе.
Через тернии в дебри, как говориться...
Буду признателен, если поможете....
......There is someone in my head, but it's not me.......
Вне форума
Вот набросал программку и проверил на железе, всё работает. Постарался продемонстрировать все основные моменты. Хотя местами дурной стиль (типа явных констант, а не вычисленных препроцессором), но в качестве первой программы сойдет.
;----------------------------------------------------------------------------
;Программа мигания светодиодом
;Микроконтроллер: AT90S2313
;Частота кварца: 10 МГц
;----------------------------------------------------------------------------
.include "2313def.inc" ;подключаем файл описания регистров
;----------------------------------------------------------------------------
;Константы:
.equ LED_DEL = 76 ;значение задержки в интервалах таймера 0
;----------------------------------------------------------------------------
;Определение портов:
.equ LED_PORT = PORTB ;светодиод будет на порту B
.equ LED_PIN = PB0 ;светодиод подключен к выводу PB0
;----------------------------------------------------------------------------
;Глобальные регистровые переменные:
.def temp = r16 ;временный регистр temp
;----------------------------------------------------------------------------
.DSEG ;сегмент данных, будем описывать переменные в ОЗУ
LedTmr: .byte 1 ;программный таймер светодиода (1 байт)
;----------------------------------------------------------------------------
.CSEG ;дальше идет программа, переходим в сегмент кода
;----------------------------------------------------------------------------
;Векторы прерываний:
.org 0 ;по адресу 0 вектор сброса
rjmp Init ;переход на основную программу
.org OVF0addr ;по адресу OVF0addr вектор прерывания по
rjmp Timer ;переполнению таймера 0
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
;Программа начинает выполняться отсюда:
;Здесь пишем всякую инициализацию, которая должна
;выполняться один раз при старте программы.
Init: ldi temp,RAMEND ;константа RAMEND определена в 2313def.inc
out SPL,temp ;инициализируем стек
;Настройка портов:
ldi temp,0xFF ;загружаем в temp FF
out DDRB,temp ;настраиваем порт B на вывод
out DDRD,temp ;настраиваем порт D на вывод
;Инициализация переменных:
ldi temp,LED_DEL
sts LedTmr,temp ;загружаем в переменную значение LED_DEL
;Настройка оборудования:
ldi temp,(1<<CS02) ;предделитель таймера CK/256
out TCCR0,temp ;записываем в регистр TCCR0
ldi temp,(1<<TOIE0) ;бит TOIE0 равен единице, остальные нули
out TIMSK,temp ;разрешаем прерыв. по переполн. таймера 0
sei ;общее разрешение прерываний
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
;Основной цикл программы:
;То, что написано в этом цикле, будет выполняться
;до бесконечности:
Main: lds temp,LedTmr ;загружаем в temp переменную LedTmr
tst temp ;проверяем значение
brne NoDeal ;если не ноль, то все пропускаем
rcall Toggle ;если ноль, то вызываем Toggle
ldi temp,LED_DEL ;и
sts LedTmr,temp ;перезагружаем LedTmr
NoDeal: rjmp Main ;цикл
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
;Всё, дальше идут всякие подпрограммы.
;----------------------------------------------------------------------------
;Подпрограмма переключения состояния светодиода:
Toggle: sbis LED_PORT,LED_PIN ;проверяем состояние порта светодиода
rjmp On ;если был выключен, переход на включение
Off: cbi LED_PORT,LED_PIN ;выключение светодиода
rjmp TglRet ;переход на ret
On: sbi LED_PORT,LED_PIN ;включение светодиода
TglRet: ret
;----------------------------------------------------------------------------
;Обработчик прерывания таймера 0:
;Таймер 0 имеет разрядность 8 бит, т.е. переполнение происходит
;каждые 256 тактов. Учитывая то, что предделитель таймера
;мы запрограммировали на CK/256, то таймер будет переполняться
;каждые 65536 периодов частоты кварца. Если частота кварца
;10 МГц (период 0.1 мкс), то период переполнений таймера равен
;6.5536 мс. Это значение, умноженное на число, загружаемое в
;LedTmr даст время полупериода мигания светодиода.
Timer: push temp ;сохранение регистра temp
in temp,SREG ;temp <- SREG
push temp ;сохранение SREG
lds temp,LedTmr ;загружаем в temp переменную LedTmr
tst temp ;проверяем значение
breq Ovf ;если ноль, ничего не делаем
dec temp ;иначе temp - 1
sts LedTmr,temp ;сохраняем новое значение
Ovf: pop temp ;восстановление SREG
out SREG,temp ;SREG <- temp
pop temp ;восстановление регистра temp
reti ;выход из обработчика и разрешение прерываний
;----------------------------------------------------------------------------
;Типа всё.
Вне форума
Ой, спасибо!! Буду разбираться! Попробую!
......There is someone in my head, but it's not me.......
Вне форума
Вот текущие рейтинги:
electronix.ru/forum/index.php?showtopic=449&st=0
electronix.ru/forum/index.php?showtopic=15289&st=0
electronix.ru/forum/index.php?showtopic=447
А вообще то в "Радиохобби" был цикл статей по AVR + WinAVR
Отредактировано Vasil (26.07.2006 08:17:28)
Вне форума
Вот что советуют читать по AVR (и не только) на Телесистемах:
lord-n.narod.ru/walla.html
valvolodin.narod.ru/books.html (зеркало: valvol.by.ru/books.html)
trigger.h1.ru/books/books.htm
dmitriks.narod.ru/books/books.html
natahaus.ru/category/hardware/ ( логин\пасс - real13\natareal13)
www.giuciao.com/books/sort.php?by=Engineering
www.electromania.ro/download/carti//index.php
www.eecg.toronto.edu/~kphang/papers1.htm
www.pcports.ru/Library.php
all-ebooks.com/
Вне форума
а книжка по Микрокапу-7 есть где?, а тоя чета не нашол....
Вне форума
Кто-нибудь знает, как сбросить AVRStudio на установки по умолчанию?? Я поппытался поменять шрифт, теперь курсор находиться не в том месте, где вводиться символ, а несколько впереди, причем чем правее по строке тем это расстояние увеличивается. Слова друг на друга налезают, появляются какие-то левые символы... работать невозможно. Раньше все было ок. Переустановка не помогает.
......There is someone in my head, but it's not me.......
Вне форума
[ Сгенерировано за 0.038 сек, 7 запросов выполнено - Использовано памяти: 626.58 Кбайт (Пик: 676.95 Кбайт) ]