Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Определение сегментов в KEIL
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры
Dron_Gus
Ткните носом, что неправильно...

Код
;-------BANK segment
    DSEG AT 00h
RegBnks SEGMENT DATA
    RSEG RegBnks
    org 08h;Bank 1
    DS 2;R0, R1 in bank 1 using for internal
LCD_X:    DS 1;X=R2 in bank 1
LCD_Y:  DS 1;Y=R3 in bank 1
LCD_BS: DS 1;Begining string of LCD

;-------BIT segment
       BSEG AT 20h
BitSeg  SEGMENT BIT
    RSEG BitSeg
LCD_BW:    DBIT 1;0 => White background 1 => Black
LCD_NS: DBIT 1;New string after write
LCD_RC: DBIT 1 ;Return of carriage
LCD_SX: DBIT 1 ;Save X
LCD_SY: DBIT 1 ;Save Y
LCD_M:    DBIT 1 ;1 string in CODE memory, 0 in XRAM

;-------BYTE area
    
    
    
;-------STACK - highest 20h of internal RAM, STACK grows UP
    BSEG AT 60h
STACK    SEGMENT    DATA
    RSEG  STACK
    DS    20H


    USING    0
    CSEG  AT   0
MAIN    SEGMENT    CODE
    RSEG  MAIN
;-------Int Vectors
    ORG 0000h
    ljmp START;start vector
    ORG 006Bh
    ljmp USB_INT;usb interrupt



    ORG 0100h
;-------START
START:    mov SP,#STACK-1


В дебагере вместо

Код
START:    mov SP,#STACK-1

Это
Код
C:0x0100    758120   MOV      SP(0x81),#0x20


Тоже самое с регистрами из 1 го банка. Т.е. если делаем mov LCD_X,#0h а потом переходим к первому банку, в R2 вовсе не 0.

Соостветственно я запутался. Из справки по директивам почти ничего не понял. Т.е. мне кажется после BSEG AT 60h сегмент будет по смещению 60h, но почему-то это не так.

И еще. Почему компилятор придирается к push A, а к push ACC нет?
acex2
Цитата(Dron_Gus @ Feb 25 2005, 13:43)
Соостветственно я запутался. Из справки по директивам почти ничего не понял. Т.е. мне кажется после BSEG AT 60h сегмент будет по смещению 60h, но почему-то это не так.


BSEG в 8051 - это сегмент для побитно адресуемых данных с адресами в DATA от 0x20 - 0x2F. Поэтому значение 60h тут никак не подходит. Да и стек в этой области обычно не располагают. Обычно стек помещают в сегмент IDATA (директива ISEG), если конечно она физически присутствует в вашем МК. Если нет, то надо использовать директиву DSEG для размещения в любой части области DATA.

Цитата(Dron_Gus @ Feb 25 2005, 13:43)
И еще. Почему компилятор придирается к push A, а к push ACC нет?


Потому что это не совсем одно и то же. "А" означает адрес аккумулятора как ячейки памяти при прямой адресации, а "АСС" - имя аккумулятора как SFR регистра, соответсвенно push по логике работает только с ACC.
Dron_Gus
Цитата(acex2 @ Feb 25 2005, 21:15)
BSEG в 8051 - это сегмент для побитно адресуемых данных с адресами в DATA от 0x20 - 0x2F. Поэтому значение 60h тут никак не подходит. Да и стек в этой области обычно не располагают. Обычно стек помещают в сегмент IDATA (директива ISEG), если конечно она физически присутствует в вашем МК. Если нет, то надо использовать директиву DSEG для размещения в любой части области DATA.


Про А и АСС вроде понял. Только еще один вопрос возник после прочтения ПДФа. Адреса 80h-FFh занимают SFR (direct addressing) и Inderect memory. Push ACC это direct addressing или я опять что-то не понимаю?

А вот со стеком и банками регистров не получается. cranky.gif Не IDATA, не просто DATA не помагают. Пытался все остальные сегменты двигать, смещать... Ничего не помагает. Может какие настройки надо проставить?
acex2
Цитата(Dron_Gus @ Feb 25 2005, 14:55)
Про А и АСС вроде понял. Только еще один вопрос возник после прочтения ПДФа. Адреса 80h-FFh занимают SFR (direct addressing) и Inderect memory. Push ACC это direct addressing или я опять что-то не понимаю?


PUSH - это индексная адресация wink.gif Вторым параметром идет адрес ячейки от 0 до 0xFF, содержимое которой и будет помещено в стек. Так, для PUSH ACC в стек будет помещаться содержимое ячейки с адресом E0, т.е. текущее содержимое аккумулятора. Точно так же вы можете написать PUSH 0xE0 и это будет то же самое что и PUSH ACC.

P.S. Сейчас только заметил очепятку в пояснении в своем предыдущем сообщении - поменяйте там местами ACC и A, а то действительно непонятно получилось.

Цитата(Dron_Gus @ Feb 25 2005, 14:55)
А вот со стеком и банками регистров не получается. cranky.gif Не IDATA, не просто DATA не помагают. Пытался все остальные сегменты двигать, смещать... Ничего не помагает. Может какие настройки надо проставить?


Должно работать. Вот вам пример стека в IDATA с фиксированным расположением:
Код
ISEG      AT      0xA0
?STACK:   DS      0x20


или если хотите чтобы линкер его сам расположил:

Код
?STACK  SEGMENT  IDATA
        RSEG     ?STACK
        DS       0x20
Dron_Gus
Понятно. Большое спасибо за помощь... a14.gif

Как я понял, у меня не работало т.к. я прописал все и сразу. И ISEG и SEGMENT.

И в заключении скромный вопрос ?STACK от STACK чем-нибудь отличается? Или это для удобства?
Dron_Gus
Как оказалось это еще не все.

Хочу читать/писать регистры 1го банка не переключаясь. Т.е.:
Код
    DSEG AT 00h
RegBnks:    
    org 08h;Bank 0
    DS 2;R0, R1 in bank 1 using for internal
LCD_X:    DS 1;X=R2 in bank 1
LCD_Y:  DS 1;Y=R3 in bank 1
LCD_BS: DS 1;Begining string of LCD


На что мне возражают:

Код
*** WARNING L4: DATA SPACE MEMORY OVERLAP
   FROM:    0000H
   TO:      000CH
*** WARNING L4: DATA SPACE MEMORY OVERLAP
   FROM:    0008H
   TO:      000CH


Как я понял оугается на перекрытие. От этого можно как-либо избавится? Или просто игнорировать?
DPL
Размещение абсолютного сегмента данных с адреса "0" в данном случае не совсем корректно, т.к. там размещен нулевой и, в Вашем случае, наверное первый банки регистров. Компоновщик на это мягко ругается, т.е. "в принципе можно, но имейте в виду..."

Как вариант - можно отказаться от описания сегмента "DSEG AT 0" и использовать описания типа
Код
LCD_X     DATA 0Ah   ;X=R2 in bank 1
LCD_Y     DATA 0Bh   ;Y=R3 in bank 1

mov  LCD_X,#1  ; помещает в ячейку 0Аh значение "1"


Кроме того, вместо адресов регистров банка, выбранного директивой "using", можно использовать имена "AR0"..."AR7", например
Код
using 1
...
push AR0    ; сохраняет в стеке содержимое ячейки 8
...
using 2
pop  AR0    ; восстанавливает из стека содержимое ячейки 10h
...
using 0

Фактического переключения банков при этом не происходит
Dron_Gus
Спасибо всем за помощь! Все заработало как надо и без warning'ов.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.