Портал для радиолюбителей и разработчиков электроники · с 2003 годаРеклама на сайте
Найти компонент, схему или даташит

Даташиты, справочник отечественных приборов, схемы с разбором и живой форум

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

 
Опции темы

Проблемы с передачей по UART, нужна помощь

Непрочитано 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.RUN
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,487
Сказал спасибо: 30
Сказали Спасибо 3,070 раз(а) в 2,011 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: Проблемы с передачей по UART, нужна помощь

Вот здесь:
PHP код:
Ow_Write(&PORTA, 0, 0x44);                   // 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,821
Сказал спасибо: 919
Сказали Спасибо 4,289 раз(а) в 2,570 сообщении(ях)
Easyrider83 на пути к лучшему
По умолчанию Re: Проблемы с передачей по UART, нужна помощь

omercury, все библиотеки MikroE работают полингом. Так что проблема не в этом.
Автор, прилепите проект с протеусом. Покумекаем.
Easyrider83 вне форума  
Непрочитано 28.01.2012, 13:19  
ut1wpr
Почётный гражданин KAZUS.RUN
 
Аватар для ut1wpr
 
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,613
Сказал спасибо: 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, время: 05:03.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.