Desert _Eagl.5

Uart На At89C51

5 сообщений в этой теме

Здраствуйте.

Ктонибудь в курсе как работать с uart на низком уровне( ассемблер) в AT89C51 ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
o_l_e_g    1 640

Передача:

MOV SBUF, xx ' где хх- источник данных

Данные будут немедленно переданы, после передачи установится флаг TI

Прием:

MOV xx, SBUF

после аппаратной установки флага RI

UART должен быть соответственно настроен.

ЗЫ примеры:

прием-передача

Serial_Send:
    ;wait for last data to be
    ;sent completely
    jnb TI,Serial_Send
    ;clear the transmit interrupt flag
    clr TI
    ;Then move the data to send in SBUF
    mov SBUF,A
    ret

Serial_Read:
    ;Wait for Receive interrupt flag
    jnb RI,Serial_Read
    ;If falg is set then clear it
    clr RI
    ;Then read data from SBUF
    mov A,SBUF
    ret

инициализация

Serial_Init:
    ;Set timer 1 mode to 8-bit Auto-Reload
    mov TMOD,#20H
    ;Enable reception
    ;Set Serial port mode to 8-bit UART
    mov SCON,#50H
    ;Set baudrate to 9600 at 11.0592MHz
    mov TH1,#0FDH
    mov TL1,#0FDH
    ;Start Timer
    setb TR1
    ret

Изменено пользователем o_l_e_g
  • Одобряю 2

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
o_l_e_g    1 640

Помни, что для формирования временных временных интервалов используется таймер-счетчик 1, и для других целей он будет недоступен.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Похожие публикации

    • Автор: LoKeR
      Доброго времени суток, нашел хорошую статью Usart прием и отправка строки. Настроил на порт Usart3 перестал работать, попробовал на Usart2 перекинуть тоже не работает, как правильно переделать подскажите...
      stm32-uart-spl.rar
    • Автор: Тимур1992
      Доброго времени суток.
      Решил пробудить свои скилы по написанию программ под stm32f103. Поигрался с SMT32CUDEMX и HAL, но вернулся к SLP библиотеке.  Начал постепенно наращивать программу по примерам, начиная с GPIO, тактирования и на работе c USART встал. Суть в том что передача по UART идет нормально, а вот прием приводит к "зависанию". Устанавливая бесконечные while с мигалками внутри, я выяснил что по все видимости МК не переходит в прерывания USART1_IRQHandler. Я не могу понять в чем ошибка, раньше с таким не сталкивался, хотя написал несколько программ для stm32f100 .____.
      Среда разработки Atollic TrusStudio 9.0.0.
       
      #include "stm32f10x.h" #include "stm32f10x_gpio.h" #include "stm32f10x_rcc.h" #include "stm32f10x_usart.h" #include "misc.h" #include <string.h> // тактовый светодиод для индикации #define LED GPIO_Pin_5 #define RX_BUF_SIZE 80 volatile char RX_FLAG_END_LINE = 0; volatile char RXi; volatile char RXc; volatile char RX_BUF[RX_BUF_SIZE] = {'\0'}; volatile char buffer[80] = {'\0'}; void init_GPIO(void); void SetSysClockTo72(void); void init_uart(void); void clear_RXBuffer(void); void USARTSend(const char *pucBuffer); void USART1_IRQHandler(void) { GPIO_ResetBits(GPIOA, LED); //GPIOA->ODR ^= LED; //USART_ITConfig(USART1, USART_IT_RXNE, DISABLE); //if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { //if ((USART1->SR & USART_FLAG_RXNE) != RESET) { //if ((USART1->SR & USART_SR_RXNE) != (u16)RESET) { if (USART1->SR & USART_SR_RXNE) { // Сбрасываем флаг прерывания USART1->SR &=~ USART_SR_RXNE; //RXc = USART_ReceiveData(USART1); //RX_BUF[RXi] = RXc; //RXi++; //if (RXc != 13) { // if (RXi > RX_BUF_SIZE-1) { // clear_RXBuffer(); // } //} //else { // RX_FLAG_END_LINE = 1; //} //Echo //USARTSend("Interrapt_UART1\r\n"); //USART_SendData(USART1, RXc); } //return } int main(void) { int i; //SetSysClockTo72(); init_GPIO(); init_uart(); USARTSend("Test USART1\r\n"); while (1) { //if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_9) != 0) { /* Toggle LED which connected to PC13*/ GPIOA->ODR ^= LED; // Invert C13 /* delay */ for(i=0;i<0x100000;i++); /* Toggle LED which connected to PC13*/ GPIOA->ODR ^= LED; /* delay */ for(i=0;i<0x100000;i++); USARTSend("Test USART1\r\n"); //} //else { //GPIO_SetBits(GPIOA, LED); //} } } void init_GPIO(void) { // Создаем класс для постепенной настройки параметров и единовременного применени¤ GPIO_InitTypeDef GPIO_InitStructure; //Настрайваем светодиод, включаем тактирование GPIOA RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // Конфигурация для светодиода, режим работы, максимальная скорость GPIO_InitStructure.GPIO_Pin = LED; // GPIO_Mode_Out_OD выход с открытым стоком, GPIO_Mode_Out_PP выход двумя состояниями // GPIO_Mode_AF_OD выход с открытым стоком для альтернативных функций, GPIO_Mode_AF_PP то же самое, но с двумя состояниями GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); // Устанавливаем начальное значение SetBits -> High level ("1"), ResetBits -> Low level ("0") GPIO_ResetBits(GPIOA, LED); // Настрайваем пин 9, регистра B на вход, для отладки, включаем тактирование регистра B RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // Настрайваем для кнопку, пин, режим, максимальная частота входного сигнала GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; // GPIO_Mode_AIN аналоговый вход, GPIO_Mode_IN_FLOATING вход без подтяжки, болтающийся // GPIO_Mode_IPD вход с подтяжкой к земле, GPIO_Mode_IPU вход с подтяжкой к питанию GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); } void SetSysClockTo72(void) { ErrorStatus HSEStartUpStatus; /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration -----------------------------*/ /* Системный RESET RCC (делать не обязательно, но полезно на этапе отладки) */ RCC_DeInit(); /* Включаем HSE (внешний кварц) */ RCC_HSEConfig( RCC_HSE_ON); /* Ждем пока HSE будет готов */ HSEStartUpStatus = RCC_WaitForHSEStartUp(); /* Если с HSE все в порядке */ if (HSEStartUpStatus == SUCCESS) { /* HCLK = SYSCLK */ /* Смотри на схеме AHB Prescaler. Частота не делится (RCC_SYSCLK_Div1) */ RCC_HCLKConfig( RCC_SYSCLK_Div1); /* PCLK2 = HCLK */ /* Смотри на схеме APB2 Prescaler. Частота не делится (RCC_HCLK_Div1) */ RCC_PCLK2Config( RCC_HCLK_Div1); /* PCLK1 = HCLK/2 */ /* Смотри на схеме APB1 Prescaler. Частота делится на 2 (RCC_HCLK_Div2) потому что на выходе APB1 должно быть не более 36МГц (смотри схему) */ RCC_PCLK1Config( RCC_HCLK_Div2); /* PLLCLK = 8MHz * 9 = 72 MHz */ /* Указываем PLL от куда брать частоту (RCC_PLLSource_HSE_Div1) и на сколько ее умножать (RCC_PLLMul_9) */ /* PLL может брать частоту с кварца как есть (RCC_PLLSource_HSE_Div1) или поделенную на 2 (RCC_PLLSource_HSE_Div2). Смотри схему */ //RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); RCC_PLLConfig(0x00010000, RCC_PLLMul_9); /* Включаем PLL */ RCC_PLLCmd( ENABLE); /* Ждем пока PLL будет готов */ while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) { } /* Переключаем системное тактирование на PLL */ RCC_SYSCLKConfig( RCC_SYSCLKSource_PLLCLK); /* Ждем пока переключиться */ while (RCC_GetSYSCLKSource() != 0x08) { } } else { /* Проблемы с HSE. Тут можно написать свой код, если надо что-то делать когда микроконтроллер не смог перейти на работу с внешним кварцом */ /* Пока тут заглушка - вечный цикл*/ // while (1) { //} } } void init_uart(void) { /* Enable USART1 and GPIOA clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA, ENABLE); /* Configure the GPIOs */ GPIO_InitTypeDef GPIO_InitStructure; /* Configure USART1 Tx (PA.09) as alternate function push-pull */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); /* Configure USART1 Rx (PA.10) as input floating */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); /* Configure the USART1 */ USART_InitTypeDef USART_InitStructure; /* USART1 configuration ------------------------------------------------------*/ /* USART1 configured as follow: - BaudRate = 115200 baud - Word Length = 8 Bits - One Stop Bit - No parity - Hardware flow control disabled (RTS and CTS signals) - Receive and transmit enabled - USART Clock disabled - USART CPOL: Clock is active low - USART CPHA: Data is captured on the middle - USART LastBit: The clock pulse of the last data bit is not output to the SCLK pin */ USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure); /* Enable USART1 */ USART_Cmd(USART1, ENABLE); /* Enable the USART1 Receive interrupt: this interrupt is generated when the USART1 receive data register is not empty */ USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); /* NVIC Configuration */ NVIC_InitTypeDef NVIC_InitStructure; /* Enable the USARTx Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); //NVIC_EnableIRQ(USART1_IRQn); } void clear_RXBuffer(void) { for (RXi=0; RXi<RX_BUF_SIZE; RXi++) RX_BUF[RXi] = '\0'; RXi = 0; } void USARTSend(const char *pucBuffer) { while (*pucBuffer) { USART_SendData(USART1, *pucBuffer++); while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) { } } }  
    • Автор: Nitro N
      Здравствуйте! 
      Дано: 
      BLE модуль JDY-10 Гироскоп + Акселерометр модуль GY-521  USB UART CH340G USB bluetooth адаптер Цель:
      передавать сигналы датчика гироскопа и акселерометра через bluetooth модуль на ПК. Мои рассуждения:
      Модуль GY-521 имеет I2C интерфейс, на JDY-10 стоит МК CC2541 который тоже имеет I2C интерфейс. Надо как-то их соединить и заставить отправлять показания на ПК. Как это сделать пока мне не понятно. Иногда приходят мысли что без перепрошивки контроллера не обойтись. 

      Подскажите пожалуйста как это реализовать?

      П.С. В идеале вообще конечно использовать один контроллер для снятия значений и отправки на ПК, но пока так. 
    • Автор: motoalex
      Здравствуйте, написал код для приема данных по UART. Записываю данные в буфер и сравниваю его с массивом. Если все данные совпадают увеличиваю значение j до 13. И вывожу данные j ком порт. Пожалуйста помогите исправить код, а то в UART хлам сыпется. 
      unsigned char Buff[250]; unsigned char BuffIndex; unsigned char src[]= {'+','7','9','1','7','6','3','0','0','0','0','0','0'}; char * pch; int f2=0,i,j=0; void setup() { Serial.begin(9600); memset(Buff, '\0', 250); // Initialize the string BuffIndex=0; } void loop() { while(1) { //BuffIndex=0; // put your main code here, to run repeatedly: if(Serial.available()>0) { Buff[BuffIndex] = Serial.read(); BuffIndex++; if(BuffIndex>250) { BuffIndex=0; } for(i=0;i<=13;i++) { if(Buff[i]==src[i]) { j++; f2=10; } } if(j>13 && f2==10) { Serial.print(j); j=0; f2=0; } } } }  
    • Автор: Никитос
      Всем привет. Сделал устройство с семисегментным индикатором,но понадобилось снимаемые значения еще и на пк выводить. А порт UART'а занят,связь нужна симплексная,т.е. в одну сторону. Можно ли как-то вывести инфу на порт В0?Или проще задействовать реализацию железа,а индикатор перебросить на другие порты?
  • Сообщения

    • Всем привет! Возникла следующая проблема:   Есть две ардуины 'Mega2560'. По несчастливому стечению обстоятельств данные платы попали в руки одному чуваку, который, вернув их, заявил, что они перестали работать после того, как он "чисто ради интереса" поковырял на обеих некоторые фьюзы. Есть у меня такой китайский usbasp v2 программатор: Подключив данный девайс к ICSP-пинам первой платы, удалось без проблем восстановить на ней загрузчик через стандартную Arduino-IDE, после чего работоспособность платы полностью восстановилась. Но вот при попытке сделать то же самое со второй платой, получаю это: Такое же сообщение получаю при попытке зашить загрузчик в неподключенную к программатору ардуину, то есть программатор вообще не видит МК. Плата прекрасно работала до того, как вышеупомянутый товарищ покрутил настройки фьюзов.   Что я пытался предпринять: Замыкал пины JP3 программатора, отвечающие за понижение скорости, подключал к ардуине 5V от внешнего источника при прошивке загрузчика, - не помогло.   Поиском пользоваться умею, аналогичную тему тут находил, но там проблема была в том, что парень неверно подключал программатор к контроллеру. В моём же случае всё подключено верно, повторюсь, что загрузчик первой платы этим же программатором был восстановлен успешно. Буду рад любым советам касательно того, как восстановить работоспособность платы.      
    • А если конденсатор для задержки сигнала с датчика поставить не между электродом и минусом, а между электродами, то что получится?
      Время задержки в секундах считается по формуле "емкость умножить на сопротивление"?
      Когда эту же схему собирал не на транзисторах КТ, а на маленьких BC, то получалось такое мощное усиление, что даже не опуская датчик в воду транзисторы уже пропускают все с коллектора на эмиттер. Если бы надо было собирать на маленьких транзисторах или вобще на составных транзисторах BC517 или TIP122, то как ослаблять усиление сигнала?
      Можно в эту схему вместо реле поставить оптопару MOC3021 или MOC3041(M) чтобы в другой схеме ( симисторного регулятора мощности тэна) разрывать участок цепи управления?
    • Несколько лет доводили схему до ума. Тысячи постов... Вроде получили весьма неплохой результат. Но мы не ищем легких путей.. вдруг заново по тем-же кочкам поскакали начиная от 14 версии. Может давайте себе на компы поставит Винду 95 и начнем бороться с проблемами, которые сами себе создали?
    • С McIntosh тоже, кажется, не совсем все гладко.
      0.5% maximum harmonic distortion at any level from 250 milliwatts to rated power
      Бросается в глаза ограничение мощности снизу для Кг. Как-то странно, не из-за ступеньки ли?
    • вангую, кто-то не понимает шо це таке "выход с открытым коллектором"., открой тайну "золотого ключика" , где ты такой сигнал намерил херню ты наваял... и еще полампера это не мощная нагрузка
    • жесть... проще в уши встроить переменный резистор