Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Передача данных по UART
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
goodking
Привет! Помогите пожалуйста разобраться с уапп (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 будет сгенерировано
прерывание, если оно разрешено.
подскажите, где ошибка, в нинциализации, или при опросе флагов?
редактор
// код не очень внятный
// отсутствие скобок портит всю картину
// флаги сбрасываются при их наличии а запись ведется независимо от их состояния
// я бы переделал так
Код
             SFRPAGE   = UART0_PAGE;
             if (RI0 == 1) // есть данные
               { RI0=0;  // сброс флага
                  tfin=SBUF0; // чтение данных
                 }
             if (TI0 == 1)// отправлен байт
               { TI0=0; // сброс флага
                  SBUF0=tfin; // передача
                 }

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

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

Теперь кажись все.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.