реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> C8051F320, Отладочный набор
evsx1
сообщение Nov 26 2010, 11:24
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 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;                    //гасим загорающиеся диоды
}

Однако условия не выполняются,независимо от того нажата кнопка или нет,такое ощущения что эти пины не настроились на ввод.Ошибка в коде?
Go to the top of the page
 
+Quote Post
barabek
сообщение Nov 26 2010, 12:08
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 540
Регистрация: 16-08-07
Из: Владивосток
Пользователь №: 29 831



Цитата(evsx1 @ Nov 26 2010, 21:24) *
Однако условия не выполняются,независимо от того нажата кнопка или нет,такое ощущения что эти пины не настроились на ввод.Ошибка в коде?

В IAR не работал. Какие-то конструкции совершенно для Keil не знакомые. Не важно. Что конкретно не работает? Что отладчик дает?




Go to the top of the page
 
+Quote Post
evsx1
сообщение Nov 26 2010, 15:51
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 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
но диод не загорается
Go to the top of the page
 
+Quote Post
kosyak©
сообщение Nov 26 2010, 16:35
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 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 используется == ?
Go to the top of the page
 
+Quote Post
evsx1
сообщение Nov 26 2010, 16:42
Сообщение #5


Участник
*

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



Цитата(kosyak© @ Nov 26 2010, 19:35) *
Почему в Else используется == ?

равняем бит с единичкой,что нам это мешает сделать,здесь не принципиально присваивание или приравнивание

Сообщение отредактировал evsx1 - Nov 26 2010, 16:43
Go to the top of the page
 
+Quote Post
kosyak©
сообщение Nov 26 2010, 16:52
Сообщение #6


Частый гость
**

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



У Вас случаем компилятор этот кусок кода не выкинул при оптимизации???
Хм...сейчас всмотрелся - конструкции действительно очень странные...нифига не понял..
P2_bit.P22 - это что порт 2 бит 22 ? ... странная штука IAR
Go to the top of the page
 
+Quote Post
Палыч
сообщение Nov 26 2010, 16:57
Сообщение #7


Гуру
******

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



Цитата(evsx1 @ Nov 26 2010, 18:51) *
Код
P2_bit.P22&=0x01
но диод не загорается
Наверное, нужно приравнять единице (т.е. убрать &).


Цитата(evsx1 @ Nov 26 2010, 19:42) *
равняем бит с единичкой,что нам это мешает сделать,здесь не принципиально присваивание или приравнивание
О-па! Что это - вдруг: "не принципиально"? Еще как - принципиально!
Go to the top of the page
 
+Quote Post
evsx1
сообщение Nov 26 2010, 17:08
Сообщение #8


Участник
*

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



Цитата(Палыч @ Nov 26 2010, 19:57) *
Наверное, нужно приравнять единице (т.е. убрать &).


О-па! Что это - вдруг: "не принципиально"? Еще как - принципиально!

в данном случае,преобразования типов то нет.так что в конкретном этом случае не вижу принципиальной разницы,объясните если я не прав
P22 просто не ставится точка,те идет указание порта 2,и снова P22(порт 2 и пин 2)(почему так не знаю)
Go to the top of the page
 
+Quote Post
kosyak©
сообщение Nov 26 2010, 17:09
Сообщение #9


Частый гость
**

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



Код вообще не понятный. сам для х51 на ИАр никогда не писал.
у 320 все порты 8 пиновые.."пин 20 порта 2" эт что-то странное... хотя мож иаровцы как нибудь извернулись...

P2_bit.P22&=0x01 - зачем тут вообще & - мы обращаемся к конкретному пину.. т.е. никаких масок вообще не надо

P2_bit.P22 = 0x01
P2_bit.P22 = 0x00


ага... теперь понял P2_bit.P22 порт 2 пин 2 ... ну а маски все арвно уберите - они тут не нужны
Go to the top of the page
 
+Quote Post
evsx1
сообщение Nov 26 2010, 17:57
Сообщение #10


Участник
*

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



в данном случае меня интересуют настройки порта,по дефауту в даташите пишут что порт настраивается на выход,если хотите отдельные пины на вход,то надо ставить в регистр защелку порта 1ки

Действительно инициализация правильная,использование &= в основном цикле программы не работает,вопрос почему,маска для одного бита не приемлема7,но в функции инициализации порта есть строки присваивания 00 порту,те я вижу что порт настроился на выход(оба диода загорелись),затем глушу по одному- это работает, а в теле основного цикла не работает..почему?есть мнения?

Модераторы,простите за косяк могли бы перенести в специализированную тему c51,не заметил ее вначале создания темы

Сообщение отредактировал evsx1 - Nov 26 2010, 17:59
Go to the top of the page
 
+Quote Post
kosyak©
сообщение Nov 26 2010, 18:28
Сообщение #11


Частый гость
**

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



В 51 есть возможность оперировать битами. т.е. Чтобы сбросить или установить бит вы так и пишите
BitX = 0 или 1..

А маска нужна если минимальной единицей для работы был бы байт (2 байта 4 .. )
т.е. ЧТобы сбросить в переменной Byte скажем первый бит и не затронуть остальные - Byte = Byte & (~0x01)

чет объяснение какоето сумбурное получилось..но ночь на дворе smile.gif

Попробуйте написать так

if (!P2_bit.P20) {P2_bit.P22 = 0x01;} else {P2_bit.P22 = 0x00;};


Go to the top of the page
 
+Quote Post
Палыч
сообщение Nov 26 2010, 20:22
Сообщение #12


Гуру
******

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



Цитата(evsx1 @ Nov 26 2010, 20:57) *
...использование &= в основном цикле программы не работает ... затем глушу по одному- это работает, а в теле основного цикла не работает..почему?есть мнения?
Нужно вспомнить (кто не знал - узнать), что выражение вида X &= Y эквивалентно следующему: X= X & Y
Если Y равно нулю, то и X & 0 всегда равно нулю. Таким образом X &= 0 вырождается в Х=0
Если же Y равно единице (и вспомним, что X - это бит), то X &= 1 преобразуется в Х = Х & 1, что вырождается в X=X (т.е. никакого изменения величины X не производится).
Go to the top of the page
 
+Quote Post
barabek
сообщение Nov 27 2010, 01:15
Сообщение #13


Знающий
****

Группа: Свой
Сообщений: 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 обратите внимание чем отличается сравнение "==" (при этом никакогоприсваивания не происходит) и оператором "="
Go to the top of the page
 
+Quote Post
evsx1
сообщение Nov 27 2010, 11:26
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 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,а в данном примере так и есть)
Go to the top of the page
 
+Quote Post
Палыч
сообщение Nov 27 2010, 16:38
Сообщение #15


Гуру
******

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



Цитата(evsx1 @ Nov 27 2010, 14:26) *
не понял разницы между &= и =
Срочно - читать Kernighan & Ritchie!
Хотя бы из разного написания, мне кажется, должно быть ясно, что это - разные операции (так же разные = и ==). Поэтому не стоит заменять в Вашей программе = на == или на &= (им нет там места). Выше kosyak© абсолютно правильно подсказал, как должен выглядеть участок Вашей программы. В других местах &= нужно так же заменить на =
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st June 2025 - 03:53
Рейтинг@Mail.ru


Страница сгенерированна за 0.01486 секунд с 7
ELECTRONIX ©2004-2016