|
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, 17:57
|

Участник

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

|
в данном случае меня интересуют настройки порта,по дефауту в даташите пишут что порт настраивается на выход,если хотите отдельные пины на вход,то надо ставить в регистр защелку порта 1ки
Действительно инициализация правильная,использование &= в основном цикле программы не работает,вопрос почему,маска для одного бита не приемлема7,но в функции инициализации порта есть строки присваивания 00 порту,те я вижу что порт настроился на выход(оба диода загорелись),затем глушу по одному- это работает, а в теле основного цикла не работает..почему?есть мнения?
Модераторы,простите за косяк могли бы перенести в специализированную тему c51,не заметил ее вначале создания темы
Сообщение отредактировал evsx1 - Nov 26 2010, 17:59
|
|
|
|
|
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,а в данном примере так и есть)
|
|
|
|
Сообщений в этой теме
evsx1 C8051F320 Nov 26 2010, 11:24 barabek Цитата(evsx1 @ Nov 26 2010, 21:24) Однако... Nov 26 2010, 12:08 evsx1 Цитата(barabek @ Nov 26 2010, 15:08) В IA... Nov 26 2010, 15:51  Палыч Цитата(evsx1 @ Nov 26 2010, 18:51) КодP2_... Nov 26 2010, 16:57   evsx1 Цитата(Палыч @ Nov 26 2010, 19:57) Наверн... Nov 26 2010, 17:08 kosyak© Цитата(evsx1 @ Nov 26 2010, 14:24) ...
... Nov 26 2010, 16:35 evsx1 Цитата(kosyak© @ Nov 26 2010, 19:35) Поче... Nov 26 2010, 16:42 kosyak© У Вас случаем компилятор этот кусок кода не выкину... Nov 26 2010, 16:52 kosyak© Код вообще не понятный. сам для х51 на ИАр никогда... Nov 26 2010, 17:09  barabek Цитата(Палыч @ Nov 27 2010, 06:22) Нужно ... Nov 27 2010, 01:15   Палыч Цитата(evsx1 @ Nov 27 2010, 14:26) не пон... Nov 27 2010, 16:38 kosyak© В 51 есть возможность оперировать битами. т.е. Что... Nov 26 2010, 18:28 Sujan Цитата(evsx1 @ Nov 27 2010, 13:26) Вот,в ... Nov 28 2010, 12:46
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|