Форум myROBOT.ru » Шаг за шагом » Программирование микроконтроллеров » Использование двух выводов порта А

Страниц (1): [1]
 

1. Blitzkrieg - 20 Января, 2009 - 12:50:45 - перейти к сообщению
Не понимаю почему происходит, только начал этим увлекаться.
Набор ROBOPICA на PIC16F887
Программка на MikroC приложена на диске.
Назначаю два вывода порта А аналоговыми входами RA0 RA1. После обработки АЦП данные выводятся на встроенны LCD дисплей. НАпример в случае подключения потенциометра к любому порту вращением его ручки показания на LCD плавно изменяются от 1000 до 0.
При подключении кнопки (входит в комплект ROBOPICA) показания соответственно меняются при отжатой 1000 при нажатой 0.
А теперь Вопрос:
Подключаю две кнопки к указанным выше портам, на LCD оба показания примерно одинаковы 1000. При нажатии на одну кнопку показания снимаемые с ее порта устанавливаются в 0, а показания со второго порта в примерно 350 и соответственно при нажатии второй кнопки ситуация меняется на противоположную.
Для меня ситуация не понятна. Объясните пожалуйста. Ведь если я нажимаю первую кнопку логично если на второй показания не изменятся и остануться 1000.
При использовании третьего вывода порта А ситуация становится еще хуже.
Еще несколько озадачило следующее. Мне нужно было в программке описать ситуацию нажатия одной кнопки т.е. в случае если вывод 1 порта А устанавливается в ноль то например пропищать. Значение показания порта обозначил как I, сначала пытался сравнивать его с 0 if I=0 . На нажатие кнопки не реагировал до тех пор пока не написал в коде if I<5. То есть при нажатии кнопки показание дрыгалось с 0 до 1 где-то. :-( Все так примерно ужос. :-)
2. Blitzkrieg - 22 Января, 2009 - 10:14:26 - перейти к сообщению
Ну в чем же дело :-( попробовал в регистре ADCON0 два старших бита установить в 0 т.е. Fosc/2 показания еще сильнее упали :-(
До этого были 11 Frc
3. Белый Волк - 22 Января, 2009 - 10:37:14 - перейти к сообщению
Вы читали Datasheet к Вашему микроконтроллеру? Расскажите, что там сказано о ADC/АЦП: он многоканальный? как использовать несколько каналов одновременно? Если это представляет сложность - выложите отрезок исходного кода, отвечающий за ADC.
4. Blitzkrieg - 25 Января, 2009 - 21:48:35 - перейти к сообщению
МК многоканальный 13 каналов, если я правильно понял.
Вот исходный код, причем код из примеров к конструктору.

CODE:
#include <motor.h>
int Sensor1,Sensor2;
char Txt[6]; // Save String
void Read_Adc()
{
ADCON0=0b11001001; // Select Analog2 RC_Mode and ADON
ADCON0.GO=1; // Start Convert
while(ADCON0.GO); // Wait Until Convert Complete
Sensor1=(ADRESH*4)+(ADRESL/64); // 10 bit Data ==> Adc
ADCON0=0b11001101; // Select Analog2 RC_Mode and ADON
ADCON0.GO=1; // Start Convert
while(ADCON0.GO); // Wait Until Convert Complete
Sensor2=(ADRESH*4)+(ADRESL/64); // 10 bit Data ==> Adc
}
void main()
{
Delay_ms(1000); // Start up Delay
ANSELH.F4=0; // RBO ==> Digital IO
ANSEL=0b11111100;
TRISA=0b00001111;
Lcd_Init(&PORTD); // Initial LCD
Lcd_Cmd(LCD_CURSOR_OFF); // LCD Cursor OFF
while(PORTB.F0);
Sensor2=100; // Wait Key Press
while(1)
{
Read_Adc(); // Read Analog 2
WordToStr(Sensor1,Txt); // Convert Data to string
Lcd_Out(1,1,Txt); // Show on LCD
WordToStr(Sensor2,Txt); // Convert Data to string
Lcd_Out(2,1,Txt); // Show on LCD
5. Белый Волк - 26 Января, 2009 - 22:15:51 - перейти к сообщению
RC_Mode, видимо, говорит об измерении с использованием RC-цепочки. Возможно, в данном примере не учли, что ёмкость в RC-цепи имеет некоторое конечное время зарядки/разрядки. Попробуйте сделать небольшую паузу между конвертированиями. Если у Вас есть Datasheet к данному микроконтроллеру, постарайтесь найти в нём информацию о скорости конвертирования в различных режимах. Возможно, там есть упоминание о подобной паузе.
6. Blitzkrieg - 28 Января, 2009 - 20:32:10 - перейти к сообщению
Спасибо огромное :-) Видел что-то подобное в мануале, вы меня направили :-)
В адаптированном даташит на mikroE.com вот чего пишут
Enable A/D converter by setting the ADON bit of the ADCON0 register.

Step 3 - Configuring ADC interrupt (optionally):
Clear the ADIF bit; and
Set the ADIE, PEIE and GIE bits.

Step 4 - Wait for the required acquisition time (approximately 20uS) to pass.
То есть после выбора канала нужно обождать 20 мкс :-)
Попробовал и действительно все ок. Теперь при использовании любого из трех датчиков показания других не меняются :-)
Спасибо.