|
C8051F320, Отладочный набор |
|
|
|
Nov 26 2010, 11:24
|

Участник

Группа: Участник
Сообщений: 46
Регистрация: 1-11-10
Пользователь №: 60 586

|
Есть отладочный набор C8051F32X DEVELOPMENT KIT ,у сего девайся на порт 2 подключены на пин0 и пин1 две кнопочки и на пины 2,3 светодиоды.имею простую задачку зажигать диод при нажатии(компилятор IAR) Код /----------------------------------------------------------------------------- #include <ioC8051f320.h> // SFR declarations #include <intrinsics.h> //----------------------------------------------------------------------------- // 16-bit SFR Definitions for 'F32x //-----------------------------------------------------------------------------
__sfr __no_init volatile unsigned short TMR2RL @ 0xCA; // Timer2 reload value __sfr __no_init volatile unsigned short TMR2 @ 0xCC; // Timer2 counter
//----------------------------------------------------------------------------- // Global CONSTANTS //-----------------------------------------------------------------------------
#define SYSCLK 24500000 / 8 // SYSCLK frequency in Hz
#define LED P2_bit.P22 // LED='1' means ON #define SW2 P2_bit.P0 // SW2='0' means switch pressed
//----------------------------------------------------------------------------- // Function PROTOTYPES //----------------------------------------------------------------------------- void SYSCLK_Init (void); void PORT_Init (void); void Timer2_Init (int counts); __interrupt void Timer2_ISR (void);
//----------------------------------------------------------------------------- // MAIN Routine //----------------------------------------------------------------------------- void main (void) {
// disable watchdog timer PCA0MD &= ~0x40; // WDTE = 0 (clear watchdog timer // enable)
SYSCLK_Init (); // Initialize system clock to // 24.5MHz PORT_Init (); // Initialize crossbar and GPIO
while (1) { if (!P2_bit.P20) {P2_bit.P22&=0x01;} else {P2_bit.P22==0x00;}; if (!P2_bit.P21) {P2_bit.P23&=0x01;} else {P2_bit.P23==0x00;};// код мигания } }
//----------------------------------------------------------------------------- // SYSCLK_Init //----------------------------------------------------------------------------- // // This routine initializes the system clock to use the internal 24.5MHz / 8 // oscillator as its clock source. Also enables missing clock detector reset. // void SYSCLK_Init (void) { OSCICN = 0x80; // configure internal oscillator for // its lowest frequency RSTSRC = 0x08; // enable missing clock detector }
void PORT_Init (void) { XBR0 = 0x00; XBR1 = 0x40; P2 &= 0x03; // настраиваем пины 0 и 1 на вход P2MDOUT |= 0x0C; // обозначаем выход для пинов на которых диоды P2_bit.P22&=0x00; //гасим загорающиеся диоды P2_bit.P23&=0x00; //гасим загорающиеся диоды } Однако условия не выполняются,независимо от того нажата кнопка или нет,такое ощущения что эти пины не настроились на ввод.Ошибка в коде?
|
|
|
|
|
Nov 26 2010, 15:51
|

Участник

Группа: Участник
Сообщений: 46
Регистрация: 1-11-10
Пользователь №: 60 586

|
Цитата(barabek @ Nov 26 2010, 15:08)  В IAR не работал. Какие-то конструкции совершенно для Keil не знакомые. Не важно. Что конкретно не работает? Что отладчик дает? После настройки порта,диоды загораются,далее их гашу,по конструкции в цикле while(1) должно быть если уровень на пине 0 и 1 низкий то загораются соответственно диоды на пинах 2.2 2.3,но после перехода на тело основного цикла независимо от состояния на пине 0или1,те по условию else вообще не переходит,но и после проверки состояния пина,прыгает на выполнение Код P2_bit.P22&=0x01 но диод не загорается
|
|
|
|
|
Nov 26 2010, 16:35
|

Частый гость
 
Группа: Свой
Сообщений: 179
Регистрация: 1-10-07
Из: НЧ
Пользователь №: 30 966

|
Цитата(evsx1 @ Nov 26 2010, 14:24)  ... while (1) { if (!P2_bit.P20) {P2_bit.P22&=0x01;} else {P2_bit.P22==0x00;}; if (!P2_bit.P21) {P2_bit.P23&=0x01;} else {P2_bit.P23==0x00;};// код мигания } } ... Почему в Else используется == ?
|
|
|
|
|
Nov 26 2010, 16:42
|

Участник

Группа: Участник
Сообщений: 46
Регистрация: 1-11-10
Пользователь №: 60 586

|
Цитата(kosyak© @ Nov 26 2010, 19:35)  Почему в Else используется == ? равняем бит с единичкой,что нам это мешает сделать,здесь не принципиально присваивание или приравнивание
Сообщение отредактировал evsx1 - Nov 26 2010, 16:43
|
|
|
|
|
Nov 26 2010, 16:57
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(evsx1 @ Nov 26 2010, 18:51)  Код P2_bit.P22&=0x01 но диод не загорается Наверное, нужно приравнять единице (т.е. убрать &). Цитата(evsx1 @ Nov 26 2010, 19:42)  равняем бит с единичкой,что нам это мешает сделать,здесь не принципиально присваивание или приравнивание О-па! Что это - вдруг: "не принципиально"? Еще как - принципиально!
|
|
|
|
|
Nov 26 2010, 17:08
|

Участник

Группа: Участник
Сообщений: 46
Регистрация: 1-11-10
Пользователь №: 60 586

|
Цитата(Палыч @ Nov 26 2010, 19:57)  Наверное, нужно приравнять единице (т.е. убрать &).
О-па! Что это - вдруг: "не принципиально"? Еще как - принципиально! в данном случае,преобразования типов то нет.так что в конкретном этом случае не вижу принципиальной разницы,объясните если я не прав P22 просто не ставится точка,те идет указание порта 2,и снова P22(порт 2 и пин 2)(почему так не знаю)
|
|
|
|
|
Nov 26 2010, 17:57
|

Участник

Группа: Участник
Сообщений: 46
Регистрация: 1-11-10
Пользователь №: 60 586

|
в данном случае меня интересуют настройки порта,по дефауту в даташите пишут что порт настраивается на выход,если хотите отдельные пины на вход,то надо ставить в регистр защелку порта 1ки
Действительно инициализация правильная,использование &= в основном цикле программы не работает,вопрос почему,маска для одного бита не приемлема7,но в функции инициализации порта есть строки присваивания 00 порту,те я вижу что порт настроился на выход(оба диода загорелись),затем глушу по одному- это работает, а в теле основного цикла не работает..почему?есть мнения?
Модераторы,простите за косяк могли бы перенести в специализированную тему c51,не заметил ее вначале создания темы
Сообщение отредактировал evsx1 - Nov 26 2010, 17:59
|
|
|
|
|
Nov 26 2010, 18:28
|

Частый гость
 
Группа: Свой
Сообщений: 179
Регистрация: 1-10-07
Из: НЧ
Пользователь №: 30 966

|
В 51 есть возможность оперировать битами. т.е. Чтобы сбросить или установить бит вы так и пишите BitX = 0 или 1.. А маска нужна если минимальной единицей для работы был бы байт (2 байта 4 .. ) т.е. ЧТобы сбросить в переменной Byte скажем первый бит и не затронуть остальные - Byte = Byte & (~0x01) чет объяснение какоето сумбурное получилось..но ночь на дворе  Попробуйте написать так if (!P2_bit.P20) {P2_bit.P22 = 0x01;} else {P2_bit.P22 = 0x00;};
|
|
|
|
|
Nov 27 2010, 01:15
|
Знающий
   
Группа: Свой
Сообщений: 540
Регистрация: 16-08-07
Из: Владивосток
Пользователь №: 29 831

|
Цитата(Палыч @ Nov 27 2010, 06:22)  Нужно вспомнить (кто не знал - узнать), что выражение вида X &= Y эквивалентно следующему: X= X & Y слегка дополню. Не знаю как в ИАР, а в кейл имеется один важный момент. В конструкциях X &= Y если X - порт, компилятор подставляет команды "чтение-модификация-запись", т.е. минуя аккумулятор. Иногда это удобно, т.к. только в этом случае считывается выходной регистр, а не состояние на пинах. Например P1^=(P1^CHANGE)&OUTMASK; позволяет изменять одновременно несколько выходных пинов (определяется маской CHANGE), при этом входные пины (вернее их регистры) в этом же порту остаются нетронутыми (в маске OUTMASK - еденицами обозначены выходные пины). esvx1 обратите внимание чем отличается сравнение "==" (при этом никакогоприсваивания не происходит) и оператором "="
|
|
|
|
|
Nov 27 2010, 11:26
|

Участник

Группа: Участник
Сообщений: 46
Регистрация: 1-11-10
Пользователь №: 60 586

|
Цитата(Палыч @ Nov 26 2010, 23:22)  Нужно вспомнить (кто не знал - узнать), что выражение вида X &= Y эквивалентно следующему: X= X & Y Если Y равно нулю, то и X & 0 всегда равно нулю. Таким образом X &= 0 вырождается в Х=0 Если же Y равно единице (и вспомним, что X - это бит), то X &= 1 преобразуется в Х = Х & 1, что вырождается в X=X (т.е. никакого изменения величины X не производится). Вот,в логике программы следующее:если лог ноль,то делаем x=X&1,ставлю &= не выполняет,ставлю =1,выполняет.тогда где вырождение?компилятор такое вырождение не принимает.Просто в данном конкретном примере я пока не понял разницы между &= и =,по идее нам надо установить только уровни,ну вот выполнил я побитовы и с одним битом,должн.... а вот теперь понял(пока писал,состояние X может быть ноль и тогда я получу 0,а в данном примере так и есть)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|