Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Микроконтроллеры (MCU) и микропроцессоры (MPU) > пересылать байтики из контроллера по Com порту


Автор: Regbist 12.7.2005, 15:36
Здраствуйте, Народ!

вот тут меня одна проблема мучает уже 4 сутки.
мне для начала надо , чтобы из контроллера (у меня DS80C400 от dallas) "выпихивались" байтики, ну короче чтобы посылать что-то от контроллера к компу по com порту.
посылка оочень простая, без всяких прерываний, готовностей т.д, просто , чтобы "Лупились" байтики из контроллера по com порту, а я на компе их буду просто принимать и видеть, пришли они или нет.
Пишу в среде keil сначала на ассемблере для 51-0го, всё работает, байтки каждую секунду "Выпихиваются". вот код:
Код


$TITLE (Com port_0 используется p3)
$include (reg400.h)

;определение сегментов
myseg segment code
rseg myseg 
;ban equ 20h
;sms2 equ 1ah
;sms1 equ 11111111b
sms2 equ 01111111b
;0delay equ 4fh
;инициализация com порта (Serial port 0)
InitSerial:   ORL      PCON, #80H
              MOV      SCON0,#050H                  
              ORL      TMOD, #021H    
              mov      th1, #0FAh          ; 36.864 MHz, 38400 baud, divisor=4
              ORL      CKCON,#010H
              MOV      TCON,#050H              
             ; ORL      SCON0,#02H     прерывание передатчика

;запихиваем в порт байтик  
mov r0,#37h
mov 37h,#sms2

send: mov sbuf0,@r0

;zadergka 2
 delay1: mov R3,#11111111b
 ciklex1: mov r4,#9fH
 ciklin1: djnz r4,ciklin1
 
         djnz R3,ciklex1
;zadergka 3
 delay2: mov R5,#11111111b
 ciklex2: mov r6,#9fH
 ciklin2: djnz r6,ciklin2

          djnz R5,ciklex2
jmp send
end



но вот потом пищу на Си кейловском, и у меня ничего не передаётся..
вот текст:
Код


#include <reg400.h>
#include <stdio.h>



void init_com0 (void)
{
  PCON  |= 0x80;  
  SCON0  = 0x50;                
  TMOD  |= 0x21;  
  TH1 =0xFA;
  CKCON |= 0x10;
  TCON   = 0x50;             
  TI     = 1;  
}
void main (void)
 {
unsigned int i;
unsigned int j;

init_com0 ();

do{
SBUF0=0x56;      // возможно так нельзя, я не знаю, но 
                      //дизассемблер  выдаёт на это mov sbuf0,#56h 

for (i=0;i<65534;i++)
{};
for (j=0;j<3275;j++)
{};

}while(1);}



так я вот не пойму, почему на СИ прога не работате, может кто знает? или подскажет как сделать такую простенькую прогу?
а может я вообще не так пишу ?

Автор: PILOT 12.7.2005, 16:20
А в отладочном окне Serial что-то идет?
По шагам отлаживал? что в окне Периферия->UART?

СУВ.

Автор: Regbist 12.7.2005, 23:07
в отладчике идёт и на СИ и на Ассемблере, но на когда заливаю hex файл из сишного кода в контроллер , то ничиге не передаётся, а когда hex файл ассемблерного кода, то всё отлично smile))
сам не опйму smile) отладчиком в окошке сериал всё отлично работает, всё показывает smile) я ваще не понимаю в чём дело ?
а вообще так можно в си писать

Код

SBUF0=0x56; // типа просто присвоить значение, или может надо загружать адрес  
                      // ячейки,               где          лежит  0x56

может так нельзя ? я просто не знаю smile

Автор: cardinal 13.7.2005, 00:18
Скорости передачи соответсвуют на обоих сторонах?
И еще кстати:
Код

MOV      SCON0,#050H

не равно
Код

SCON0  = 0x50;

как мне кажется (особенно если SCON0 не 8 битный. А вообще посмотри что делает компилятор из твоего сишного кода (листинг).

А если у тебя есть VB6, то можешь в FAQ'e терминал взять, который я для себя делал, чтобы понять что происходит в порте...

Автор: Metal_Heart 13.7.2005, 08:40
Цитата(cardinal @ 13.7.2005, 00:18)
А если у тебя есть VB6, то можешь в FAQ'e терминал взять, который я для себя делал, чтобы понять что происходит в порте...


для мониторинга портов просто предложу попробовать прогу "Portmon"
адрес: www.sysinternals.com

эта прога мониторит (не занимает) порты как COM так и LPT, даже удаленно..
мне лично - нравится

Автор: Guest 13.7.2005, 11:35
2 cardinal.
Порты настроены на одинаковую скорость, проверял.
а вот насчёт
Код

PCON  |= 0x80;  
  SCON0  = 0x50;  // Так можно , в примерах так написано, поэтому так и пищу            
  TMOD  |= 0x21;  
  TH1 =0xFA;
  CKCON |= 0x10;
  TCON   = 0x50;             
  TI     = 1;  



а вот в бувер так можно писать?
Код

SBUF0=0x56 //  чё то я уже сам сомневаюсь.....:(


а как вообще начинается передача любого символа из микроконтроллера по COM порту на языке СИ?

Автор: cardinal 13.7.2005, 13:41
Аааа... Вот в чем ты напахал. Вот тебе мой putchar smile
Код

void putchar(char cData)
{
   if (cData == 0x0a) // это необязательно
   {
      while(!TI);
      TI = 0;
      SBUF = 0x0d;
   }

   while(!TI); // то есть пока TI = 0 он занят, а ты ждешь...
   TI = 0; // опять обнуляешь
   SBUF = cData; // посылаешь
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)