Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Вопросы начинающих

Вопросы начинающих Прежде чем задать вопрос, стоит воспользоваться поиском

Ответ
 
Опции темы Опции просмотра
Старый 25.03.2009, 14:05   #1
vit333vit
Junior Member
 
Регистрация: 04.03.2009
Сообщений: 10
Вес репутации: 100/41
vit333vit will become famous soon enoughvit333vit will become famous soon enough
По умолчанию Не могу понять

Приветствую.
Я изучаю MPLAB. Стоит MPLAB-7.42
Выполняю строки в симуляторе:
clrf 0Ch
bcf Status,0
movlw b'01001111'
movwf 0Ch

Смотрю состояние регистров, а флаг заёма "С" установлен в 1. При пошаговой проверке видно, что устанавливается он при выполнении последней команды (movwf 0Ch). Вот и не могу понять. Разве он должен устанавливаться в 1, т.е. вообще меняться при этой команде?

И еще скажите, при заёме флаг "С" меняет своё состояние на противоположное, или его надо опускать в 0?
vit333vit вне форума   Ответить с цитированием
Старый 25.03.2009, 19:51   #2
russo turisto
Senior Member
 
Регистрация: 25.03.2009
Адрес: KZ
Сообщений: 132
Вес репутации: 164/42
russo turisto has a spectacular aura aboutrusso turisto has a spectacular aura about
По умолчанию Ответ: Не могу понять

Насколько я понял вы работаете с 16F84, т.к. регистр 0Сh это первый регистр общего назначения.
В тех. документации сказано что флаг заема имеет инверсное значение (тех.докум. на 16F628). Значит в вашем примере заема не было, поэтому бит С устанавливается в единицу.
Для более детального расмотрения лучше предоставлять весь код в студию.
russo turisto вне форума   Ответить с цитированием
Старый 25.03.2009, 20:03   #3
tester
Super Moderator
 
Аватар для tester
 
Регистрация: 28.02.2007
Возраст: 43
Сообщений: 3,577
Вес репутации: 4386/126
tester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond repute
По умолчанию Ответ: Не могу понять

Цитата:
Сообщение от vit333vit Посмотреть сообщение
Выполняю строки в симуляторе:
clrf 0Ch
bcf Status,0
movlw b'01001111'
movwf 0Ch

Смотрю состояние регистров, а флаг заёма "С" установлен в 1. При пошаговой проверке видно, что устанавливается он при выполнении последней команды (movwf 0Ch). Вот и не могу понять. Разве он должен устанавливаться в 1, т.е. вообще меняться при этой команде?
Нет, не должен. MOVWF не влияет на CARRY, если только операндом не является сам регистр STATUS. Что-то ты напутал.

Цитата:
И еще скажите, при заёме флаг "С" меняет своё состояние на противоположное, или его надо опускать в 0?
При заеме (или при его отсутствии) флаг "C" устанавливается/сбрасывается в соответствии с отсутствием/наличием заема, и его состояние до операции на это не влияет.
tester вне форума   Ответить с цитированием
Старый 26.03.2009, 09:18   #4
vit333vit
Junior Member
 
Регистрация: 04.03.2009
Сообщений: 10
Вес репутации: 100/41
vit333vit will become famous soon enoughvit333vit will become famous soon enough
По умолчанию Ответ: Не могу понять

Цитата:
Сообщение от russo turisto Посмотреть сообщение
Насколько я понял вы работаете с 16F84, т.к. регистр 0Сh это первый регистр общего назначения.
В тех. документации сказано что флаг заема имеет инверсное значение (тех.докум. на 16F628). Значит в вашем примере заема не было, поэтому бит С устанавливается в единицу.
Для более детального расмотрения лучше предоставлять весь код в студию.
Это и есть весь код, я его в целях изучения написал:
clrf 0Ch
bcf Status,C
movlw b'00101101'
movwf 0Ch
movlw b'00010001'
subwf 0Ch,1
nop
end

Да для 16F84A.
vit333vit вне форума   Ответить с цитированием
Старый 26.03.2009, 09:29   #5
vit333vit
Junior Member
 
Регистрация: 04.03.2009
Сообщений: 10
Вес репутации: 100/41
vit333vit will become famous soon enoughvit333vit will become famous soon enough
По умолчанию Ответ: Не могу понять

Цитата:
Сообщение от tester Посмотреть сообщение
Нет, не должен. MOVWF не влияет на CARRY, если только операндом не является сам регистр STATUS. Что-то ты напутал.


При заеме (или при его отсутствии) флаг "C" устанавливается/сбрасывается в соответствии с отсутствием/наличием заема, и его состояние до операции на это не влияет.
Вот я проверил на симуляторе 4 варианта:
1) F>W C=0 - при отнимании F-W получаем, что С устанавливается в 1
2) F>W C=1 - при отнимании F-W получаем, что С остается в 1
3) F<W C=0 - при отнимании F-W получаем, что С остается в 0
4) F<W C=1 - при отнимании F-W получаем, что С устанавливается в 0

Но ведь заёма же не было в варианте 1). Вот в чём вопрос.
vit333vit вне форума   Ответить с цитированием
Старый 26.03.2009, 09:34   #6
Bill
Senior Member
 
Аватар для Bill
 
Регистрация: 26.02.2007
Адрес: Челябинск
Возраст: 69
Сообщений: 2,215
Вес репутации: 1898/88
Bill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant future
По умолчанию Что-то я не понял.

Цитата:
Сообщение от vit333vit Посмотреть сообщение
Это и есть весь код, я его в целях изучения написал:
clrf 0Ch
bcf Status,C
movlw b'00101101'
movwf 0Ch
movlw b'00010001'
subwf 0Ch,1
nop
end

Да для 16F84A.
Есть все-таки в Вашем коде команда вычитания (которая меняет флаг), или ее нет?
Bill вне форума   Ответить с цитированием
Старый 26.03.2009, 10:40   #7
tester
Super Moderator
 
Аватар для tester
 
Регистрация: 28.02.2007
Возраст: 43
Сообщений: 3,577
Вес репутации: 4386/126
tester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond repute
По умолчанию Ответ: Не могу понять

Цитата:
Сообщение от vit333vit Посмотреть сообщение
Вот я проверил на симуляторе 4 варианта:
1) F>W C=0 - при отнимании F-W получаем, что С устанавливается в 1
2) F>W C=1 - при отнимании F-W получаем, что С остается в 1
3) F<W C=0 - при отнимании F-W получаем, что С остается в 0
4) F<W C=1 - при отнимании F-W получаем, что С устанавливается в 0

Но ведь заёма же не было в варианте 1). Вот в чём вопрос.
Поражаюсь тому, как задаются вопросы (это я про отсутствие subwf в первом посте) и как читаются ответы.

Еще раз: флаг "C" устанавливается/сбрасывается в соответствии с отсутствием/наличием заема.

Флаг C устанавливается в соответствии с результатом операции, и его прежнее состояние на это не влияет. У тебя же в первых двух вариантах F>W, и вне зависимости от C результат один - C становится "1".

В даташите флаг C расшифровывается как CARRY/!BORROW. Если нет заема, то C устанавливается (т.е. !BORROW == true)
tester вне форума   Ответить с цитированием
Старый 26.03.2009, 10:54   #8
PE_VK
Guest
 
Сообщений: n/a
По умолчанию Ответ: Не могу понять

Про работу с флагами почитай здесь: http://ikarab.narod.ru/Kea_20.html
  Ответить с цитированием
Старый 26.03.2009, 11:56   #9
vit333vit
Junior Member
 
Регистрация: 04.03.2009
Сообщений: 10
Вес репутации: 100/41
vit333vit will become famous soon enoughvit333vit will become famous soon enough
По умолчанию Ответ: Не могу понять

Мне кажется я понял в чем проблема! Вот первоначальный код:

clrf 0Ch
bcf Status,0
movlw b'01001111'
| movwf 0Ch
end

Если его выполнять в симуляторе, допустим пошагово то видно, что курсор в симуляторе MPLAB стоит напротив команды, тогда когда эта команда еще не выполнена, т.е. например clrf 0Ch выполнится одновременно с переходом позиции курсора на строку bcf Status,0
Так вот, когда я хочу посмотреть состояние регистров после выполнения последней (именно последней) команды
movwf 0Ch , то оно не отображается нормально, а флаг С переходит в 1. Попробуйте сами, если не верите.
vit333vit вне форума   Ответить с цитированием
Старый 26.03.2009, 12:37   #10
tester
Super Moderator
 
Аватар для tester
 
Регистрация: 28.02.2007
Возраст: 43
Сообщений: 3,577
Вес репутации: 4386/126
tester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond repute
По умолчанию Ответ: Не могу понять

Цитата:
Сообщение от vit333vit Посмотреть сообщение
Мне кажется я понял в чем проблема! Вот первоначальный код:

clrf 0Ch
bcf Status,0
movlw b'01001111'
| movwf 0Ch
end

Если его выполнять в симуляторе, допустим пошагово то видно, что курсор в симуляторе MPLAB стоит напротив команды, тогда когда эта команда еще не выполнена, т.е. например clrf 0Ch выполнится одновременно с переходом позиции курсора на строку bcf Status,0
Так вот, когда я хочу посмотреть состояние регистров после выполнения последней (именно последней) команды movwf 0Ch , то оно не отображается нормально, а флаг С переходит в 1. Попробуйте сами, если не верите.
Попробовал, действительно, в МПЛаб'e такой эффект есть. После выполнения последней инструкции перед END, если в асм-тексте дальше ничего нет, то почему-то выполняются еще 100 следующих инструкций. А все они - ADDLW 0xFF, они-то и ставили флаг C в "1".
tester вне форума   Ответить с цитированием
Старый 26.03.2009, 13:06   #11
fantom
Senior Member
 
Регистрация: 27.02.2007
Адрес: Рязань
Возраст: 44
Сообщений: 2,610
Вес репутации: 2570/99
fantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond repute
По умолчанию Ответ: Не могу понять

Цитата:
Сообщение от vit333vit Посмотреть сообщение
Мне кажется я понял в чем проблема! Вот первоначальный код:

clrf 0Ch
bcf Status,0
movlw b'01001111'
movwf 0Ch

goto $ ;вечный цикл

end
В таких случаях, всегда добавлял строку вечного цикла. Это как ограничитель, чтоб программа не бегала по кругу. И никаких странных эффектов не возникает.
fantom вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Присоветуйте тип и способ управления MOSFETом "верхнего" плеча dr_Sash Источники питания и силовая электроника 37 08.09.2012 18:50
Не могу найти описание К553УД18 Iptash Общетехнические вопросы 6 07.02.2009 23:07
Не могу понять что происходит с воводами RC1 & RC2 PIC16F767 Viktor_va6 Продукция MICROCHIP 3 05.03.2008 12:46
CONFIGURATION bits pic18f2580 не могу прошить eewgen Продукция MICROCHIP 0 07.02.2008 15:42
Не могу в 18F4220 прочесть PORTA (0:3), хоть АЦП типа выключен :( Синклер Продукция MICROCHIP 5 01.11.2007 12:07


Часовой пояс GMT +3, время: 16:35.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd. Перевод: zCarot