реклама на сайте
подробности

 
 
> Передача данных по UART
goodking
сообщение Feb 26 2010, 08:57
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 32
Регистрация: 21-12-09
Пользователь №: 54 383



Привет! Помогите пожалуйста разобраться с уапп (SiLabs c8051F120):

подпрограмму передачи ставлю в main:
Код
while (1)
             {
                tfin=temperature;
             SFRPAGE   = UART0_PAGE;
             if (RI0 == 1)
             RI0=0;
             tfin=SBUF0;
             if (TI0 == 1)
             TI0=0;
             SBUF0=tfin;
             }
    
}



инициализация уапп
Код
void UART_Init()
{
   SFRPAGE   = UART0_PAGE;
   SCON0     = 0x50;// 8-ми разрядный, изменяемая скорость передачи, генератор скорости-таймер 1
   SFRPAGE   = TIMER01_PAGE;
   TCON      = 0x40;
   TMOD      = 0x20;
   TH1       = 0xF0;
   TR1=1;
}


в описании говориться
Цитата
Передача данных начинается, когда происходит запись байта данных в регистр SBUF0. Флаг
прерывания от передатчика TI0 (SCON0.1) устанавливается в 1 в конце передачи (в начале передачи стопового
бита). Прием данных может быть начат в любое время после установки в 1 флага включения приемника REN0
(SCON0.4). После приема стопового бита байт данных будет загружен в регистр приемника SBUF0, если
соблюдаются следующие условия: RI0 должен быть равен лог.0, и, если SM20 равен лог.1, то стоповый бит
должен быть равен лог.1.
Если эти условия соблюдаются, то восемь бит данных сохраняются в регистре SBUF0, стоповый бит
сохраняется в бите RB80 и устанавливается в 1 флаг RI0. Если эти условия не соблюдаются, то SBUF0 и RB80
не будут загружаться и флаг RI0 не устанавливается. При установке флагов TI0 или RI0 будет сгенерировано
прерывание, если оно разрешено.
подскажите, где ошибка, в нинциализации, или при опросе флагов?

Сообщение отредактировал goodking - Feb 26 2010, 09:50
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 3)
редактор
сообщение Feb 26 2010, 13:19
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 356
Регистрация: 9-06-07
Пользователь №: 28 315



// код не очень внятный
// отсутствие скобок портит всю картину
// флаги сбрасываются при их наличии а запись ведется независимо от их состояния
// я бы переделал так
Код
             SFRPAGE   = UART0_PAGE;
             if (RI0 == 1) // есть данные
               { RI0=0;  // сброс флага
                  tfin=SBUF0; // чтение данных
                 }
             if (TI0 == 1)// отправлен байт
               { TI0=0; // сброс флага
                  SBUF0=tfin; // передача
                 }

..
есть еще одно НО
при подаче питания и сбросе флаг TI0 сброшен в 0, поэтому его надо проинициализировть перед циклом while(1){} или тупо записать в SBUF0что нибудь
еще не видно инициализации портов
Передатчик надо притянуть (push_pull) если нет резистора снаружи
Причина редактирования: Оформление кода


--------------------
Хорошую систему делают из стандартных блоков нестандартно мыслящие инженеры.
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Feb 26 2010, 17:11
Сообщение #3


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Цитата
push_pull
может pull up smile.gif


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
редактор
сообщение Feb 26 2010, 17:22
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 356
Регистрация: 9-06-07
Пользователь №: 28 315



Ну да, можно и так сказать но в описании регистров именно PUSH-PULL

Еще надо матрицу разрешить (crossbar)
и еще один ньюанс(сам на грабли наступал)
WDT по умолчанию включен, поэтому надо либо отключить либо обеспечить сброс

Теперь кажись все.


--------------------
Хорошую систему делают из стандартных блоков нестандартно мыслящие инженеры.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 5th July 2025 - 18:31
Рейтинг@Mail.ru


Страница сгенерированна за 0.01397 секунд с 7
ELECTRONIX ©2004-2016