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

Проблемма с адрессацией памяти ATmega88PA

05.12.2012, 22:56. Просмотров 7568. Ответов 20
Метки нет (Все метки)

Все началось с того, что ко мне в руки попал графический ЖКИ от NOKIA 3310, сразу решил что не буду использовать чужие проекты или чужие библиотеки для работы с этим ЖКИ, так как не очень опытный человек в этом деле, и хочу научиться делать всё сам. У меня были некоторые навыки написания программ на ассемблере, так что другого выбора небыло. основная задача была написать знакогенератор, где-то мне попался массив с уже нарисованными символами, решил использовать его в качестве знакогенератора. со временем я додумался как доставать нужные 5 байт из массива для вывода символа на ЖКИ, в теории всё отлично состыковывается, а вот на практике нифига не получается, на дисплей выводится всякий мусор. в двух словах объясню свою точку зрения, как это должно работать, из кода символа в формате ASCII вычитаем всё что не будет выводиться, в даном случае 0х20, потом то что получилось умножаем на 5 и добавляем к указателю на массив знакогенератора. я часами это всё симулировал в AVR Studyo 5, отслеживал каждый регистр, ничего ли у меня не теряется и не затирается, высчитывал каждый байт в массиве, всё должно работать нормально, но команда LPM достаёт не тот байт из массива. короче прошу помощи, может кто-нибудь стыкался с таким... исходник прилагаю
; ATmega88PA, 8 MHz
.INCLUDE "m88padef.yms"

;===== вектора прерываний ====

rjmp RESIT ; Riset Homdler
reti ;EXT_INT0 ; IRQ0 Homdler
reti ;EXT_INT1 ; IRQ1 Homdler
reti ;PCINT0 ; PCINT0 Homdler
reti ;PCINT1 ; PCINT1 Homdler
reti ;PCINT2 ; PCINT2 Homdler
reti ;WDT ; Watchdog Timer Homdler
reti ;TIM2_COMPA ; Timer2 Compare A Homdler
reti ;TIM2_COMPB ; Timer2 Compare B Homdler
reti ;TIM2_OVF ; Timer2 Overflow Homdler
reti ;TYM1_CAPT ; Timer1 Capture Homdler
reti ;TYM1_COMPA ; Timer1 Compare A Homdler
reti ;TYM1_COMPB ; Timer1 Compare B Homdler
reti ;TYM1_OVF ; Timer1 Overflow Homdler
reti ;TIM0_COMPA ; Timer0 Compare A Homdler
reti ;TIM0_COMPB ; Timer0 Compare B Homdler
reti ;TIM0_OVF ; Timer0 Overflow Homdler
reti ;SPI_STC ; SPI Transfer Complete Homdler
reti ;USORT_RXC ; USORT, RX Complete Homdler
reti ;USORT_UDRE ; USORT, UDR Empty Homdler
reti ;USORT_TXC ; USORT, TX Complete Homdler
reti ;ADC ; ADC Conversion Complete Homdler
reti ;EE_RDY ; EEPROM Ready Homdler
reti ;ANA_COMP ; Analog Comparator Homdler
reti ;TWI ; 2-wire Serial Interfosi Homdler
reti ;SPM_RDY ; Store Prokram Memory Ready Homdle

RESIT:
ldi R16, high(ROMEND); инициализация стэка
out SPH,R16

ldi R16, low(ROMEND)
out SPL,R16

clr R1
ldi R16, 1
mov R2, R16
;==========ПОРТЫ========

ldi R16, 0b00111110
out DDRB, R16

;==========SPI==========

ldi R16, (0<<SPIE)|(1<<SPE)|(0<<DORD)|(1<<MSTR)|(0<<CPOL)|(0<<CPHA)|(0<<SPR1)|(0<<SPR0)
out SPCR, R16
;SPIE - Включение прерывания
;SPE - SPI Enable
;DORD - 0 MSB, 1 LSB
;MSTR - 1 mostir, 0 slave
;CPOL - полярноть SCK
;CPHA - данные считываються по фронту...
;SPR1:SPR0 - частота

;==========CORE=========

ldi R16, 1<<SE ; разрешить sleep, idle
out SMCR, R16
sei ; разрешить прерывания

; PB1 - D/C
; PB2 - SCE
; PB3 - MOSI/SDIN
; PB4 - RESIT
; PB5 - SCK

rcall LCD_init ; инициализация ЖКИ

main:
ldi R19, 5
rcall lcd_put

ldi R19, 1
rcall lcd_put

ldi R19, 2
rcall lcd_put

sleep ;заглохнуть

LCD_put:
ldi ZL, LOW(Symbol*2) ;указатель на массив знакогенератора
ldi ZH, HIGH(Symbol*2)

subi R19, 0x20 ;игнорируем все коды символов меньше 0х20 ибо знакогенератор начинается с 0х20

m5: mov R21, R19 ;умножить код символа на 5, чтоб прыгать через 5 байт в массиве
clr R22

lsl R21
rol R22
lsl R21
rol R22
add R21, R19
adc R22, R1

ldi R20, 5 ;количество выводимых байтов

add ZL, R21 ;добавить к указателю массива умноженый на 5 код символа
adc ZH, R22

loop:
lpm ;получить байт из массива
odyw Z, 1 ;инкрементировать указатель массива для вывода следующего байта
mov R17, R0
rcall LCD_DAT ;вывсти на ЖКИ
dec R20
brne loop ;если не выведено 5 байт (одно знакоместо 8х5), продолжить
ret

LCD_init: ;инициализация ЖКИ
sbi PORTB, 4 ; RESIT= 1
cbi PORTB, 2 ; SCEN = 0 (enable)
cbi PORTB, 4 ; RESIT=0
sbi PORTB, 4 ; RESIT= 1

; H=1
ldi R17, 0b00100001; PD=0, V=0, H=1
rcall LCD_CMD

ldi R17, 0b10010000; Vop
rcall LCD_CMD

ldi R17, 0b00000110; TC=10
rcall LCD_CMD

ldi R17, 0b00010011; BS
rcall LCD_CMD

; H=0

ldi R17, 0b00100000; PD=0, V=0, H=0
rcall LCD_CMD

ldi R17, 0b00001100; D=1, E=0
rcall LCD_CMD

ldi R17, 0b01000000; Y=0
rcall LCD_CMD

ldi R17, 0b10000000; X=0
rcall LCD_CMD

rcall LCD_CLR ;вызвать очистку ЖКИ

ret

LCD_CLR: ; очистка ЖКИ
ldi R18, 126
clr R17
lcd_clr_loop:
rcall LCD_DAT
rcall LCD_DAT
rcall LCD_DAT
rcall LCD_DAT
dec R18

brne lcd_clr_loop
rcall LCD_RES_POS
ret

LCD_DAT: ; для отправки команд в ЖКИ
sbi PORTB, 1
rcall spi_snd
ret

LCD_CMD: ; для отправки данных в ЖКИ
cbi PORTB, 1
rcall SPI_snd
ret

LCD_RES_POS: ; сброс курсора на X=0, Y=0

ldi R17, 0b01000000; Y=0
rcall LCD_CMD

ldi R17, 0b10000000; X=0
rcall LCD_CMD
ret

SPI_snd: ; процедура отправки по SPI
out SPDR, R17
woyt_transmit:
in R16, SPSR
sbrs R16, SPIF ; пропустить если идёт передача данных
rjmp woyt_transmit
ret

;массив знакогенератора
Symbol:
.db 0x00, 0x00, 0x00, 0x00, 0x00 /* sposi */
.db 0x00, 0x00, 0x2f, 0x00, 0x00 /* ! */
.db 0x00, 0x07, 0x00, 0x07, 0x00 /* " */
.db 0x14, 0x7f, 0x14, 0x7f, 0x14 /* # */
.db 0x24, 0x2a, 0x7f, 0x2a, 0x12 /* $ */
.db 0xc4, 0xc8, 0x10, 0x26, 0x46 /* % */
.db 0x36, 0x49, 0x55, 0x22, 0x50 /* & */
.db 0x00, 0x05, 0x03, 0x00, 0x00 /* */
.db 0x00, 0x1c, 0x22, 0x41, 0x00 /* ( */
.db 0x00, 0x41, 0x22, 0x1c, 0x00 /* ) */
.db 0x14, 0x08, 0x3E, 0x08, 0x14 /* * */
.db 0x08, 0x08, 0x3E, 0x08, 0x08 /* + */
.db 0x00, 0x00, 0x50, 0x30, 0x00 /* , */
.db 0x10, 0x10, 0x10, 0x10, 0x10 /* - */
.db 0x00, 0x60, 0x60, 0x00, 0x00 /* . */
.db 0x20, 0x10, 0x08, 0x04, 0x02 /* / */
.db 0x3E, 0x51, 0x49, 0x45, 0x3E /* 0 */
.db 0x00, 0x42, 0x7F, 0x40, 0x00 /* 1 */
.db 0x42, 0x61, 0x51, 0x49, 0x46 /* 2 */
.db 0x21, 0x41, 0x45, 0x4B, 0x31 /* 3 */
.db 0x18, 0x14, 0x12, 0x7F, 0x10 /* 4 */
.db 0x27, 0x45, 0x45, 0x45, 0x39 /* 5 */
.db 0x3C, 0x4A, 0x49, 0x49, 0x30 /* 6 */
.db 0x01, 0x71, 0x09, 0x05, 0x03 /* 7 */
.db 0x36, 0x49, 0x49, 0x49, 0x36 /* 8 */
.db 0x06, 0x49, 0x49, 0x29, 0x1E /* 9 */
.db 0x00, 0x36, 0x36, 0x00, 0x00 /* : */
.db 0x00, 0x56, 0x36, 0x00, 0x00 /* ; */
.db 0x08, 0x14, 0x22, 0x41, 0x00 /* < */
.db 0x14, 0x14, 0x14, 0x14, 0x14 /* = */
.db 0x00, 0x41, 0x22, 0x14, 0x08 /* > */
.db 0x02, 0x01, 0x51, 0x09, 0x06 /* ? */
.db 0x32, 0x49, 0x59, 0x51, 0x3E /* @ */
.db 0x7E, 0x11, 0x11, 0x11, 0x7E /* A */
.db 0x7F, 0x49, 0x49, 0x49, 0x36 /* B */
.db 0x3E, 0x41, 0x41, 0x41, 0x22 /* C */
.db 0x7F, 0x41, 0x41, 0x22, 0x1C /* D */
.db 0x7F, 0x49, 0x49, 0x49, 0x41 /* E */
.db 0x7F, 0x09, 0x09, 0x09, 0x01 /* F */
.db 0x3E, 0x41, 0x49, 0x49, 0x7A /* G */
.db 0x7F, 0x08, 0x08, 0x08, 0x7F /* H */
.db 0x00, 0x41, 0x7F, 0x41, 0x00 /* I */
.db 0x20, 0x40, 0x41, 0x3F, 0x01 /* J */
.db 0x7F, 0x08, 0x14, 0x22, 0x41 /* K */
.db 0x7F, 0x40, 0x40, 0x40, 0x40 /* L */
.db 0x7F, 0x02, 0x0C, 0x02, 0x7F /* M */
.db 0x7F, 0x04, 0x08, 0x10, 0x7F /* N */
.db 0x3E, 0x41, 0x41, 0x41, 0x3E /* O */
.db 0x7F, 0x09, 0x09, 0x09, 0x06 /* P */
.db 0x3E, 0x41, 0x51, 0x21, 0x5E /* Q */
.db 0x7F, 0x09, 0x19, 0x29, 0x46 /* R */
.db 0x46, 0x49, 0x49, 0x49, 0x31 /* S */
.db 0x01, 0x01, 0x7F, 0x01, 0x01 /* T */
.db 0x3F, 0x40, 0x40, 0x40, 0x3F /* U */
.db 0x1F, 0x20, 0x40, 0x20, 0x1F /* V */
.db 0x3F, 0x40, 0x38, 0x40, 0x3F /* W */
.db 0x63, 0x14, 0x08, 0x14, 0x63 /* X */
.db 0x07, 0x08, 0x70, 0x08, 0x07 /* Y */
.db 0x61, 0x51, 0x49, 0x45, 0x43 /* Z */
.db 0x00, 0x7F, 0x41, 0x41, 0x00 /* [ */
.db 0x55, 0x2A, 0x55, 0x2A, 0x55 /* "Yen" */
.db 0x00, 0x41, 0x41, 0x7F, 0x00 /* ] */
.db 0x04, 0x02, 0x01, 0x02, 0x04 /* ^ */
.db 0x40, 0x40, 0x40, 0x40, 0x40 /* _ */
.db 0x00, 0x01, 0x02, 0x04, 0x00 /* */
.db 0x20, 0x54, 0x54, 0x54, 0x78 /* a */
.db 0x7F, 0x48, 0x44, 0x44, 0x38 /* b */
.db 0x38, 0x44, 0x44, 0x44, 0x20 /* c */
.db 0x38, 0x44, 0x44, 0x48, 0x7F /* d */
.db 0x38, 0x54, 0x54, 0x54, 0x18 /* e */
.db 0x08, 0x7E, 0x09, 0x01, 0x02 /* f */
.db 0x0C, 0x52, 0x52, 0x52, 0x3E /* g */
.db 0x7F, 0x08, 0x04, 0x04, 0x78 /* h */
.db 0x00, 0x44, 0x7D, 0x40, 0x00 /* i */
.db 0x20, 0x40, 0x44, 0x3D, 0x00 /* j */
.db 0x7F, 0x10, 0x28, 0x44, 0x00 /* k */
.db 0x00, 0x41, 0x7F, 0x40, 0x00 /* l */
.db 0x7C, 0x04, 0x18, 0x04, 0x78 /* m */
.db 0x7C, 0x08, 0x04, 0x04, 0x78 /* n */
.db 0x38, 0x44, 0x44, 0x44, 0x38 /* o */
.db 0x7C, 0x14, 0x14, 0x14, 0x08 /* p */
.db 0x08, 0x14, 0x14, 0x18, 0x7C /* q */
.db 0x7C, 0x08, 0x04, 0x04, 0x08 /* r */
.db 0x48, 0x54, 0x54, 0x54, 0x20 /* s */
.db 0x04, 0x3F, 0x44, 0x40, 0x20 /* t */
.db 0x3C, 0x40, 0x40, 0x20, 0x7C /* u */
.db 0x1C, 0x20, 0x40, 0x20, 0x1C /* v */
.db 0x3C, 0x40, 0x30, 0x40, 0x3C /* w */
.db 0x44, 0x28, 0x10, 0x28, 0x44 /* x */
.db 0x0C, 0x50, 0x50, 0x50, 0x3C /* y */
.db 0x44, 0x64, 0x54, 0x4C, 0x44 /* z */

.db 0x7C, 0x12, 0x11, 0x12, 0x7C // А
.db 0x7F, 0x49, 0x49, 0x49, 0x31 // Б
.db 0x7F, 0x49, 0x49, 0x49, 0x36 // В
.db 0x7F, 0x01, 0x01, 0x01, 0x01 // Г
.db 0x60, 0x3F, 0x21, 0x3F, 0x60 // Д
.db 0x7F, 0x49, 0x49, 0x49, 0x41 // Е
.db 0x77, 0x08, 0x7F, 0x08, 0x77 // Ж
.db 0x22, 0x41, 0x49, 0x49, 0x36 // З
.db 0x7F, 0x10, 0x08, 0x04, 0x7F // И
.db 0x7E, 0x10, 0x09, 0x04, 0x7E // Й
.db 0x7F, 0x08, 0x14, 0x22, 0x41 // К
.db 0x40, 0x3E, 0x01, 0x01, 0x7F // Л
.db 0x7F, 0x02, 0x0C, 0x02, 0x7F // М
.db 0x7F, 0x08, 0x08, 0x08, 0x7F // Н
.db 0x3E, 0x41, 0x41, 0x41, 0x3E // О
.db 0x7F, 0x01, 0x01, 0x01, 0x7F // П
.db 0x7F, 0x09, 0x09, 0x09, 0x06 // Р
.db 0x3E, 0x41, 0x41, 0x41, 0x22 // С
.db 0x01, 0x01, 0x7F, 0x01, 0x01 // Т
.db 0x07, 0x48, 0x48, 0x48, 0x3F // У
.db 0x0E, 0x11, 0x7F, 0x11, 0x0E // Ф
.db 0x63, 0x14, 0x08, 0x14, 0x63 // Х
.db 0x3F, 0x20, 0x20, 0x3F, 0x60 // Ц
.db 0x07, 0x08, 0x08, 0x08, 0x7F // Ч
.db 0x7F, 0x40, 0x7E, 0x40, 0x7F // Ш
.db 0x3F, 0x20, 0x3F, 0x20, 0x7F // Щ
.db 0x01, 0x7F, 0x48, 0x48, 0x30 // Ъ
.db 0x7F, 0x48, 0x30, 0x00, 0x7F // Ы
.db 0x00, 0x7F, 0x48, 0x48, 0x30 // Ь
.db 0x22, 0x41, 0x49, 0x49, 0x3E // Э
.db 0x7F, 0x08, 0x3E, 0x41, 0x3E // Ю
.db 0x46, 0x29, 0x19, 0x09, 0x7F // Я
.db 0x20, 0x54, 0x54, 0x54, 0x78 // а
.db 0x3C, 0x4A, 0x4A, 0x4A, 0x31 // б
.db 0x7C, 0x54, 0x54, 0x28, 0x00 // в
.db 0x7C, 0x04, 0x04, 0x0C, 0x00 // г
.db 0x60, 0x3C, 0x24, 0x3C, 0x60 // д
.db 0x38, 0x54, 0x54, 0x54, 0x18 // е
.db 0x6C, 0x10, 0x7C, 0x10, 0x6C // ж
.db 0x00, 0x44, 0x54, 0x54, 0x28 // з
.db 0x7C, 0x20, 0x10, 0x08, 0x7C // и
.db 0x7C, 0x21, 0x12, 0x09, 0x7C // й
.db 0x7C, 0x10, 0x28, 0x44, 0x00 // к
.db 0x40, 0x38, 0x04, 0x04, 0x7C // л
.db 0x7C, 0x08, 0x10, 0x08, 0x7C // м
.db 0x7C, 0x10, 0x10, 0x10, 0x7C // н
.db 0x38, 0x44, 0x44, 0x44, 0x38 // о
.db 0x7C, 0x04, 0x04, 0x04, 0x7C // п
.db 0x7C, 0x14, 0x14, 0x14, 0x08 // р
.db 0x38, 0x44, 0x44, 0x44, 0x00 // с
.db 0x04, 0x04, 0x7C, 0x04, 0x04 // т
.db 0x0C, 0x50, 0x50, 0x50, 0x3C // у
.db 0x08, 0x14, 0x7C, 0x14, 0x08 // ф
.db 0x44, 0x28, 0x10, 0x28, 0x44 // х
.db 0x3C, 0x20, 0x20, 0x3C, 0x60 // ц
.db 0x0C, 0x10, 0x10, 0x10, 0x7C // ч
.db 0x7C, 0x40, 0x7C, 0x40, 0x7C // ш
.db 0x3C, 0x20, 0x3C, 0x20, 0x7C // щ
.db 0x04, 0x7C, 0x50, 0x50, 0x20 // ъ
.db 0x7C, 0x50, 0x20, 0x00, 0x7C // ы
.db 0x00, 0x7C, 0x50, 0x50, 0x20 // ь
.db 0x28, 0x44, 0x54, 0x54, 0x38 // э
.db 0x7C, 0x10, 0x38, 0x44, 0x38 // ю
.db 0x48, 0x54, 0x34, 0x14, 0x7C // я
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.12.2012, 22:56
Ответы с готовыми решениями:

Atmega88pa и фьюзы cksel0..3
Здравствуйте. Начал разбираться с микроконтроллерами AVR, до этого ни с какими не...

Индикатор с обратным отсчетом на ATmega88PA
Здравствуйте. Имеется программа на Си в Atmel Studio 6, программатор и платка с микроконтроллером...

atmega88pa установил неправильные фьюзы
Мне взбрело в голову на атмеге88па понизить частоту внутренней RC цепочки. Я открыл Khazama AVR...

Сбои при тактировании ATMega88PA от резонатора 20MHz [РЕШЕН]
Имеется железка, на борту ATMiko88PA. Напряжение питания 5в. Включен контроль питания на 4,3в....

Проблемма!
На днях перетащили сервер на новое железо. Конфигурация сервера (Domino) осталась неизменной, все...

20
Fomoryk
0 / 0 / 0
Регистрация: 24.02.2011
Сообщений: 15
07.12.2012, 05:29 21
Цитата Сообщение от dsodir
Easyitistromyx? Ди, меняй домен...
виноват, исправил :)
0
07.12.2012, 05:29
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.12.2012, 05:29

Проблемма с сылками
Доброго времени суток Всем. У меня такая проблема, - после добавления новостей на сайт ссылки на...

Проблемма с кодировкой
Всем доброе время суток. Есть сайт http://rfpgu.ru/ который был на старом сервере на апаче ...

Проблемма зарплат!
Расскажите. чё делаете, если зарплата привязанна к доллору, учитывая что последнее время он...


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

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

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