Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
17.12.2009, 17:16
|
#1
|
Частый гость
Регистрация: 16.12.2006
Сообщений: 22
Сказал спасибо: 1
Сказали Спасибо 1 раз в 1 сообщении
|
Pic16F887 аппаратный I2C через MicroC Pro
Подсключил к данному контроллеру часы DS1307, но при запросе на чтение выводятся кракозябры. Экран точно верно работает, проверено другими прошивками. В протеусе диаграммы показывают постоянно +5В на шинах.
Код:
|
char stroka[2];
unsigned int y,o;
unsigned short x;
void main()
{
Delay_ms(500);
Lcd_Init();
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Cmd(_LCD_CLEAR);
ANSEL = 0xFF;
TRISA = 0×3F;
TRISE = 0×01;
while(1)
{
I2C1_Init(50000);
I2C1_Start();
o=I2C1_Wr(0xD1);
x=I2C1_Rd(0);
I2C1_Stop();
ShortToStr(x,stroka);
if (o==0)
{
Lcd_Out(1,1,stroka);
}
Delay_ms(1000);
Lcd_Cmd(_LCD_CLEAR);
}
} |
|
|
|
|
17.12.2009, 17:30
|
#2
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Pic16F887 аппаратный I2C через MicroC Pro
Раз шпротеус вы пользовать умеете, начните с I2C дебагера. Он там в инструментах есть. И мануал почитайте на микросхему. Зуб даю, что она время в BCD формате возвращает. Для этого в микроЕ есть дополнительная библиотека для конвертирования. Могу свой пример скинуть. Тоже недавно часы делал. Только у меня на экран 2х20 выводится полная дата и время. До будильника не дошел, терпения не хватило. У меня программа на бейсике, но я вашу спокойно читаю. Вы мою тоже прочтете.
И проверьте подключение монитора. У вас переменная х несет число. Даже если там ноль, его должно быть прекрасно видно на мониторе. А конвертирование и вывод у вас верно написаны.
Последний раз редактировалось Easyrider83; 17.12.2009 в 17:32.
|
|
|
Сказали "Спасибо" Easyrider83
|
|
|
17.12.2009, 17:55
|
#3
|
Частый гость
Регистрация: 16.12.2006
Сообщений: 22
Сказал спасибо: 1
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Pic16F887 аппаратный I2C через MicroC Pro
Простите,не тот код запостил. Про bcd я знаю, меня смущает что MicroC bcd в 16тиразрядный код переводит. Может быть маски использовать для взятия тетрад
Код:
|
char stroka[2];
unsigned int y,o;
unsigned short x;
void main()
{
Delay_ms(500);
Lcd_Init();
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Cmd(_LCD_CLEAR);
ANSEL = 0xFF;
TRISA = 0×3F;
TRISE = 0×01;
while(1)
{
I2C1_Init(50000);
I2C1_Start();
o=I2C1_Wr(0xD1);
x=I2C1_Rd(0);
I2C1_Stop();
y=Bcd2Dec16(x);
IntToStr(y,stroka);
if (o==0)
{
Lcd_Out(1,1,stroka);
}
Delay_ms(1000);
Lcd_Cmd(_LCD_CLEAR);
}
} |
|
|
|
|
17.12.2009, 18:28
|
#4
|
Частый гость
Регистрация: 16.12.2006
Сообщений: 22
Сказал спасибо: 1
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Pic16F887 аппаратный I2C через MicroC Pro
Еще вопрос, у вас используется софтверный I2C, а для аппаратного надо ли так же прописывать контакты ?
|
|
|
|
18.12.2009, 21:29
|
#5
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Pic16F887 аппаратный I2C через MicroC Pro
Сообщение от GunFighter
|
Еще вопрос, у вас используется софтверный I2C, а для аппаратного надо ли так же прописывать контакты ?
|
Давайте по порядку. Аппаратному контакты прописывать не надо т.к. библиотека знает, на каких контактах он сидит и никуда он оттуда не денется. Это касается всей переферии МК в целом. Преимущество встроенных модулей - буфер, который работает на прием пока исполняется ваша программа. Со встроенным вы не потеряете нужные вам данные.
Софтварные библиотеки не очень хороши. Жрут много памяти, не понятно, как работают с прерываниями, но для простейших задач подходят. Их использовать только при крайней необходимости.
Прерывания с ними обрабатывать сложнее. Но это отдельная тема. Надо, чтобы прерывание вызывалось по тревоге с порта, на котором висит ваш интерфейс. Тогда без буфера можно успевать перехватывать поступающие данные. Но любое прерывание должно быть предусмотрено в программе. Есть моменты, когда на половине вычислений вызывается прерывание, которое начинает эту половинную батву выводить наружу. Тогда начинается полная петрушка. С этим повнимательнее.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 05:16.
|
|