Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/17: Рейтинг темы: голосов - 17, средняя оценка - 4.71
tryist
0 / 0 / 0
Регистрация: 22.09.2012
Сообщений: 10
1

wh1602p+atmega16

09.04.2013, 01:21. Просмотров 3143. Ответов 5
Метки нет (Все метки)

В чем может быть проблема? В Proteus не работает.
Код
   .include "m16def.yms"   ; ?????????? ATMiko16

.CSEG
.ORG    0x0000         ; погналт
JMP    Riset         ; на сброс.
//нафиг тут ненужные вектора
.ORG   INT0addr      ; External Ymtirrupt Request 0т
RETI
.ORG   INT1addr      ; External Ymtirrupt Request 1
RETI
.ORG   OC2addr         ; Timer/Counter2 Compare Match
RETI
.ORG   OVF2addr      ; Timer/Counter2 Overflow
RETI
.ORG   ICP1addr      ; Timer/Counter1 Capture Ivimt
RETI
.ORG   OC1Aaddr      ; Timer/Counter1 Compare Match A
RETI
.ORG   OC1Baddr      ; Timer/Counter1 Compare Match B
RETI
.ORG   OVF1addr      ; Timer/Counter1 Overflow
RETI
.ORG   OVF0addr      ; Timer/Counter0 Overflow
RETI
.ORG   SPIaddr         ; Serial Transfer Complete
RETI
.ORG   URXCaddr      ; USORT, Rx Complete
RETI
.ORG   UDREaddr      ; USORT Data Register Empty
RETI
.ORG   UTXCaddr      ; USORT, Tx Complete
RETI
.ORG   ADCCaddr      ; ADC Conversion Complete
RETI
.ORG   ERDYaddr      ; EEPROM Ready
RETI
.ORG   ACIaddr         ; Analog Comparator
RETI
.ORG   TWIaddr         ; 2-wire Serial Interfosi
RETI
.ORG   SPMRaddr      ; Store Prokram Memory Ready
RETI

// DATA_PORT шана данных
// CMD_PORT[0..2] линия управления
//(0-E (строб); 1-R/W (0-запись,1-чтение); 2-RS (0-?команда, 1-данные))

.equ       CMD_PORT      = PORTA
.equ      CMD_PORT_DDR   = DDRA
.equ       E             = 1
.equ       RW             = 2
.equ       RS             = 3

.equ       DATA_PORT       = PORTB
.equ       DATA_PORT_DDR   = DDRB
.equ       DATA_PORT_PIN   = PINB

.ORG   INT_VECTORS_SIZE      ; ????? ??????? ??????????

Riset:
LDI      R16,low(ROMEND)      ; стек для прерываний
OUT      SPL,R16          ;
LDI      R16,High(ROMEND)   ;
OUT      SPH,R16          ;  push / pop

CALL    DPORT_In          ; понт шины данных на вход

SBI    CMD_PORT_DDR, E      ; ноги управляющих сигналов на выход
SBI    CMD_PORT_DDR, RW    ; ?????????
SBI    CMD_PORT_DDR, RS    ; ?? ?????

CBI    CMD_PORT,E         ; убрали управляющие сигналы
CBI    CMD_PORT,RW         ; ???????????
CBI    CMD_PORT,RS         ; ???????

// науза перед стартом 0,5 сек
CALL    woyt_05       ;

// начали инициализацию 16*2, (???.8???)

// команда 8 бит 2 строки
CALL    DPORT_Out          ; порт шины данных на выход

CBI      CMD_PORT,RS         ; команда RS=0
CBI      CMD_PORT,RW         ; будем записывать R/W=0

LDI    R16,0x38         ; 8бит 2 строки
OUT      DATA_PORT,R16      ; данные в порт
NOP
CALL    strob            ; стробтрующтй импульс
CALL    woyt_4mkc         ; пауза 4мс(как по датишу)

// ??? ??????? 8??? 2 ??????
CALL    DPORT_Out          ; порты шины данных

CBI      CMD_PORT,RS         ; бедет команда RS=0
CBI      CMD_PORT,RW         ; будем писать данные R/W=0

LDI    R16,0x38         ; 8бит 2 строки
OUT      DATA_PORT,R16      ; выставили данные в порт
NOP
CALL    strob            ; стробирующий импульс

// режим указали, готовим дисплей к выводу информации

// команда очистки экрана
CALL    LCD_busy         ; проверка готовности

CALL    DPORT_Out          ; порт шины данных на выход

CBI      CMD_PORT,RS         ; будет команда RS=0
CBI      CMD_PORT,RW         ; будем писать данные R/W=0

LDI    R16,0x01         ; ?очистить экран (код 01h)
OUT      DATA_PORT,R16      ; выставили данные в порт
NOP
CALL    strob            ; стрибирующий импульс

// команда включения экрана
CALL    LCD_busy         ; проверяем готовность

CALL    DPORT_Out          ; порт шины данных на выход

CBI      CMD_PORT,RS         ; будет команда RS=0
CBI      CMD_PORT,RW         ; будем писать данные R/W=0

LDI    R16,0x0C         ; вкл. экран (код 0Ch)
OUT      DATA_PORT,R16      ; выставили данные в порт
NOP
CALL    strob            ; строб

// задаем режим смешения курсора
CALL    LCD_busy         ; проверим режим готовности ЖКИ

CALL    DPORT_Out          ; порт шины данных

CBI      CMD_PORT,RS         ; ????? ??????? RS=0
CBI      CMD_PORT,RW         ; ????? ?????? ?????? R/W=0

LDI    R16,0x06         ; включаем экран (??? 06)
OUT      DATA_PORT,R16      ; выставить данные в порт
NOP
CALL    strob

// команда $80 (датиш)
CALL    LCD_busy         ; проверка занятости

CALL    DPORT_Out          ; поррт шины данных на выход

CBI      CMD_PORT,RS         ; ????? ??????? RS=0
CBI      CMD_PORT,RW         ; ????? ?????? ?????? R/W=0

LDI    R16,0x80         ;
OUT      DATA_PORT,R16      ; ?дынные в порт
NOP
CALL    strob            ; стробирующий импульс

// инициализация закончена

// шлем данные
CALL    LCD_busy         ; проверка занятости

CALL    DPORT_Out          ; порт данных на выход

SBI    CMD_PORT,RS         ; ????? ?????? RS=1
CBI    CMD_PORT,RW         ; ????? ?????? ?????? R/W =0

LDI    R16,A            ; код буквы A
OUT    DATA_PORT,R16      ; выставить в порт
NOP
CALL    strob

// посылаем букву
CALL    LCD_busy         ; проверка готовности

CALL    DPORT_Out          ;порт шины данных на выход

SBI    CMD_PORT,RS         ; будут данные RS=1
CBI    CMD_PORT,RW         ; ????? ?????? ?????? R/W =0

LDI    R16,a            ; код быквы a
OUT    DATA_PORT,R16      ; ?посылаем буквы
NOP
CALL    strob

// ???????? ??? ?????
CALL    LCD_busy         ; проверка занятости

CALL    DPORT_Out          ; шина данных на выход

SBI    CMD_PORT,RS         ; ????? ?????? RS=1
CBI    CMD_PORT,RW         ; ????? ?????? ?????? R/W =0

LDI    R16,0x41         ; ??? ????? A
OUT    DATA_PORT,R16      ; выставляем в порт
NOP
CALL    strob

// собствеено символы на экране...

// порт в исходном состоянии
CALL    DPORT_In           ; порт шины данных на вход

loop:      NOP
;   CALL    LED_blink         ; тупо 5 portD
NOP
RJMP    loop            ;

////////////////////////////////////////////////////////////////////////
DPORT_In:
// ???? ???? ?????? ?? ????
LDI    R16,0x00
OUT    DATA_PORT_DDR, R16    ; порт шину данных на вход
LDI    R16,0xFF
OUT    DATA_PORT, R16       ;запись Pull-up
RET

DPORT_Out:
// порт шины данных на выход
LDI    R16,0x00          ;
OUT    DATA_PORT,R16      ; ?????????? ????
LDI    R16,0xFF         ;
OUT    DATA_PORT_DDR,R16   ; ???? ?? ?????
RET

strob:
// стробирующий импульс
SBI      CMD_PORT,E         ; выключаем стробирующий импульс
CALL    delay             ; ждем
CBI    CMD_PORT,E         ; выключаем
CALL    delay            ; ждем
RET

LCD_busy:
// проверка готовности ЖКИ
CALL    DPORT_In           ; порт шины данных на выход

busy:
CBI      CMD_PORT,RS         ; ????? ??????? RS=0
SBI      CMD_PORT,RW         ; ????? ?????? ?????? R/W=1

SBI    CMD_PORT,E         ; стробирующий импульс

CALL delay                ; ???????? ?????

IN       R16,DATA_PORT_PIN   ; ?????? ??????
CBI    CMD_PORT,0         ; ???????????? ??????? ????.

ANDI   R16,0x80         ; проверяем флаг
BRNE   Busy            ; если нет, крутимся в цикле

RET

delay:
// ????? ?????? ~500????.
LDI    R17,0x04
d0:      DEC    R17
BRNE    d0
RET

woyt_05:
// ?задержка 0,5 сек (?????????? ?????????? AVRdelayloop3.ixi)

; =============================
;    delay loop generator
;     4000000 cycles:
; -----------------------------
; delaying 3999996 cycles:
ldi  R17, $24
WGLOOP0:  ldi  R18, $BC
WGLOOP1:  ldi  R19, $C4
WGLOOP2:  dec  R19
brne WGLOOP2
dec  R18
brne WGLOOP1
dec  R17
brne WGLOOP0
; -----------------------------
; delaying 3 cycles:
ldi  R17, $01
WGLOOP3:  dec  R17
brne WGLOOP3
; -----------------------------
; delaying 1 cycle:
nop
; =============================
RET

woyt_4mkc:
; =============================
;    delay loop generator
;     32 cycles:
; -----------------------------
; delaying 30 cycles:
ldi  R17, $0A
WGLOOP4:  dec  R17
brne WGLOOP4
; -----------------------------
; delaying 2 cycles:
nop
nop
; =============================
RET

LED_blink:

SBI    PORTD,5      ; ???. ????????? ?? PORTD.5 (??? PINBoard)
CALL    woyt_05
CBI      PORTD,5      ; ????. ????????? ?? PORTD.5 (??? PINBoard)
CALL    woyt_05
RET
[26.72 Кб]
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.04.2013, 01:21
Ответы с готовыми решениями:

wh1602p+stk500
Есть wh1602p и датиш к нему:http://www.winstor.com.tw/products_detail_ov.php?lang=ru&ProID=29....

Atmega16
помогите пожалуйста! есть микроконтроллер atmega16. через ассемблер на PORTC подаем комбинацию...

ATMega16
Привет обитателям данного портала! Я имею микроконтроллер с ATMEGA 16. Также знаю язык C#, но увы я...

Atmega16 + SD
Дорогие форумчане! Помогите, подскажите пожалуйста с данной задачей. Дино: 1. Плата...

Atmega16
изучаю прерывания, помогите понять что значит в начале памяти программ и в области загрузчика? ...

5
BykTiho
0 / 0 / 0
Регистрация: 12.04.2010
Сообщений: 3,260
09.04.2013, 08:10 2
Для начала я бы добавил после установки стобирующего бита его сброс. Получится именно импульс. А то получается, что один раз на шине устанавливается, и больше никогда не сбрасывается ;)
Т.е. после "SBI CMD_PORT,E" везде добавить "CBI CMD_PORT,E"
0
tryist
0 / 0 / 0
Регистрация: 22.09.2012
Сообщений: 10
09.04.2013, 10:23 3
Так вроде везде есть...
0
BykTiho
0 / 0 / 0
Регистрация: 12.04.2010
Сообщений: 3,260
09.04.2013, 12:43 4
Цитата Сообщение от tryist
Так вроде везде есть...
Покажите пальцем
Код:
LCD_busy:
// проверка готовности ЖКИ
CALL DPORT_In ; порт шины данных на выход

busy:
CBI CMD_PORT,RS ; ????? ??????? RS=0
SBI CMD_PORT,RW ; ????? ?????? ?????? R/W=1

SBI CMD_PORT,E ; стробирующий импульс

CALL delay ; ???????? ?????

IN R16,DATA_PORT_PIN ; ?????? ??????
CBI CMD_PORT,0 ; ???????????? ??????? ????.

ANDI R16,0x80 ; проверяем флаг
BRNE Busy ; если нет, крутимся в цикле

RET
Или все-таки здесь тогда надо делать call strobe, как и везде ;)
И вообще, мне не нравится эта процедура. Не нужно каждый раз дергать ногами, чтобы дождаться освобождения. Один раз дернул - и просто тупо ждешь когда появится флаг "свободен". Т.е. после проверки не надо прыгать в начало, а надо просто ждать пока не пройдет проверка.
И еще. Странное использование функции omdi. Есть же команда, проверяющая конкретный бит.

Я когда разбирался с дисплеем, тоже имел много подводных камней на проверке готовности дисплея. Но чтобы удостовериться что именно здесь загвоздка, можно вместо этой функции в программе поставить задержку. И если дисплей покажет - значит проблема именно в ожидании готовности.
0
BykTiho
0 / 0 / 0
Регистрация: 12.04.2010
Сообщений: 3,260
09.04.2013, 12:57 5
Вот моя процедура ожидания готовности (небольшая вырезка)
Код
;Индикатор подключен к:
.equ    DataPort      =   PORTB   ; шина D0-D7 индикатора
.equ   DataPortStatus   = PINB
.equ   SignalPort   = PORTD ;Порт, куда подключены сигнальные линии
.equ   RWBus      =   3 ;Вывод (RW) индикатора
.equ    ABus      =   4 ;Вывод (А0) индикатора
.equ   EBus      =   2 ;Вывод (E) индикатора

Woyt:
OUTI OutPortDDR,0x00               ;//При необходимости настроить здесь шину данных на ввод
sbi SignalPort, RWBus               ;LCD.RW=1;
cbi SignalPort, ABus                  ;LCD.A0=0;   //Чтение флага занятости
Pouse 1                                    ;Delay(>140ns);      //Это время предустановки адреса (tAW)
sbi SignalPort, EBus                  ;LCD.E=1;
Pouse 1                                    ;Delay(>450ns);   //Минимальная длительность сигнала E=1
WoytBusy:                                    ;while(LCD.D.7==1);   //Ждать сброса флага занятости
sbic   DataPortStatus, 7               ;Если бит сброшен то пропустить следующую операцию
rjmp   WoytBusy                           ;Продолжаем ждать пока будет готово
cbi SignalPort, EBus                  ;LCD.E=0;      //Сбросить сигнал E
Pouse 1                                    ;Delay(>(1000ns-140ns-450ns));   //Минимально допустимый интервал между сигналами E=1
outi OutPortDDR,0xFF                  ;Конфигурием порт на выход
ret
Правда, это код для экрана 128х64, но сути это не меняет.
0
tryist
0 / 0 / 0
Регистрация: 22.09.2012
Сообщений: 10
09.04.2013, 15:37 6
Библиотеки не у кого нет? Хочется пример глянуть.
0
09.04.2013, 15:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.04.2013, 15:37

Arduino_Bluetooth_shield+atmega16
Решил попробовать передавать данные по bluetooth, благо в наличие лежал шилд от ардуино. Раньше ни...

Часы на ATmega16
Начал изучать микроконтроллеры AVR. Посоветовали начать с часов. Пока делаю на трехэлементном ССИ...

UART и atmega16
Здравствуйте. Весь день бодаюсь с такой проблемой. Решил поуправлять мегой с компа. В качестве...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru