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

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

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

Ответ
 
Опции темы Опции просмотра
Старый 30.10.2008, 12:31   #1
alexaf
Junior Member
 
Регистрация: 23.12.2007
Возраст: 35
Сообщений: 20
Вес репутации: 100/44
alexaf will become famous soon enoughalexaf will become famous soon enough
По умолчанию проблема с портами A,E в PIC16F877 (всегда 0х00)

Добрый день. Подключаю к PIC16F877 клавиатуру 3х3. строки подключены к PORTA 3-5, столбцы к PORTE 0-3, + выводы PORTE 0-3 подключены на землю через резисторы 1К. Программа, соответственно, несложная,но...обнаружилась странная проблема - при считывании значений из PORTA, PORTE там всегда 0х00, хотя на PORTА 1 у меня висит светодиод и он горит!
В связи с этим написал я следующий тест записи-чтения портов:

Код:
unsigned short poa;
unsigned short poe;
 
PORTA = 0b11111111;
Delay_ms(100);
poa = PORTA;
Delay_ms(100);
     SerString("PA = ");
     for (i = 1; i<=8; i++)
            {
                  Soft_Uart_Write((poa & 0x01)+48);
                  poa = poa >> 1;
            }
     SerString("\n\r");
poa = 0b11111111;
     SerString("poa = ");
     for (i = 1; i<=8; i++)
            {
                  Soft_Uart_Write((poa & 0x01)+48);
                  poa = poa >> 1;
            }
     SerString("\n\r");
 
PORTA = 0b10101010;
Delay_ms(100);
poa = PORTA;
Delay_ms(100);
     SerString("PA = ");
     for (i = 1; i<=8; i++)
            {
                  Soft_Uart_Write((poa & 0x01)+48);
                  poa = poa >> 1;
            }
     SerString("\n\r");
poa = 0b10101010;
     SerString("poa = ");
     for (i = 1; i<=8; i++)
            {
                  Soft_Uart_Write((poa & 0x01)+48);
                  poa = poa >> 1;
            }
     SerString("\n\r");
 
PORTA = 0b01010101;
Delay_ms(100);
poa = PORTA;
Delay_ms(100);
     SerString("PA = ");
     for (i = 1; i<=8; i++)
            {
                  Soft_Uart_Write((poa & 0x01)+48);
                  poa = poa >> 1;
            }
     SerString("\n\r");
poa = 0b01010101;
     SerString("poa = ");
     for (i = 1; i<=8; i++)
            {
                  Soft_Uart_Write((poa & 0x01)+48);
                  poa = poa >> 1;
            }
     SerString("\n\r");
 
PORTA = 0b00000000;
poa = PORTA;
     SerString("PA = ");
     for (i = 1; i<=8; i++)
            {
                  Soft_Uart_Write((poa & 0x01)+48);
                  poa = poa >> 1;
            }
     SerString("\n\r");
poa = 0b00000000;
     SerString("poa = ");
     for (i = 1; i<=8; i++)
            {
                  Soft_Uart_Write((poa & 0x01)+48);
                  poa = poa >> 1;
            }
     SerString("\n\r");
PORTE = 0b11111111;
poe = PORTE;
     SerString("PE = ");
     for (i = 1; i<=8; i++)
            {
                  Soft_Uart_Write((poe & 0x01)+48);
                  poe = poe >> 1;
            }
     SerString("\n\r");
poe = 0b11111111;
     SerString("poe = ");
     for (i = 1; i<=8; i++)
            {
                  Soft_Uart_Write((poe & 0x01)+48);
                  poe = poe >> 1;
            }
     SerString("\n\r");
 
PORTE = 0b01010101;
poe = PORTE;
     SerString("PE = ");
     for (i = 1; i<=8; i++)
            {
                  Soft_Uart_Write((poe & 0x01)+48);
                  poe = poe >> 1;
            }
     SerString("\n\r");
poe = 0b01010101;
     SerString("poe = ");
     for (i = 1; i<=8; i++)
            {
                  Soft_Uart_Write((poe & 0x01)+48);
                  poe = poe >> 1;
            }
     SerString("\n\r");
 
PORTE = 0b10101010;
poe = PORTE;
     SerString("PE = ");
     for (i = 1; i<=8; i++)
            {
                  Soft_Uart_Write((poe & 0x01)+48);
                  poe = poe >> 1;
            }
     SerString("\n\r");
poe = 0b10101010;
     SerString("poe = ");
     for (i = 1; i<=8; i++)
            {
                  Soft_Uart_Write((poe & 0x01)+48);
                  poe = poe >> 1;
            }
     SerString("\n\r");
 
PORTE = 0b00000000;
poe = PORTE;
     SerString("PE = ");
     for (i = 1; i<=8; i++)
            {
                  Soft_Uart_Write((poe & 0x01)+48);
                  poe = poe >> 1;
            }
     SerString("\n\r");
poe = 0b00000000;
     SerString("poe = ");
     for (i = 1; i<=8; i++)
            {
                  Soft_Uart_Write((poe & 0x01)+48);
                  poe = poe >> 1;
            }
     SerString("\n\r");
 
PORTA = 0b11001100;
Delay_ms(100);
     SerString("PA = ");
     for (i = 1; i<=8; i++)
            {
                  Soft_Uart_Write((PORTA & 0x01)+48);
                  PORTA = PORTA >> 1;
            }
     SerString("\n\r");
 
 
 
 
PORTB = 0b01010101;
poe = PORTB;
     SerString("PB = ");
     for (i = 1; i<=8; i++)
            {
                  Soft_Uart_Write((poe & 0x01)+48);
                  poe = poe >> 1;
            }
     SerString("\n\r");
PORTB = 0b10101010;
poe = PORTB;
     SerString("PB = ");
     for (i = 1; i<=8; i++)
            {
                  Soft_Uart_Write((poe & 0x01)+48);
                  poe = poe >> 1;
            }
     SerString("\n\r");
 
PORTC = 0b01010101;
poe = PORTC;
     SerString("PC = ");
     for (i = 1; i<=8; i++)
            {
                  Soft_Uart_Write((poe & 0x01)+48);
                  poe = poe >> 1;
            }
     SerString("\n\r");
PORTC = 0b10101010;
poe = PORTC;
     SerString("PC = ");
     for (i = 1; i<=8; i++)
            {
                  Soft_Uart_Write((poe & 0x01)+48);
                  poe = poe >> 1;
            }
     SerString("\n\r");
в порты записываются значения, потом порты считываются в переменные и побитно выводятся в терминал по РС232. также ие же значения просто заносятся в переменные и распечатываются.
результат: что бы я не писал в PORTA, PORTE там всегда 0х00. PORTВ, PORTС - почти все ок, кроме теста 0b01010101, 0b10101010 - ошибка в одном разряде. Вставлял задержки (есть в тесте) не помогает. Подозреваю что это все как-то связано с чтением-модификацией-записью, но почему тогда только с портами А и Е четкая проблема? Подскажите, если кто знает как это победить?
alexaf вне форума   Ответить с цитированием
Старый 30.10.2008, 12:34   #2
DL36
Senior Member
 
Регистрация: 25.02.2007
Адрес: Херсон
Сообщений: 3,642
Вес репутации: 1983/101
DL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant future
По умолчанию Ответ: проблема с портами A,E в PIC16F877 (всегда 0х00)

А где настройка портов? Отключение аналоговых входов.

Такие вопросы, это к студентам.
DL36 вне форума   Ответить с цитированием
Старый 30.10.2008, 12:34   #3
IgorV
Senior Member
 
Аватар для IgorV
 
Регистрация: 25.02.2007
Адрес: всем пока
Возраст: 49
Сообщений: 4,100
Вес репутации: 1883/105
IgorV has a brilliant futureIgorV has a brilliant futureIgorV has a brilliant futureIgorV has a brilliant futureIgorV has a brilliant futureIgorV has a brilliant futureIgorV has a brilliant futureIgorV has a brilliant futureIgorV has a brilliant futureIgorV has a brilliant futureIgorV has a brilliant future
Отправить сообщение для IgorV с помощью Skype™
По умолчанию Ответ: проблема с портами A,E в PIC16F877 (всегда 0х00)

Цитата:
Сообщение от alexaf Посмотреть сообщение
Добрый день. Подключаю к PIC16F877 клавиатуру 3х3. строки подключены к PORTA 3-5, столбцы к PORTE 0-3, + выводы PORTE 0-3 подключены на землю через резисторы 1К. Программа, соответственно, несложная,но...обнаружилась странная проблема - при считывании значений из PORTA, PORTE там всегда 0х00, хотя на PORTА 1 у меня висит светодиод и он горит!
В связи с этим написал я следующий тест записи-чтения портов:

Код:
unsigned short poa;
unsigned short poe;
 
PORTA = 0b11111111;
Delay_ms(100);
poa = PORTA;
Delay_ms(100);
     SerString("PA = ");
     for (i = 1; i<=8; i++)
            {
                  Soft_Uart_Write((poa & 0x01)+48);
                  poa = poa >> 1;
            }
     SerString("\n\r");
poa = 0b11111111;
     SerString("poa = ");
     for (i = 1; i<=8; i++)
            {
                  Soft_Uart_Write((poa & 0x01)+48);
                  poa = poa >> 1;
            }
     SerString("\n\r");
 
PORTA = 0b10101010;
Delay_ms(100);
poa = PORTA;
Delay_ms(100);
     SerString("PA = ");
     for (i = 1; i<=8; i++)
            {
                  Soft_Uart_Write((poa & 0x01)+48);
                  poa = poa >> 1;
            }
     SerString("\n\r");
poa = 0b10101010;
     SerString("poa = ");
     for (i = 1; i<=8; i++)
            {
                  Soft_Uart_Write((poa & 0x01)+48);
                  poa = poa >> 1;
            }
     SerString("\n\r");
 
PORTA = 0b01010101;
Delay_ms(100);
poa = PORTA;
Delay_ms(100);
     SerString("PA = ");
     for (i = 1; i<=8; i++)
            {
                  Soft_Uart_Write((poa & 0x01)+48);
                  poa = poa >> 1;
            }
     SerString("\n\r");
poa = 0b01010101;
     SerString("poa = ");
     for (i = 1; i<=8; i++)
            {
                  Soft_Uart_Write((poa & 0x01)+48);
                  poa = poa >> 1;
            }
     SerString("\n\r");
 
PORTA = 0b00000000;
poa = PORTA;
     SerString("PA = ");
     for (i = 1; i<=8; i++)
            {
                  Soft_Uart_Write((poa & 0x01)+48);
                  poa = poa >> 1;
            }
     SerString("\n\r");
poa = 0b00000000;
     SerString("poa = ");
     for (i = 1; i<=8; i++)
            {
                  Soft_Uart_Write((poa & 0x01)+48);
                  poa = poa >> 1;
            }
     SerString("\n\r");
PORTE = 0b11111111;
poe = PORTE;
     SerString("PE = ");
     for (i = 1; i<=8; i++)
            {
                  Soft_Uart_Write((poe & 0x01)+48);
                  poe = poe >> 1;
            }
     SerString("\n\r");
poe = 0b11111111;
     SerString("poe = ");
     for (i = 1; i<=8; i++)
            {
                  Soft_Uart_Write((poe & 0x01)+48);
                  poe = poe >> 1;
            }
     SerString("\n\r");
 
PORTE = 0b01010101;
poe = PORTE;
     SerString("PE = ");
     for (i = 1; i<=8; i++)
            {
                  Soft_Uart_Write((poe & 0x01)+48);
                  poe = poe >> 1;
            }
     SerString("\n\r");
poe = 0b01010101;
     SerString("poe = ");
     for (i = 1; i<=8; i++)
            {
                  Soft_Uart_Write((poe & 0x01)+48);
                  poe = poe >> 1;
            }
     SerString("\n\r");
 
PORTE = 0b10101010;
poe = PORTE;
     SerString("PE = ");
     for (i = 1; i<=8; i++)
            {
                  Soft_Uart_Write((poe & 0x01)+48);
                  poe = poe >> 1;
            }
     SerString("\n\r");
poe = 0b10101010;
     SerString("poe = ");
     for (i = 1; i<=8; i++)
            {
                  Soft_Uart_Write((poe & 0x01)+48);
                  poe = poe >> 1;
            }
     SerString("\n\r");
 
PORTE = 0b00000000;
poe = PORTE;
     SerString("PE = ");
     for (i = 1; i<=8; i++)
            {
                  Soft_Uart_Write((poe & 0x01)+48);
                  poe = poe >> 1;
            }
     SerString("\n\r");
poe = 0b00000000;
     SerString("poe = ");
     for (i = 1; i<=8; i++)
            {
                  Soft_Uart_Write((poe & 0x01)+48);
                  poe = poe >> 1;
            }
     SerString("\n\r");
 
PORTA = 0b11001100;
Delay_ms(100);
     SerString("PA = ");
     for (i = 1; i<=8; i++)
            {
                  Soft_Uart_Write((PORTA & 0x01)+48);
                  PORTA = PORTA >> 1;
            }
     SerString("\n\r");
 
 
 
 
PORTB = 0b01010101;
poe = PORTB;
     SerString("PB = ");
     for (i = 1; i<=8; i++)
            {
                  Soft_Uart_Write((poe & 0x01)+48);
                  poe = poe >> 1;
            }
     SerString("\n\r");
PORTB = 0b10101010;
poe = PORTB;
     SerString("PB = ");
     for (i = 1; i<=8; i++)
            {
                  Soft_Uart_Write((poe & 0x01)+48);
                  poe = poe >> 1;
            }
     SerString("\n\r");
 
PORTC = 0b01010101;
poe = PORTC;
     SerString("PC = ");
     for (i = 1; i<=8; i++)
            {
                  Soft_Uart_Write((poe & 0x01)+48);
                  poe = poe >> 1;
            }
     SerString("\n\r");
PORTC = 0b10101010;
poe = PORTC;
     SerString("PC = ");
     for (i = 1; i<=8; i++)
            {
                  Soft_Uart_Write((poe & 0x01)+48);
                  poe = poe >> 1;
            }
     SerString("\n\r");
в порты записываются значения, потом порты считываются в переменные и побитно выводятся в терминал по РС232. также ие же значения просто заносятся в переменные и распечатываются.
результат: что бы я не писал в PORTA, PORTE там всегда 0х00. PORTВ, PORTС - почти все ок, кроме теста 0b01010101, 0b10101010 - ошибка в одном разряде. Вставлял задержки (есть в тесте) не помогает. Подозреваю что это все как-то связано с чтением-модификацией-записью, но почему тогда только с портами А и Е четкая проблема? Подскажите, если кто знает как это победить?
АЦП отключено?
IgorV вне форума   Ответить с цитированием
Старый 30.10.2008, 12:36   #4
IgorV
Senior Member
 
Аватар для IgorV
 
Регистрация: 25.02.2007
Адрес: всем пока
Возраст: 49
Сообщений: 4,100
Вес репутации: 1883/105
IgorV has a brilliant futureIgorV has a brilliant futureIgorV has a brilliant futureIgorV has a brilliant futureIgorV has a brilliant futureIgorV has a brilliant futureIgorV has a brilliant futureIgorV has a brilliant futureIgorV has a brilliant futureIgorV has a brilliant futureIgorV has a brilliant future
Отправить сообщение для IgorV с помощью Skype™
По умолчанию Ответ: проблема с портами A,E в PIC16F877 (всегда 0х00)

PORTE = 0b10101010; вот это круто!
IgorV вне форума   Ответить с цитированием
Старый 30.10.2008, 12:41   #5
alexaf
Junior Member
 
Регистрация: 23.12.2007
Возраст: 35
Сообщений: 20
Вес репутации: 100/44
alexaf will become famous soon enoughalexaf will become famous soon enough
По умолчанию Ответ: проблема с портами A,E в PIC16F877 (всегда 0х00)

Цитата:
Сообщение от IgorV Посмотреть сообщение
АЦП отключено?
АЦП не отключал.
инициализация портов:

Код:
TRISA = 0b00000000; //TRIS a3,a4,a5 = 0 - output for keyboard lines
     PORTA = 0b00000010; //a3,a4,a5 = 0 - default output value for keyboard lines, a0 = 1 - switch on led1 (test)
 
     TRISE = 0b00000111; //TRIS e0,e1,e2 = 1 - input for keyboard columns
     PORTE = 0b00000000; //e0,e1,e2 = 1 - default input value for keyboard columns
alexaf вне форума   Ответить с цитированием
Старый 30.10.2008, 12:42   #6
alexaf
Junior Member
 
Регистрация: 23.12.2007
Возраст: 35
Сообщений: 20
Вес репутации: 100/44
alexaf will become famous soon enoughalexaf will become famous soon enough
По умолчанию Ответ: проблема с портами A,E в PIC16F877 (всегда 0х00)

Цитата:
Сообщение от IgorV Посмотреть сообщение
PORTE = 0b10101010; вот это круто!
вопрос не в том сколько разрядов имеет порт Е. младшие 3 разряда запишутся правильно
alexaf вне форума   Ответить с цитированием
Старый 30.10.2008, 12:45   #7
alexaf
Junior Member
 
Регистрация: 23.12.2007
Возраст: 35
Сообщений: 20
Вес репутации: 100/44
alexaf will become famous soon enoughalexaf will become famous soon enough
По умолчанию Ответ: проблема с портами A,E в PIC16F877 (всегда 0х00)

Вобщем как я понял пока шаг №1 - отключить аналоговые входы. Это необходимое условие, которое я не сделал.
alexaf вне форума   Ответить с цитированием
Старый 30.10.2008, 12:50   #8
petrd
Senior Member
 
Регистрация: 09.02.2008
Адрес: Воронеж
Возраст: 47
Сообщений: 1,803
Вес репутации: 2039/81
petrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond repute
Отправить сообщение для petrd с помощью ICQ
По умолчанию Ответ: проблема с портами A,E в PIC16F877 (всегда 0х00)

Сделайте все выводы как цифровые входы-выходы командой:
Код:
ADCON1=7;
__________________
License MikroC, MikroC PRO and EasyPIC5 by mikroElektronika (the dead mikroICD replaced PICKit2 & PICKit3)

Последний раз редактировалось IgorV; 30.10.2008 в 13:49.
petrd вне форума   Ответить с цитированием
Старый 30.10.2008, 12:52   #9
IgorV
Senior Member
 
Аватар для IgorV
 
Регистрация: 25.02.2007
Адрес: всем пока
Возраст: 49
Сообщений: 4,100
Вес репутации: 1883/105
IgorV has a brilliant futureIgorV has a brilliant futureIgorV has a brilliant futureIgorV has a brilliant futureIgorV has a brilliant futureIgorV has a brilliant futureIgorV has a brilliant futureIgorV has a brilliant futureIgorV has a brilliant futureIgorV has a brilliant futureIgorV has a brilliant future
Отправить сообщение для IgorV с помощью Skype™
По умолчанию Ответ: проблема с портами A,E в PIC16F877 (всегда 0х00)

Цитата:
Сообщение от alexaf Посмотреть сообщение
Вобщем как я понял пока шаг №1 - отключить аналоговые входы. Это необходимое условие, которое я не сделал.
шаг 2
PORTE = 0b11111111;
poe = PORTE;

слишком быстро хочется обратно. На 20МГц и/или при наличии на выходах достаточной емкости будет читаться не то что записано.
IgorV вне форума   Ответить с цитированием
Старый 30.10.2008, 12:54   #10
fantom
Senior Member
 
Регистрация: 27.02.2007
Адрес: Рязань
Возраст: 44
Сообщений: 2,610
Вес репутации: 2570/97
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
По умолчанию Ответ: проблема с портами A,E в PIC16F877 (всегда 0х00)

Цитата:
Сообщение от alexaf Посмотреть сообщение
Вобщем как я понял пока шаг №1 - отключить аналоговые входы. Это необходимое условие, которое я не сделал.
Не.... Шаг №1 - чтение даташита. Этого ты не сделал.
fantom вне форума   Ответить с цитированием
Старый 30.10.2008, 13:05   #11
alexaf
Junior Member
 
Регистрация: 23.12.2007
Возраст: 35
Сообщений: 20
Вес репутации: 100/44
alexaf will become famous soon enoughalexaf will become famous soon enough
По умолчанию Ответ: проблема с портами A,E в PIC16F877 (всегда 0х00)

Цитата:
Сообщение от petrd Посмотреть сообщение
Сделайте все выводы как цифровые входы-выходы командой:
Код:
ADCON1=7;
уже прочитал. Этого достаточно или, все-таки, следует отключить модуль АЦП через ADCON0 0?
alexaf вне форума   Ответить с цитированием
Старый 30.10.2008, 13:20   #12
petrd
Senior Member
 
Регистрация: 09.02.2008
Адрес: Воронеж
Возраст: 47
Сообщений: 1,803
Вес репутации: 2039/81
petrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond repute
Отправить сообщение для petrd с помощью ICQ
По умолчанию Ответ: проблема с портами A,E в PIC16F877 (всегда 0х00)

Цитата:
Сообщение от alexaf Посмотреть сообщение
уже прочитал. Этого достаточно или, все-таки, следует отключить модуль АЦП через ADCON0 0?
ADCON1=7, будет достаточно.
__________________
License MikroC, MikroC PRO and EasyPIC5 by mikroElektronika (the dead mikroICD replaced PICKit2 & PICKit3)
petrd вне форума   Ответить с цитированием
Старый 30.10.2008, 13:54   #13
alexaf
Junior Member
 
Регистрация: 23.12.2007
Возраст: 35
Сообщений: 20
Вес репутации: 100/44
alexaf will become famous soon enoughalexaf will become famous soon enough
По умолчанию Ответ: проблема с портами A,E в PIC16F877 (всегда 0х00)

Цитата:
Сообщение от IgorV Посмотреть сообщение
шаг 2
PORTE = 0b11111111;
poe = PORTE;

слишком быстро хочется обратно. На 20МГц и/или при наличии на выходах достаточной емкости будет читаться не то что записано.
то есть необходимо ставить небольшую задержку после записи в регистр перед чтением из него?
alexaf вне форума   Ответить с цитированием
Старый 30.10.2008, 16:43   #14
IgorV
Senior Member
 
Аватар для IgorV
 
Регистрация: 25.02.2007
Адрес: всем пока
Возраст: 49
Сообщений: 4,100
Вес репутации: 1883/105
IgorV has a brilliant futureIgorV has a brilliant futureIgorV has a brilliant futureIgorV has a brilliant futureIgorV has a brilliant futureIgorV has a brilliant futureIgorV has a brilliant futureIgorV has a brilliant futureIgorV has a brilliant futureIgorV has a brilliant futureIgorV has a brilliant future
Отправить сообщение для IgorV с помощью Skype™
По умолчанию Ответ: проблема с портами A,E в PIC16F877 (всегда 0х00)

Цитата:
Сообщение от alexaf Посмотреть сообщение
то есть необходимо ставить небольшую задержку после записи в регистр перед чтением из него?
да
IgorV вне форума   Ответить с цитированием
Старый 26.11.2008, 22:22   #15
alexaf
Junior Member
 
Регистрация: 23.12.2007
Возраст: 35
Сообщений: 20
Вес репутации: 100/44
alexaf will become famous soon enoughalexaf will become famous soon enough
По умолчанию Ответ: проблема с портами A,E в PIC16F877 (всегда 0х00)

заработало на 30%, т.е. управляется только вывод РА3. РА4 и РА5 по прежнему не меняется.
Код:
void main() {     ADCON1 = 7;      TRISA = 0b00000000; //TRIS a3,a4,a5 = 0 - output for keyboard lines     PORTA = 0b00000010; //a3,a4,a5 = 1 - default output value for keyboard lines, a0 = 1 - switch on led1 (test)          TRISE = 0b00000111; //TRIS e0,e1,e2 = 1 - input for keyboard columns     PORTE = 0b00000000; //e0,e1,e2 = 1 - default input value for keyboard columns...............do {    //check keyboard button pushed    res = -1;        PORTA = 0b00001010; //set 0 on the first line of keyboardDelay_ms(100);      if ((PORTE & 0b00000001) == 0b00000001)      {         res = 1;         SerString(&quot;нажата кнопка 1\n\r&quot;);      }      else if ((PORTE & 0b00000010) == 0b00000010)      {         res = 2;         SerString(&quot;нажата кнопка 2\n\r&quot;);      }      else if ((PORTE & 0b00000100) == 0b00000100)      {         res = 3;         SerString(&quot;нажата кнопка 3\n\r&quot;);      }      printPORTsAEstare();Delay_ms(100);      PORTA = 0b00010010; //set 0 on the second line of keyboard      Delay_ms(100);      if ((PORTE & 0b00000001) == 0b00000001)      {         res = 4;         SerString(&quot;нажата кнопка 4\n\r&quot;);      }      else if ((PORTE & 0b00000010) == 0b00000010)      {         res = 5;         SerString(&quot;нажата кнопка 5\n\r&quot;);      }      else if ((PORTE & 0b00000100) == 0b00000100)      {         res = 6;         SerString(&quot;нажата кнопка 6\n\r&quot;);      }      printPORTsAEstare();      Delay_ms(100);      PORTA &= 0b00100010; //set 0 on the third line of keyboard      Delay_ms(100);      if ((PORTE & 0b00000001) == 0b00000001)      {         res = 7;         SerString(&quot;нажата кнопка 7\n\r&quot;);      }      else if ((PORTE & 0b00000010) == 0b00000010)      {         res = 8;         SerString(&quot;нажата кнопка 8\n\r&quot;);      }      else if ((PORTE & 0b00000100) == 0b00000100)      {         res = 9;         SerString(&quot;нажата кнопка 9\n\r&quot;);      }      printPORTsAEstare();      PORTA = 0b00000010; //set 1 on the third line of keyboardDelay_ms(100);      ..................}}
при записи 1 в РА4,5 там все равно оказывается 0. С РА3 все нормально. что это может быть?
alexaf вне форума   Ответить с цитированием
Старый 26.11.2008, 23:00   #16
majorPAE
Super Moderator
 
Аватар для majorPAE
 
Регистрация: 26.02.2007
Возраст: 57
Сообщений: 2,221
Вес репутации: 2214/90
majorPAE has a reputation beyond reputemajorPAE has a reputation beyond reputemajorPAE has a reputation beyond reputemajorPAE has a reputation beyond reputemajorPAE has a reputation beyond reputemajorPAE has a reputation beyond reputemajorPAE has a reputation beyond reputemajorPAE has a reputation beyond reputemajorPAE has a reputation beyond reputemajorPAE has a reputation beyond reputemajorPAE has a reputation beyond repute
Отправить сообщение для majorPAE с помощью ICQ Отправить сообщение для majorPAE с помощью Skype™
По умолчанию Ответ: проблема с портами A,E в PIC16F877 (всегда 0х00)

А компараторы отключены?
__________________
ЗАКОH ТРУДHОСТЕЙ БИЛЛИHГСА: Большинство тpyдностей пpоисходит оттого, что мы слишком быстpо говоpим ДА и недостаточно быстpо - НЕТ.(с)
"Очередной шаг вперед, как правило, результат хорошего пинка в зад!"(С)
majorPAE на форуме   Ответить с цитированием
Старый 26.11.2008, 23:40   #17
DenisPic
Senior Member
 
Аватар для DenisPic
 
Регистрация: 25.02.2007
Возраст: 38
Сообщений: 149
Вес репутации: 186/48
DenisPic has a spectacular aura aboutDenisPic has a spectacular aura about
Отправить сообщение для DenisPic с помощью ICQ
По умолчанию Ответ: проблема с портами A,E в PIC16F877 (всегда 0х00)

Цитата:
Сообщение от alexaf Посмотреть сообщение
заработало на 30%, т.е. управляется только вывод РА3. РА4 и РА5 по прежнему не меняетсяпри записи 1 в РА4,5 там все равно оказывается 0. С РА3 все нормально. что это может быть?
тебеже fantom написал :
Не.... Шаг №1 - чтение даташита. Этого ты не сделал.
__________________
====================================
DenisPic вне форума   Ответить с цитированием
Старый 26.11.2008, 23:53   #18
alexaf
Junior Member
 
Регистрация: 23.12.2007
Возраст: 35
Сообщений: 20
Вес репутации: 100/44
alexaf will become famous soon enoughalexaf will become famous soon enough
По умолчанию Ответ: проблема с портами A,E в PIC16F877 (всегда 0х00)

Цитата:
Сообщение от majorPAE Посмотреть сообщение
А компараторы отключены?
все отключил:
Код:
     ADCON1 = 7;     ADCON0 = 7;     CCP1CON = 0;     CCP2CON = 0;
все равно в порту А из 3,4,5 битов только 3й меняется!
alexaf вне форума   Ответить с цитированием
Старый 27.11.2008, 00:47   #19
masterzx
Senior Member
 
Аватар для masterzx
 
Регистрация: 21.09.2007
Адрес: Барнаул
Возраст: 33
Сообщений: 1,503
Вес репутации: 826/67
masterzx is a splendid one to beholdmasterzx is a splendid one to beholdmasterzx is a splendid one to beholdmasterzx is a splendid one to beholdmasterzx is a splendid one to beholdmasterzx is a splendid one to beholdmasterzx is a splendid one to behold
Отправить сообщение для masterzx с помощью ICQ
По умолчанию Ответ: проблема с портами A,E в PIC16F877 (всегда 0х00)

Цитата:
Сообщение от alexaf Посмотреть сообщение
заработало на 30%, т.е. управляется только вывод РА3. РА4 и РА5 по прежнему не меняется.
Код:
void main() {     ADCON1 = 7;      TRISA = 0b00000000; //TRIS a3,a4,a5 = 0 - output for keyboard lines     PORTA = 0b00000010; //a3,a4,a5 = 1 - default output value for keyboard lines, a0 = 1 - switch on led1 (test)          TRISE = 0b00000111; //TRIS e0,e1,e2 = 1 - input for keyboard columns     PORTE = 0b00000000; //e0,e1,e2 = 1 - default input value for keyboard columns...............do {    //check keyboard button pushed    res = -1;        PORTA = 0b00001010; //set 0 on the first line of keyboardDelay_ms(100);      if ((PORTE & 0b00000001) == 0b00000001)      {         res = 1;         SerString(&quot;нажата кнопка 1\n\r&quot;);      }      else if ((PORTE & 0b00000010) == 0b00000010)      {         res = 2;         SerString(&quot;нажата кнопка 2\n\r&quot;);      }      else if ((PORTE & 0b00000100) == 0b00000100)      {         res = 3;         SerString(&quot;нажата кнопка 3\n\r&quot;);      }      printPORTsAEstare();Delay_ms(100);      PORTA = 0b00010010; //set 0 on the second line of keyboard      Delay_ms(100);      if ((PORTE & 0b00000001) == 0b00000001)      {         res = 4;         SerString(&quot;нажата кнопка 4\n\r&quot;);      }      else if ((PORTE & 0b00000010) == 0b00000010)      {         res = 5;         SerString(&quot;нажата кнопка 5\n\r&quot;);      }      else if ((PORTE & 0b00000100) == 0b00000100)      {         res = 6;         SerString(&quot;нажата кнопка 6\n\r&quot;);      }      printPORTsAEstare();      Delay_ms(100);      PORTA &= 0b00100010; //set 0 on the third line of keyboard      Delay_ms(100);      if ((PORTE & 0b00000001) == 0b00000001)      {         res = 7;         SerString(&quot;нажата кнопка 7\n\r&quot;);      }      else if ((PORTE & 0b00000010) == 0b00000010)      {         res = 8;         SerString(&quot;нажата кнопка 8\n\r&quot;);      }      else if ((PORTE & 0b00000100) == 0b00000100)      {         res = 9;         SerString(&quot;нажата кнопка 9\n\r&quot;);      }      printPORTsAEstare();      PORTA = 0b00000010; //set 1 on the third line of keyboardDelay_ms(100);      ..................}}
при записи 1 в РА4,5 там все равно оказывается 0. С РА3 все нормально. что это может быть?
у тебя и в компияторе весь код в одну строчку поди?

Код:
void main() {
   ADCON1 = 7;
  TRISA = 0b00000000; //TRIS a3,a4,a5 = 0 - output for keyboard lines
   PORTA = 0b00000010; //a3,a4,a5 = 1 - default output value for keyboard lines, a0 = 1 - switch on led1 (test)
   TRISE = 0b00000111; //TRIS e0,e1,e2 = 1 - input for keyboard columns
  PORTE = 0b00000000; //e0,e1,e2 = 1 - default input value for keyboard columns...............
   do {    //check keyboard button pushed
  res = -1;
   PORTA = 0b00001010; //set 0 on the first line of keyboardDelay_ms(100);
  if ((PORTE & 0b00000001) == 0b00000001) {
  res = 1;
  SerString(&quot;нажата кнопка 1\n\r&quot;);
    }
  else if ((PORTE & 0b00000010) == 0b00000010)  {
  res = 2;
 SerString(&quot;нажата кнопка 2\n\r&quot;);
                  }
   else if ((PORTE & 0b00000100) == 0b00000100)   {
                 res = 3;
   SerString(&quot;нажата кнопка 3\n\r&quot;);
                  }
  printPORTsAEstare();
  Delay_ms(100);
  PORTA = 0b00010010; //set 0 on the second line of keyboard
  Delay_ms(100);
  if ((PORTE & 0b00000001) == 0b00000001)      {
  res = 4;
  SerString(&quot;нажата кнопка 4\n\r&quot;);
        }
else if ((PORTE & 0b00000010) == 0b00000010)      {
res = 5;
 SerString(&quot;нажата кнопка 5\n\r&quot;);
     }
   else if ((PORTE & 0b00000100) == 0b00000100)      {
     res = 6;         SerString(&quot;нажата кнопка 6\n\r&quot;);
        }
      printPORTsAEstare();
         Delay_ms(100);
           PORTA &= 0b00100010; //set 0 on the third line of keyboard
              Delay_ms(100);
     if ((PORTE & 0b00000001) == 0b00000001)      {
                    res = 7;
  SerString(&quot;нажата кнопка 7\n\r&quot;);      }
    else if ((PORTE & 0b00000010) == 0b00000010)      {
 res = 8;
    SerString(&quot;нажата кнопка 8\n\r&quot;);      }
  else if ((PORTE & 0b00000100) == 0b00000100)      {
  res = 9;
   SerString(&quot;нажата кнопка 9\n\r&quot;);
     }      printPORTsAEstare();
   PORTA = 0b00000010; //set 1 on the third line of keyboardDelay_ms(100);
    ..................}}
__________________
Если проблему можно решить за деньги, то это не проблема, это расходы. Еврейская мудрость.
masterzx вне форума   Ответить с цитированием
Старый 27.11.2008, 08:07   #20
petrd
Senior Member
 
Регистрация: 09.02.2008
Адрес: Воронеж
Возраст: 47
Сообщений: 1,803
Вес репутации: 2039/81
petrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond repute
Отправить сообщение для petrd с помощью ICQ
По умолчанию Ответ: проблема с портами A,E в PIC16F877 (всегда 0х00)

Цитата:
Сообщение от alexaf Посмотреть сообщение
все отключил:
Код:
     ADCON1 = 7;     ADCON0 = 7;     CCP1CON = 0;     CCP2CON = 0;
все равно в порту А из 3,4,5 битов только 3й меняется!
Посмотрите в DS - вывод RA4 - это открытый сток, нужен резистор pull-up, а также выводы RA4 и RA5 завязаны на компаратор, который управляется через регистр CMCON, надо так:
Код:
 ADCON1 = 7; 
 CMCON = 7;
__________________
License MikroC, MikroC PRO and EasyPIC5 by mikroElektronika (the dead mikroICD replaced PICKit2 & PICKit3)
petrd вне форума   Ответить с цитированием
Старый 27.11.2008, 10:45   #21
alexaf
Junior Member
 
Регистрация: 23.12.2007
Возраст: 35
Сообщений: 20
Вес репутации: 100/44
alexaf will become famous soon enoughalexaf will become famous soon enough
По умолчанию Ответ: проблема с портами A,E в PIC16F877 (всегда 0х00)

Цитата:
Сообщение от petrd Посмотреть сообщение
Посмотрите в DS - вывод RA4 - это открытый сток, нужен резистор pull-up, а также выводы RA4 и RA5 завязаны на компаратор, который управляется через регистр CMCON, надо так:
Код:
 ADCON1 = 7; 
 CMCON = 7;
Нету у меня в даташите на 16F877 регистра CMCON.
Зато есть CCP1CON REGISTER

bit 3-0
CCPxM3:CCPxM0: CCPx Mode Select bits

0000 = Capture/Compare/PWM disabled (resets CCPx module)




собственно я в него и записываю 0. по идее, это должно приводить к отключению модуля компаратора, как я понимаю.



записью 7 в ADCON1 я настраиваю RA5 как цифровой ввод/вывод. так что RA5 вроде должен работать как RA3! RA4 мультиплексирован с таймером0. вот тут может быть и надо что-то настроить...ну и, как я понял, резистор подтягивающий сюда надо

alexaf вне форума   Ответить с цитированием
Старый 27.11.2008, 11:41   #22
petrd
Senior Member
 
Регистрация: 09.02.2008
Адрес: Воронеж
Возраст: 47
Сообщений: 1,803
Вес репутации: 2039/81
petrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond repute
Отправить сообщение для petrd с помощью ICQ
По умолчанию Ответ: проблема с портами A,E в PIC16F877 (всегда 0х00)

Цитата:
Сообщение от alexaf Посмотреть сообщение
Нету у меня в даташите на 16F877 регистра CMCON.
Зато есть CCP1CON REGISTER

bit 3-0
CCPxM3:CCPxM0: CCPx Mode Select bits

0000 = Capture/Compare/PWM disabled (resets CCPx module)




собственно я в него и записываю 0. по идее, это должно приводить к отключению модуля компаратора, как я понимаю.



записью 7 в ADCON1 я настраиваю RA5 как цифровой ввод/вывод. так что RA5 вроде должен работать как RA3! RA4 мультиплексирован с таймером0. вот тут может быть и надо что-то настроить...ну и, как я понял, резистор подтягивающий сюда надо

Все правильно, компаратора в PIC16F877 нет, он есть в PIC16F877A. Поэтому CMCON у Вас нет, а CCP1CON это регистр управления модулем CCP1, к Вашему случаю он отношения не имеет. CCP не трогайте, они по сбросу выключены и на работу не влияют. А резистор на RA4 нужен.
__________________
License MikroC, MikroC PRO and EasyPIC5 by mikroElektronika (the dead mikroICD replaced PICKit2 & PICKit3)
petrd вне форума   Ответить с цитированием
Старый 27.11.2008, 11:54   #23
alexaf
Junior Member
 
Регистрация: 23.12.2007
Возраст: 35
Сообщений: 20
Вес репутации: 100/44
alexaf will become famous soon enoughalexaf will become famous soon enough
По умолчанию Ответ: проблема с портами A,E в PIC16F877 (всегда 0х00)

Цитата:
Сообщение от petrd Посмотреть сообщение
Все правильно, компаратора в PIC16F877 нет, он есть в PIC16F877A. Поэтому CMCON у Вас нет, а CCP1CON это регистр управления модулем CCP1, к Вашему случаю он отношения не имеет. CCP не трогайте, они по сбросу выключены и на работу не влияют. А резистор на RA4 нужен.
Я все равно не понимаю почему не работает RA5, когда RA3 работает? Они же идентичны по сути!
alexaf вне форума   Ответить с цитированием
Старый 27.11.2008, 12:06   #24
petrd
Senior Member
 
Регистрация: 09.02.2008
Адрес: Воронеж
Возраст: 47
Сообщений: 1,803
Вес репутации: 2039/81
petrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond repute
Отправить сообщение для petrd с помощью ICQ
По умолчанию Ответ: проблема с портами A,E в PIC16F877 (всегда 0х00)

Вот в этом месте может быть засада
Код:
PORTA &= 0b00100010; //set 0 on the third line of keyboard
этот кусок эквивалентен коду
Код:
PORTA =PORTA & 0b00100010; //set 0 on the third line of keyboard
значит Вы читаете значение на выводах PORTA, PORTA это не обычный регистр, так лучше не делать.
__________________
License MikroC, MikroC PRO and EasyPIC5 by mikroElektronika (the dead mikroICD replaced PICKit2 & PICKit3)
petrd вне форума   Ответить с цитированием
Старый 27.11.2008, 12:15   #25
alexaf
Junior Member
 
Регистрация: 23.12.2007
Возраст: 35
Сообщений: 20
Вес репутации: 100/44
alexaf will become famous soon enoughalexaf will become famous soon enough
По умолчанию Ответ: проблема с портами A,E в PIC16F877 (всегда 0х00)

Цитата:
Сообщение от petrd Посмотреть сообщение
Вот в этом месте может быть засада
Код:
PORTA &= 0b00100010; //set 0 on the third line of keyboard
этот кусок эквивалентен коду
Код:
PORTA =PORTA & 0b00100010; //set 0 on the third line of keyboard
значит Вы читаете значение на выводах PORTA, PORTA это не обычный регистр, так лучше не делать.
Видимо, Вы имеете в виду чтение-модификацию-запись? тут в тесте я могу попробовать сделать просто запись, но в большой программе как мне тогда добиваться сохранения состояния остальных не связанных с клавиатурой бит? Все равно с RA3 я проделываю такие же манипуляции и там все работает без проблем. хотя, конечно, проверить надо все варианты.
alexaf вне форума   Ответить с цитированием
Ответ


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

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
PIC16F877 проблема andr1963 Продукция MICROCHIP 3 07.10.2007 20:15


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


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