Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 28.01.2012, 07:51  
sansan25
Временная регистрация
 
Регистрация: 28.01.2012
Адрес: Димитровград
Сообщений: 1
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
sansan25 на пути к лучшему
По умолчанию Проблемы с передачей по UART, нужна помощь

Здравствуйте форумчане. Прошу помощи. Pic начал изучать недавно, активно штудирую данный форум, узнал много нового и интересного. В принципе простые вещи получаются и даже работают, термометры, тахометры, вольтметры. Но вот понадобилось мне связать между собой несколько PICов и все - ступор. Пишу в MikroC Pro, разрабатываю 16f628a. Взял пример из библиотеки UART в простейшем случае работает с одного PIC отправляю простые числа и вторым принимаю и вывожу на ЖК все нормально. Но при попытке прицепить к первому ds18b20 и отправить данные полная ерунда. данные или отправляются, или принимаются не полностью. При изменении температуры в протеусе данные считываются первым МК и отправляются по UART, но второй МК принимает только часть, на ЖК изменения вижу , но как-то странно. Идет изменение от 1 до 15, потом 0, и снова 1-15, и так дальше. Уже голова дымит. Прошу подскажите где копать

это код отправки
Код:
unsigned int temp2write;

void main() {
  CMCON=0x07;                   // Disable comparators
  UART1_Init(9600);              // Initialize UART module at 9600 bps
  Delay_ms(100);                  // Wait for UART module to stabilize

  while (1) {
   Ow_Reset(&PORTA, 0);                         // Onewire reset signal
    Ow_Write(&PORTA, 0, 0xCC);                   // Issue command SKIP_ROM
    Ow_Write(&PORTA, 0, 0x44);                   // Issue command CONVERT_T
    Delay_ms(120);

    Ow_Reset(&PORTA, 0);
    Ow_Write(&PORTA, 0, 0xCC);                   // Issue command SKIP_ROM
    Ow_Write(&PORTA, 0, 0xBE);                   // Issue command READ_SCRATCHPAD

    temp2write =  Ow_Read(&PORTA, 0);
    temp2write = (Ow_Read(&PORTA, 0) ‹‹ 8) + temp2write;    
                     

     UART1_Write(temp2write);

     Delay_ms(1500);      
  }
}

этим принимаю и вывожу на ЖК

Код:
const unsigned short TEMP_RESOLUTION = 12;
const unsigned short RES_SHIFT = TEMP_RESOLUTION - 8;
char *text = " 000.00";
unsigned int temp_fraction,temp2write;
char temp_whole;
 // LCD module connections
sbit LCD_RS at RB0_bit;
sbit LCD_EN at RB3_bit;
sbit LCD_D4 at RB4_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D7 at RB7_bit;

sbit LCD_RS_Direction at TRISB0_bit;
sbit LCD_EN_Direction at TRISB3_bit;
sbit LCD_D4_Direction at TRISB4_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D7_Direction at TRISB7_bit;
// End LCD module connections

void main() {
  CMCON=0x07;                    // Disable comparators
  UART1_Init(9600);              // Initialize UART module a t9600 bps
  Delay_ms(100);                  // Wait for UART module to stabilize
   Lcd_Init();
LCD_Cmd(_LCD_CLEAR);       // Очистить дисплей
LCD_Cmd(_LCD_CURSOR_OFF);  // Кусор выключен


  while (1) {                    
   if UART1_Data_Ready() 
    {      
     temp2write = UART1_Read();
      }

      if (temp2write & 0x8000) {
     text[0] = '-';
     temp2write = ~temp2write + 1;
     }

  temp_whole = temp2write ›› RES_SHIFT ;
  text[1] = temp_whole/100  + 48;
  text[2] = (temp_whole/10)%10 + 48;             // Extract tens digit
  text[3] =  temp_whole%10     + 48;             // Extract ones digit

  // Extract temp_fraction and convert it to unsigned int
  temp_fraction  = temp2write ‹‹ (4-RES_SHIFT);
  temp_fraction &= 0x000F;
  temp_fraction *= 625;

  // Convert temp_fraction to characters
  text[5] =  temp_fraction/1000    + 48;         
  text[6] =  (temp_fraction/100)%10    + 48;
  LCD_Out(1,1, text);       

  }
}
Реклама:
sansan25 вне форума  
Непрочитано 28.01.2012, 12:33  
omercury
Почётный гражданин KAZUS.RU
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: Проблемы с передачей по UART, нужна помощь

Вот здесь:
PHP код:
Ow_Write(&PORTA00x44);                   // Issue command CONVERT_T
    
Delay_ms(750); 
UART может передать 5-9 бит за один раз, а Вы ему 16 подсовываете...
Нет ожидания освобождения регистра данных UART...
Возможно в Microelectronix это и предусмотрели, не пользую их продукцию...

Это навскидку.
omercury вне форума  
Непрочитано 28.01.2012, 13:01  
Easyrider83
Гуру портала
 
Аватар для Easyrider83
 
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
Easyrider83 на пути к лучшему
По умолчанию Re: Проблемы с передачей по UART, нужна помощь

omercury, все библиотеки MikroE работают полингом. Так что проблема не в этом.
Автор, прилепите проект с протеусом. Покумекаем.
Easyrider83 вне форума  
Непрочитано 28.01.2012, 13:19  
ut1wpr
Почётный гражданин KAZUS.RU
 
Аватар для ut1wpr
 
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
ut1wpr на пути к лучшему
По умолчанию Re: Проблемы с передачей по UART, нужна помощь

Сообщение от sansan25 Посмотреть сообщение
Код:
unsigned int temp2write;
     UART1_Write(temp2write);
Вы пытаетесь передать 16-бит переменную через восьмибитный порт.
Компилятор тайком от вас сделал приведение, чтобы хоть как-то вам угодить, но забыл вам об этом сказать.
Передавайте двумя байтами.
На фазе передачи:
Код:
     UART1_Write(temp2write››8 & 0xFF);
     UART1_Write(temp2write & 0xFF);
На приеме:
Код:
     temp2write = UART1_Read()‹‹8;
     while ( !UART1_Data_Ready() ) continue;
     temp2write |= UART1_Read();
__________________
С уважением,
Vic / ut1wpr

Последний раз редактировалось ut1wpr; 28.01.2012 в 13:24.
ut1wpr вне форума  
 

Закладки
Опции темы

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Какие могут быть проблемы при вкл/откл UART в ATmega128? Don_Ambrosio Микроконтроллеры, АЦП, память и т.д 26 12.06.2014 13:53
Проблема с передачей данных между avr по uart code-by Proteus 2 21.01.2011 12:24
RS-232 - несколько устройств. Проблемы с передачей данных ArtUrl1986 Микроконтроллеры, АЦП, память и т.д 2 06.05.2009 02:07
Необходима помощь в решении проблемы с выдачей звука hubble Микроконтроллеры, АЦП, память и т.д 19 16.10.2008 01:21
Проблемы с приемом данных через UART Tiny 2313 SoapMaker Микроконтроллеры, АЦП, память и т.д 0 08.04.2008 10:35


Часовой пояс GMT +4, время: 00:40.


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