|
|
  |
Bolymin BG320240B |
|
|
|
Jan 20 2011, 11:19
|
Частый гость
 
Группа: Участник
Сообщений: 115
Регистрация: 15-04-10
Из: Украина
Пользователь №: 56 660

|
Цитата(Сергей Борщ @ Jan 20 2011, 10:48)  Мега тут совершенно не при чем. Правила битовых операций одинаковы для любого контроллера/процессора Что я получу при такой записи? [/code] Ctrl_PORT &= (~WR); Ctrl_PORT = (0<<WR) Ctrl_PORT |= (0<<WR) [/code] 1) WR=WR&(~WR); 2) WR=0; 3) WR=WR; Правильно?
|
|
|
|
|
Jan 20 2011, 11:24
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (Pavel_Bor @ Jan 20 2011, 13:19)  Что я получу при такой записи? CODE Ctrl_PORT &= (~WR); Ctrl_PORT = (0<<WR) Ctrl_PORT |= (0<<WR) 1) WR=WR&(~WR); 2) WR=0; 3) WR=WR; Правильно? Недопонял. Чтобы сбросить бит WR вам надо написать Ctrl_PORT &= ~(1<<WR);
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 24 2011, 11:57
|
Частый гость
 
Группа: Участник
Сообщений: 115
Регистрация: 15-04-10
Из: Украина
Пользователь №: 56 660

|
Цитата(Сергей Борщ @ Jan 24 2011, 14:40)  Умный компилятор сообразил, что остаток этих функций идентичен и вместо двух идентичных кусков кода использовал один? Именно так. Как ему объяснить?
Сообщение отредактировал Pavel_Bor - Jan 24 2011, 11:58
|
|
|
|
|
Jan 24 2011, 12:39
|
Частый гость
 
Группа: Участник
Сообщений: 115
Регистрация: 15-04-10
Из: Украина
Пользователь №: 56 660

|
есть отдельный вызов на данные и на команды Код oid SendLcdCommand(unsigned char Command) { i=1; Ctrl_PORT = (1<<A0); Ctrl_PORT &=~(1<<WR); //прыгает с этой строчки Data_PORT = Command; Ctrl_PORT |= (1<<E); Delay(i); Ctrl_PORT |= (1<<WR); Ctrl_PORT &=~(1<<E); }
void SendLcdData(unsigned char Data) { i=1; Ctrl_PORT &=~(1<<WR); Ctrl_PORT &=~(1<<A0); Data_PORT = Data; Ctrl_PORT|= (1<<E); Delay(i); Ctrl_PORT |= (1<<WR); Ctrl_PORT &=~(1<<E); } команда не проходит. Следовательно я не попадаю в регистр настроек. На осциллографе сигналы RW, E видно. А сигнал А0 признаков жизни не подает, хотя в дебаге все нормально.
Сообщение отредактировал Pavel_Bor - Jan 24 2011, 14:13
|
|
|
|
|
Jan 25 2011, 07:12
|
Частый гость
 
Группа: Участник
Сообщений: 115
Регистрация: 15-04-10
Из: Украина
Пользователь №: 56 660

|
Замыканий нет. Сейчас подрыгаю ногой в цикле. Шевелится. Состояние ножек WR, E меняется намного чаще чем А0. При добавлении времени задержки до 100, при А0="1" сигнал видно. Выдачу команд или данных определяю следующим образом. Код void SendLcd(unsigned char Command) { if (key) { Ctrl_PORT |= (1<<A0); key=0; } else { Ctrl_PORT &=~(1<<A0); } Ctrl_PORT &=~(1<<WR); Data_PORT = Command; Delay(2); Ctrl_PORT |= (1<<E); Delay(1); Ctrl_PORT |= (1<<WR); Ctrl_PORT &=~(1<<E); } Странно, но ножка DSF (PE5), отвечающая за вкл/выкл индикатора, находится всегда в "1". Отключил мегу от жки DSF в "0". Индикатор все еще не запускается.
Сообщение отредактировал Pavel_Bor - Jan 25 2011, 12:02
|
|
|
|
|
Feb 14 2011, 14:21
|
Частый гость
 
Группа: Свой
Сообщений: 82
Регистрация: 17-09-06
Пользователь №: 20 471

|
Цитата(Pavel_Bor @ Feb 14 2011, 18:54)  Попробовал подкинуть кнопки, не заработали. Посмотрел на ножки кварца, он не стартует.. Кварц живой, проверял на асме. Подскажите как правильно инициализировать кварц на С для Xmega128A3. Попробуйте: CLKSYS_XOSC_Config(OSC_FRQRANGE_2TO9_gc, false, OSC_XOSCSEL_XTAL_16KCLK_gc ); CLKSYS_Prescalers_Config( CLK_PSADIV_1_gc, CLK_PSBCDIV_1_1_gc ); //разрешение работы кварца и внутреннего RC 32 кГц OSC.CTRL=OSC_XOSCEN_bm|OSC_RC32KEN_bm; do {} while ( CLKSYS_IsReady( OSC_XOSCEN_bm ) == 0 ); CLKSYS_Main_ClockSource_Select( CLK_SCLKSEL_XOSC_gc );
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|