Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

Книги - библиотека для скачивания. И еще ...

Отправлено avr123.nm.ru 24 февраля 2007 г. 12:39
В ответ на: Есть в эл.виде учебник по прогр. AVR на ассемблере (желательно по русски). Не описание команд, а про их правильное применение (+) отправлено Ivax 24 февраля 2007 г. 10:38

А я советую поставить VMLAB - в нем масса примеров на АСМе.

Запускайте пошаговую симуляцию и смотрите что делает та или иная прога.

Причем проги сопоставлены реальным "железкам". т.е. реально работающая система.

[img]http://pid.by.ru/img/10_min.png[/img][/url]

; ************************************************************
; LDC panel demo / software part
;
; This example include a basic LDC driving library for
; 4 bits interface. Modify it if necessary according
; to your needs. www.pid.by.ru
;
; ************************************************************

.include "..\include\8515def.inc"

.EQU OE = 0b001000 ; bit 3 Port D
.EQU RS = 0b0001004 ; bit 2 Port D

.DEF TEMP = R16 ; temporary working register
.DEF PARAM = R17 ; Parameter transfer register
.DEF DELAY = R10 ;
.DEF DELAY1 = R11 ; To generate long delays
.DEF DELAY2 = R12 ;

.CSEG

; *************************************
;
; Reset and interrupt vectors
;
.ORG 0x00
START:
rjmp RESET ; Reset vector
reti
reti
reti
reti
reti
reti
reti
reti
rjmp UART_RX ; Handle received character
reti
reti
reti
reti
reti

; ****************************************
;
; Device initialization
;
.ORG 0x10
RESET:
ldi TEMP, 0xDF ; Init stack pointer
out 0x3D, TEMP ;

ldi TEMP, 0x17 ; 00010111, setting bits for OC1, PB2 and PB4, PB0
out DDRB, TEMP ; set Port B direction as above
ldi TEMP, 0x28 ; 00101000, PB5 pullup, PB4 lo, PB3 pullup, PB2 lo, OC1 low,
out PORTB, TEMP

out PORTB, TEMP ; set Port B
ldi TEMP, 0xFC ; All outputs except bits 0,1 (UART)
out DDRD, TEMP ;

rcall LCD_SETUP; ; Initialize LCD and send
rcall LCD_HELLO; ; a welcome message

ldi TEMP, 12 ; Set UART 4800 bauds for 1 MHz
out UBRR, TEMP ;
ldi TEMP, 0xF8 ; Activate all interrupts and TX/RCV
out UCR, TEMP ; and go !
sei


FOREVER: ; Endless loop. RX interrupt
nop ; will do the job
nop ;
rjmp FOREVER; ;

UART_RX: ; Read UART chararter and
in PARAM, UDR ; send it to the LCD
rcall LCD_DATA ;
reti


; ===========================
; LCD Driving Library example
; ===========================
;
;***********************************
;
; Display setup for 4 bits interface
;
LCD_SETUP:

ldi TEMP, 10 ; Wait about 20msec after powerup
SET1: ; LCD is a quite slow,
rcall WAIT_2M ; mind delays !
dec TEMP ;
brne SET1 ;

ldi TEMP, 0b00101000 ; Set 4 bit interface (but we are
out PORTD, TEMP ; still in 8 bits!)
nop
nop ; Data write cycle must be > 1 ms
cbi PORTD, 3 ; OE low to clock in data
rcall WAIT_2M ;

; *** !! From now on, interface is 4 bits !! ***

ldi PARAM, 0b00101000 ; Send again to catch the bit N
rcall LCD_CMD ; Display is 2 lines, so N = 1

ldi PARAM, 0b00001000 ; Display off, cursor off, and blink off
rcall LCD_CMD

ldi PARAM, 0b00000001 ; Display clear
rcall LCD_CMD
rcall WAIT_2M ; Wait 2 sec after clear

ldi PARAM, 0b00000110 ; Increment RAM, dont shift display
rcall LCD_CMD
ldi PARAM, 0b00001110 ; Display on, cursor on / blink off
rcall LCD_CMD
ret


; **************************
;
; 2.3 ms delay with 1 MHz clock.
;
WAIT_2M:
push TEMP
ldi TEMP, 3
mov DELAY1, TEMP
W2_1:
clr DELAY2
dec DELAY2 ; Start at 0xFF
W2_2:
dec DELAY2
brne W2_2
dec DELAY1
brne W2_1
pop TEMP
ret

;****************************************************
;
; Display a welcome message. Mesage comes at the end
; and must be NULL ended
;
LCD_HELLO:

ldi ZH, HIGH(2*TXT)
ldi ZL, LOW(2*TXT)

L3A:
lpm ; From prog mem into R0
mov PARAM, R0
tst PARAM
brne L3B
rjmp L4
L3B:
cpi PARAM, 0x0D ; Look for CR in message (new line)
brne L3C
ldi PARAM, 0xC0 ; Cursor to position 0x40, start of 2nd line
rcall LCD_CMD ; Sends command
rjmp L3D

L3C:
rcall LCD_DATA
L3D:
adiw ZL, 1 ; Increment pointer. This neat instruction does
rjmp L3A ; w16 bit addition to pointer ZHI:ZLO.


L4:
ret ; Done

TXT:
.DB "Type in TTY cell (tx) ",0x0D ; Must contain an even
.DB ">",0x00 ; number of bytes per line


;********************************************************
;
; Sends a control function to the display (comes in PARAM)
;
LCD_CMD:

push PARAM
mov TEMP, PARAM
andi PARAM, 0xF0 ; Mask off lower 4 bits
sbr PARAM, 8 ; OE bit high (bit 3)
out PORTD, PARAM ; Send upper 4 bits to display
nop ; Brief delay to give reasonable OE
nop ; pulse width
cbi PORTD,3 ; OE goes low to clock in data

mov PARAM, TEMP ; Data back
swap PARAM ; Lower 4 bits
andi PARAM, 0xF0
sbr PARAM, 8 ; OE high (bit 3, port D)
out PORTD, PARAM ; Write lower 4 bits to LCD
nop
nop
cbi PORTD,3 ; OE clock low

ldi PARAM, 100 ; 50 usec approx
DEL0:
dec PARAM
brne DEL0
pop PARAM
ret


;*******************************************************
;
; Sends an ASCII character to the display (comes in PARAM)
;
LCD_DATA:

push PARAM
push TEMP
mov TEMP, PARAM
andi PARAM, 0xF0 ; Mask off lower 4 bits
sbr PARAM, OE ; OE bit high
sbr PARAM, RS ; Data/command bit high
out PORTD, PARAM ; Write upper 4 bits to display
nop ; Brief delay
nop
cbi PORTD, 3 ; OE low to clock data

swap TEMP ; Lower 4 bits
andi TEMP, 0xF0 ; Masked off
sbr TEMP, OE ; OE high
sbr TEMP, RS
out PORTD, TEMP ; Lower 4 bits to LCD
nop
nop
cbi PORTD, 3 ; OE low to clock data

ldi TEMP, 100
mov DELAY, TEMP ; 50 usec
DEL1:
dec DELAY
brne DEL1
pop TEMP
pop PARAM
ret

;**********************************************************
;
; Moves the LCD display cursor to address specified in PARAM
;
LCD_CURSOR:

ori PARAM, 0x80 ; MSB specifies address command
rcall LCD_CMD
ret

====

Исходники имеют построчные комментарии.


Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
скольким Омам равен эквивалент двух резисторов по 10 Ом, соединённых параллельно?:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru