Jump to content

Search the Community

Showing results for tags 'UART'.



More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • Вопрос-Ответ. Для начинающих
    • Песочница (Q&A)
    • Дайте схему!
    • Школьникам и студентам
    • Начинающим
    • Паяльник TV
    • Обсуждение материалов с сайта
  • Радиоэлектроника для профессионалов
    • Световые эффекты и LED
    • Роботы и модели на ДУ-управлении
    • Автоматика
    • Самодельные устройства к компьютеру
    • Программное обеспечение
    • Автомобильная электроника
    • Системы охраны и наблюдения. Личная безопасность
    • Питание
    • Электрика
    • Промышленная электроника
    • Ремонт
    • Металлоискатели
    • Измерительная техника
    • Мастерская радиолюбителя
    • Сотовая связь
    • Спутниковое ТВ
    • КВ и УКВ радиосвязь
    • Жучки
    • Телефония и фрикинг
    • Высокое напряжение
    • Идеи и технологии будущего
    • Справочная радиоэлементов
    • Литература
    • Разное
  • Аудио
    • FAQ, Технологии и компоненты
    • Для начинающих
    • Источники звука
    • Предусилители, темброблоки, фильтры
    • Питание аудио аппаратуры
    • Усилители мощности
    • Акустические системы
    • Авто-аудио
    • Ламповая техника
    • Гитарное оборудование
    • Прочее
  • Микроконтроллеры
  • Товары и услуги
  • Разное
  • Переделки's ATX->ЛБП
  • Переделки's разные темы
  • Киловольты юмора's Юмор в youtube

Blogs

There are no results to display.

There are no results to display.

Marker Groups

  • Пользователи форума

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


ICQ


Skype


Интересы


Город


Сфера радиоэлектроники


Оборудование

Found 74 results

  1. Всем добрый день, с толкнулся с такой проблемой , что при написании кода для UART в протеусе симуляция не работает, то есть терминал вылазит, символы печатаю в терминале все отображается, но Микроконтроллер не реагирует на них, пробовал разные коды , с разных сайтов , если открыть готовый проект в протеусе то все работает , создаю свой проект либо исправляю готовый , на нужный мне МК , он перестает , работать , вот один из примеров кода /***************************************************** This program was produced by the CodeWizardAVR V2.05.0 Evaluation Automatic Program Generator © Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l. http://www.hpinfotech.com Project : RS485 Test Version : Date : 15.10.2014 Author : Brain Company : Comments: Chip type : ATmega8515 Program type : Application AVR Core Clock frequency: 8,000000 MHz Memory model : Small External RAM size : 0 Data Stack size : 128 *****************************************************/ #include <mega8515.h> // Standard Input/Output functions #include <stdio.h> char read; // Declare your global variables here void main(void) { DDRA=0xFF; DDRD=0x00; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: Timer 0 Stopped // Mode: Normal top=0xFF // OC0 output: Disconnected TCCR0=0x00; TCNT0=0x00; OCR0=0x00; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: Timer1 Stopped // Mode: Normal top=0xFFFF // OC1A output: Discon. // OC1B output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge // Timer1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=0x00; TCCR1B=0x00; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // External Interrupt(s) initialization // INT0: Off // INT1: Off // INT2: Off MCUCR=0x00; EMCUCR=0x00; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x00; // USART initialization // Communication Parameters: 8 Data, 1 Stop, No Parity // USART Receiver: On // USART Transmitter: On // USART Mode: Asynchronous // USART Baud Rate: 9600 UCSRA=0x00; UCSRB=0x18; UCSRC=0x86; UBRRH=0x00; UBRRL=0x33; // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; // SPI initialization // SPI disabled SPCR=0x00; while (1) { // Place your code here read=getchar(); // if( read == 'A') PORTA.0 = 1; if( read == 'B') PORTA.0 = 0; if( read == 'C') PORTA.1 = 1; if( read == 'D') PORTA.1 = 0; if( read == 'E'){ PORTA.1 = 0; PORTA.0 = 1; } } }
  2. В этой теме ждём всех интересующихся интерфейсами АВР. Например мне интересно как организовать USB.
  3. Здравствуйте. Хочу наладить передачу данных между двумя Arduino Uno через UART. Прошивка рабочая. Плата прошивается. Проблема состоит в следующем, при выключении и включении питания Arduino, не запускается автоматически передача данных. В чем проблема? Заранее спасибо!
  4. Хотелось бы в этой теме обсуждать всякие вопросы по асинхронному приемопередатчику UART. И первый вопрос как автор задаю сам. Как принять RXD сигнал (прошивку) на один AVR, записать по i2c в eeprom, спросить разрешения, и если да, то отправить прошивку в другой мк по TXD (BootLoader)?
  5. Всем привет, оцените проект, вот схема: А вот видео работы: Файлы протеуса и хекс файл: https://vk.com/doc256435878_327443957
  6. Доброго времени суток. Нужна помощь в подключении Raspberry Pi к компьютеру при помощи адаптера USB-TTL. Опыта работы с контроллерами у меня нет. Суть эксперимента: Оборудование Raspberry Pi B Конвертер USB-TTL (маркировка на плате usb-ttl usb-stc-isp, чип PL-2303 XA / HXA) Установленное ПО Raspbian 09-09-2014 PL2303_Prolific_DriverInstaller_v1.10.0 Windows 7 Домашняя Базовая SP1 x64 AMD Действия Подключаю PIN UART <-> Pi GND <-> GND TXD <-> TXD RXD <-> RXD 5V <-> 5V Еще методом научного тыка делал так TXD <-> RXD RXD <-> TXD Подключаю USB, Raspberry Pi работает Запускаю checkChipVersion_v1006.exe из состава программ драйвера. Показывает, что устройство доступно на COM4 Запускаю putty на COM4 скорость 9600. Putty висит в черном экране бесконечно. Проверяю Pi по сети по кабелю. Pi загружена и работает. Ожидания По инструкции putty должен открыть консоль, но этого не происходит. На USB-TTL горит красный светодиод постоянно и в момент подключения к компьютеру 2 секунды мигает еще один. На светодиодах маркировки нет, непонятно что мигает. Вопрос Как проверить Pi и UART по отдельности? Как посмотреть какие байты передаются? Например, с PC подключаюсь, в консоли Pi вижу набор байт полученных по RXD и наоборот. Ну и собственно, почему может не работать? Куда копать? PS. Желающим задать вопросы, а зачем это надо и почему так надо отвечу сразу: (текст для поиска) «Working with GPIO by Using Java ME Embedded and a Raspberry Pi”
  7. Здарова мужики!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! что есть? (дальше больше будет)--> радиомодуль nrf24l01(выбор пал на этот модуль т.к. он с хорошим запасом дальности) mega16(можно и другую мегу) типа кнопки типа диоды типа tft экран (вчера его запилил в мегу ...прикольнее чем 16х2 ...правд жрет много) все в достотачном количестве основная суть то че я хочу сделать вот на этой картинке грубо говоря пахари либо стучат , либо делают че нить полезное батек общается со всеми пахарями (!подчеркиваю их много)через modbus(насколько я понял кто то тут ведомый а кто то ведущий) modbus реализуется не по проводам а по воздуху с помощью nrf24l01 батька крышует opc server ,а общаются они через uart max232 usb ну и если конеш останется время opc server сотрудничает с ментами из scada все это добро будет присоеденено к кому то процессу (может быть) который я тоже выложу со временем в этом топике будет по ходу дела реализоваться вся [криминальная xD ] цепочка сюда будет выкладываться все что я сделал со скринами исходниками и прочее хотел бы повстречать на своем боевом крещении людей которые прошли достаточное количество подводных камней с modbusом uartom usb и тд и тп вообщем все что дальше левой половины пахаря xD и готовые уделить мне немного времени с моими иногда глупыми а ингодна не глупыми воспросами хочу сказать спасибо этому мужику который два года тому назад чему то меня научил в этом топике http://forum.cxem.ne...howtopic=116831 hd44780 спасибо мужик!! ,а это идея с мигающим двоеточием меня вообще убила и я как ее вижу вспоминаю вас gl & hf !
  8. Работает ли usart от внутреннего кварца? Прога передача параметра по usart от ПК к МК. Кварц внутренний использовал в tiny 2313 на 8 мГц скорость 9600. Параметр передать не удалось.
  9. Подскажите в чём причина. Если одиночный символ передавать ,то всё работает корректно,если послать строку или число, то неправильно вот код void str_uart_send(char *string) { while(*string != '\0') { uart_send(*string); string++; } } void send_int_Uart(unsigned int c)//Отправка числа от 0000 до 9999 по UART { unsigned char temp; c=c%10000; temp=c/100; send_Uart(temp/10+'0'); send_Uart(temp%10+'0'); temp=c%100; send_Uart(temp/10+'0'); send_Uart(temp%10+'0'); }
  10. Решил я связать свою atmel8 с компом ,а покупать всякие приспособления не захотел ибо есть arduino почему бы ее не использовать. Взял у своей Atmega8 TX ножку соеденил с RX Arduino UNO Закачал программа на Arduino которая шла в примерах ,слегка изменив. #include <SoftwareSerial.h> SoftwareSerial mySerial(0, 1); // RX, TX void setup() { Serial.begin(14400); Serial.println("Goodnight moon!"); mySerial.begin(9600); } void loop() // run over and over { if (mySerial.available()) { Serial.println(mySerial.read()); } } Связь с компьютером на 14400 бот, работает , а вот как пытаюсь словить с моего atmel8 приходит какой-то бред т.е. оправляю '1' как символ приходит 128 0 0 Вот сама программа что в atmel8 #define F_CPU 1000000UL #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> //Прототипы подпрограмм void USART_Transmit( unsigned char data ); void USART_Init( unsigned int ubrr); void USART_Init( unsigned int ubrr)//Инициализация модуля USART { /* Задаем скорость работы USART 9600 */ UBRRH=0; UBRRL=51; /* Разрешаем прием и передачу по USART */ /* Устанавливаем формат данных 8 бит данных, 2 стоп бита */ UCSRA=0b00000000; UCSRB=0b00011000; UCSRC=0b10000110; } void USART_Transmit( unsigned char data ) //Функция отправки данных { while ( !(UCSRA & (1<<UDRE)) ); //Ожидание опустошения буфера приема UDR = data; //Начало передачи данных } void send_uart_str(unsigned char *s) { while(*s!=0) USART_Transmit(*s++); } int main(void) { USART_Init (); while(1) { USART_Transmit('1'); } } P/S подключаю только TX-RX а RX-TX нет ибо всё равно мне не нужно что-то отправлять в мк.
  11. Здравствуйте. Помогите кто чем может Вобщем есть список комманд, которые передёт программа контроллеру по интерфейсу RS-232. Комманды разной длины. есть 4 байта. есть 6 байт и есть 8 байт. С проверкой комманд, CRC рзобрался, а вот как определить какой длины пришла команда никак не могу На пример делаю проверку по индесу буфера, если индекс = 4 - короткая, если индекс = 6 - длинная, постоянно срабатывает фрагмент индекс = 4.... Кусок кода выкладывать не буду, заранее уверен что он не правильный, если кто поможет буду очень благодарен, а то голову уже сломал )))
  12. Всем доброе утро и спасибо за то что хоть глянули топик! Срочно нужна ваша помощь! Собственно проблема - нужно сделать частотомер на авр (Atmega8) и обеспечить передачу данных по UART. Вот то что есть уже у меня: program MAN; var rec,send,setup,cons,start,a,i:integer; var f,freq:longint; var outp,inp:string [23]; label lbl; procedure Compare(); iv IVT_ADDR_TIMER1_COMPA; begin inc(i); if i=1 then begin INT0_bit:=1; TCNT1H:=0x00; TCNT1L:=0x00; DDC1_bit:=1; end else if i=2 then begin TCCR1B:=0; INT0_bit:=0; TCNT1H:=0x00; TCNT1L:=0x00; i:=0; IntToStr(f,outp); UART1_Write_Text(outp); DDC1_bit:=0; f:=0; end; end; procedure int0p(); iv IVT_ADDR_INT0; begin inc(f); end; begin SREG_I_bit:=1; TCCR1B:=0; OCIE1A_bit:=1; OCR1AH:= 0x7a; OCR1AL:= 0x12; ISC00_bit:=1; ISC01_bit:=1; INT0_bit:=0; UART1_Init(600); PINB0_bit:=1; DDC0_bit:=0; DDC1_bit:=0; DDC2_bit:=1; While TRUE do begin if (UART_Data_Ready() = 1) then begin UART1_Read_Text(inp,'/',23); UART1_Write_Text(inp); if strstr(inp,'get') <> 0xFFFF then TCCR1B:=4; end; end; end. Но при запросе с ПК он выдает все что угодно, но не частоту (ресейв переменной сделал специально. что б смотреть не потерялось ли чего). Или напишите структурную схему частотомера (прерывание по int0 или t1). Заранее спасибо!
  13. Столкнулся с тем, что в некоторых даташитах на микроконтроллеры в таблицах, где указаны значения для определенных скоростей обмена есть ошибки. Программы для расчета в интеренете не нашел, а калькулятором не очень хотелось пользоваться... Пришлось программу написать свою. За одно добавил расчет значений для выбранной скорости обмена при различных значениях тактовой частоты - теперь удобно определиться с частотой кварца. http://www.vovka.sv19.com/CalcUART
  14. Добрый вечер, Уважаемые Форумчане! Битый час боюсь с проблемой: пытаюсь отправить по UART (Atmega32) строку следующего вида: 0x05 0x04 0x00 0x01 0x00 0x10 0x84 0x4D Но вот встала проблема: Значения отправляются, до тех пор, пока не дойдет до 0x00. После этого на выходе uart'a никаких признаков... Пишу на CVAVR. Не отправляется именно нуль и всё, что после него. Если пытаюсь отправить второй раз, то начинает отправляться, и опять встает на этом самом нуле. Пробовал и putsf, и в UDR записывать, но все попытки бесполезны. Ковырял stdio.h, ничего такого не нашел. Менял скорости, тоже бесполезно.
  15. Всем привет) Для сигнализации гаража решил реализовать оповещение через телефон. Изучил много статей по AT-командам, по UART... в итоге конкретно и не понял как с МК послать команду в телефон. Пишу на С. Хочется узнать что конкретно писать... на пальцах... Единственно, как я понял, AT-команда отправляется по одному символу... но скорее всего это лишь так кажется мне... Во многих источниках очень сложно написано... такое ощущение что все вокруг великие знатоки ... а как же новички.... :help:
  16. Вот хочу сделать опрос кнопок на одном мк отправка по Uart и вывод значения на другом мк. На восемь кнопок я б и сам сделал. Но вот в чем проблема. есть фиксирующийся кнопки и просто нажимные. Не знаю как сделать опрос чтоб сначала с первого мк пришли даные какие фикс. кноп. включены а какие нет, а потом пришли даные про нажатие остальных кнопок. Просто по очереди записывать в РОН и отправлять не работает так как даные после обработки могут пойти не в той порт. вот схема для наглядности Я не прошу чтоб вы за меня весь код написали. Просто дайте мне пинок в спину в нужном направлении.
  17. Здраствуйте. Ктонибудь в курсе как работать с uart на низком уровне( ассемблер) в AT89C51 ?
  18. Привет,Вот делаю р/у модель и столкнулся с такой проблемой - Мне нужно передавать uart сигнал с пульта на машинку. Посоветуйте готовые модули или подкиньте схемку модуля. Заранее благодарен.
  19. Требуеться отсылать данные по UART-у с большой точностью, делаю как по примеру. Схема аналогична примеру //****************************************************************************** // MSP430x47xx Demo - USCI_A0, 115200 UART Echo ISR, DCO SMCLK // // Description: Echo a received character, RX ISR used. Normal mode is LPM0. // USCI_A0 RX interrupt triggers TX Echo. // Baud rate divider with 1048576hz = 1048576/115200 = ~9.1 (009h|01h) // ACLK = LFXT1 = 32768Hz, MCLK = SMCLK = default DCO = 32 x ACLK = 1048576Hz // //* An external watch crystal between XIN & XOUT is required for ACLK *// // // MSP430x47xx // ----------------- // /|\| XIN|- // | | | 32kHz // --|RST XOUT|- // | | // | P2.4/UCA0TXD|------------> // | | 115200 - 8N1 // | P2.5/UCA0RXD|<------------ // // P. Thanigai / K.Venkat // Texas Instruments Inc. // November 2007 // Built with CCE Version: 3.2.0 and IAR Embedded Workbench Version: 3.42A //****************************************************************************** #include "msp430x47x4.h" void main(void) { volatile unsigned int i; WDTCTL = WDTPW+WDTHOLD; // Stop WDT FLL_CTL0 |= XCAP14PF; // Configure load caps do { IFG1 &= ~OFIFG; // Clear OSCFault flag for (i = 0x47FF; i > 0; i--); // Time for flag to set } while ((IFG1 & OFIFG)); // OSCFault flag still set? P2SEL |= BIT4+BIT5; // P2.4,5 = USCI_A0 RXD/TXD UCA0CTL1 |= UCSSEL_2; // SMCLK UCA0BR0 = 0x09; // 1MHz 115200 UCA0BR1 = 0x00; // 1MHz 115200 UCA0MCTL = 0x02; // Modulation UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine** IE2 |= UCA0RXIE; // Enable USCI_A0 RX interrupt _BIS_SR(LPM0_bits + GIE); // Enter LPM0, interrupts enabled } // Echo back RXed character, confirm TX buffer is ready first #pragma vector=USCIAB0RX_VECTOR __interrupt void USCIA0RX_ISR (void) { while(!(IFG2&UCA0TXIFG)); UCA0TXBUF = UCA0RXBUF; // TX -> RXed character } #include "msp430x47x4.h" #include "main.h" extern char Hello_World[] = {"Hello, World!\n\r"}; //Current RSSI as ASCII. void main(void) { WDTCTL = WDTPW+WDTHOLD; // Stop WDT // ================[ Crystal Oscillator ]=============== FLL_CTL0 |= XCAP14PF; // Configure load caps do { IFG1 &= ~OFIFG; // Clear OSCFault flag for (i = 0x47FF; i > 0; i--); // Time for flag to set } while ((IFG1 & OFIFG)); // OSCFault flag still set? // ===================================================== // ====================[ UART config ]================== //UART1: P4SEL |= BIT0+BIT1; UCA1CTL1 |= UCSSEL_2; UCA1BR0 = 0x09; UCA1BR1 = 0x00; UCA1MCTL = 0x02; UCA1CTL1 &= ~UCSWRST; // UC1IE |= UCA1RXIE; // ===================================================== CCTL0 = CCIE; // CCR0 interrupt enabled TimerChacker = 0; TACCR0 = 62500 - 1; TACTL = TASSEL_2 + ID_3 + MC_1 + TACLR; // SMCLK, up mode _BIS_SR(LPM0_bits + GIE); // Enter LPM3 } // =============== [ Timer actions ] ================== #pragma vector=TIMERA0_VECTOR __interrupt void Timer_A (void) { if (++TimerChacker == 3) { sendToWizFi(Hello_World); TimerChacker = 0; } } // ===================================================== int getLength(unsigned char mess[]){ int j; for (j=0; j<MAX_BUFF; j++){ if ((mess[j] == '\r')) break; } return j; } void sendToUART(unsigned char mess[]){ int maxLen = getLength(mess); for (int j=0; j<=maxLen; j++){ while(!(UC1IFG&UCA1TXIFG)); UCA1TXBUF = mess[j]; } } Что странно, первые пару секунд все без ошибок, а потом начинается этот адок
  20. Суть задачи состоит в следующем: необходимо разработать модуля передачи файлов (например сигнала, записанного с микрофона на плате) из USB-флешки (подключенной к плате STM32F4Discovery) по интерфейсу UART. Если кто-то этим занимался или может что-то подсказать, то буду благодарен за любую толковую информацию.
  21. Привет всем местным! Имеется вот такая схемка: Алгоритм на контроллере простой - принимает два байта данных по UART. Каждый байт подтверждает специальным байтом (не XOn/XOff). На ПК программа аналогичная, только наоборот - посылает два байта по одному и после каждого ожидает подтверждения. Но на ПК программа при чтении из порта говорит, что прочитано 0 байтов и выходит (так и должно быть - в плане выхода, а не нуля байтов). Алгоритм на контроллере: .include "m8def.inc" ; fosc = 8MHz ; Fuse-bits : MSB ... LSB (76543210) ; High byte: 11011111 ; Low byte : 11100100 .def temp = r22 .def temp2 = r18 .def dataTemp = r21 .def driveN = r19 .def stepsN = r20 ; ---------------------------------- ; подтверждение при передаче по uart - C5 .equ UART_ACK = 0b11000101 .def tempBaudRateH = r17 .def tempBaudRateL = r16 .equ DDR_SPI = DDRB .equ DD_SCK = DDB5 .equ DD_MISO = DDB4 .equ DD_MOSI = DDB3 ; uart baudrate coeff .equ uart_baudrate_h = 0b00000000 .equ uart_baudrate_l = 0b00110011 ; zero address rjmp MAIN; ; ------------ MAIN -------------- MAIN: ; configurations block ; сразу же отключаем прерывания cli ; stack init ldi temp, low(RAMEND); ldi temp2, high(RAMEND); out SPH, temp2; out SPL, temp; ; communications configuration rcall ConfigPorts; rcall SPI_MasterInit; rcall UART_Init; main_cycle: ; ожидаем приема от ПК по uart rcall UART_Rcv mov driveN, dataTemp ; номер двигателя ldi dataTemp, UART_ACK rcall UART_Snd nop rcall UART_Rcv mov stepsN, dataTemp ; число шагов mov dataTemp, driveN rcall select_Drive ; ожидаем по времени сколько необходимо для включения SPI на ведомом МК nop; nop; nop; nop; nop; nop; nop; ; передаем число шагов для выполнения mov dataTemp, stepsN rcall SPI_MasterTransmit ; немного ожидания nop; nop; nop; ; отключаем ведомый МК rcall deselect_Drives ; немного выжидаем nop; nop; ; говорим ПК, что мы передали ведомому МК данные ldi dataTemp, UART_ACK rcall UART_Snd rjmp main_cycle; ; ------------------------------- MAIN FINISHED ----------------------------- ; ----------- PROCS ------------ ; configure ports ; In - NONE ; Out - NONE ConfigPorts: ; config drive selector (PORTC) - 0,1,2,3,4,5 - out, 6 - in ldi temp, 0b00111111; out DDRC, temp; ; config (PORTB) - 0, MOSI, SCK, [1, 2 - unsused,for safety] - out, MISO - in. ldi temp, 0b00101111; out DDRB, temp; ; config UART (PORTD) - 1,2,3,4,5,6,7 - out, 0 - in ldi temp, 0b11111110; out DDRD, temp; ; globaly disable interrupts cli; ret ; allow SPI ; In - NONE ; Out - NONE SPI_MasterInit: ; Set MOSI and SCK direction to output, all others are set to input ldi temp, (1<<DD_MOSI)|(1<<DD_SCK) out DDR_SPI,temp ; Enable SPI, Master, set clock rate fck/4 ldi temp, (1<<SPE)|(1<<MSTR) out SPCR, temp ; Double the clock rate! up to fck/2 ; sbi SPSR, SPI2X ret ; SPI tranmition as master ; In - dataTemp - byte to be tranmitted ; Out - NONE SPI_MasterTransmit: ; Start transmission of data (r16) out SPDR, dataTemp Wait_Transmit: ; Wait for transmission complete sbis SPSR,SPIF rjmp Wait_Transmit ret ; UART initialization @ 9600 bps ; In - NONE ; Out - NONE UART_Init: ; setting baudrate ldi tempBaudRateH, uart_baudrate_h ldi tempBaudRateL, uart_baudrate_l out UBRRH, tempBaudRateH out UBRRL, tempBaudRateL ; Enable reciever and transmitter ldi dataTemp, (1<<RXEN)|(1<<TXEN) out UCSRB, dataTemp ; setting frame format: 8data bits, 2 stop bits ldi dataTemp, (1<<URSEL)|(1<<USBS)|(1<<UCSZ1)|(1<<UCSZ0) out UCSRC, dataTemp ret ; UART recieve proc ; In - NONE ; Out - dataTemp - recieved byte UART_Rcv: sbis UCSRA, RXC rjmp UART_Rcv in dataTemp, UDR ret ; UART send proc ; In - dataTemp - byte to be transmitted over UART ; Out - NONE UART_Snd: sbis UCSRA, UDRE rjmp UART_Snd CheckFinishPrevSnd: sbis UCSRA, TXC rjmp CheckFinishPrevSnd out UDR, dataTemp ret ; select drive ; In - dataTemp - drive to select ; Out - NONE select_Drive: andi dataTemp, 0b00000111 ori dataTemp, 0b00001000 out PORTC, dataTemp nop; nop; ret ; deselect drives ; In - NONE ; Out - dataTemp = 0 deselect_Drives: clr dataTemp ori dataTemp, 0b00110000 out PORTC, dataTemp nop; nop; ret На ПК программа выглядит так: //#include <stdafx.h> #include <Windows.h> #include <stdio.h> #include <windows.h> // ?? #define RDWR_BUFSZ 1 #define NDRIVES_MASK 0x07 #define DIR_MASK 0x01 #define DIR_POSITION 0x03 #define NSTEPS_MASK 0x7f #define ONE_BYTE 0xff #define uart_ack 0xc5 void Recv (HANDLE, unsigned char *); void Send (HANDLE, unsigned char *); int main(int argc, char* argv[]) { char file_name[256]; wchar_t wFlName[256]; LPCWSTR flName; HANDLE hSerial; DCB dcbSerialParams = {0}; COMMTIMEOUTS timeouts = {0xFFFFFFFF,0,0,0,1500}; unsigned int DriveN; unsigned int Nsteps; unsigned int Direction; unsigned int GotSmth; wchar_t lastError[1024]; unsigned char drvN, Nst, rslt; const WCHAR FileFullPath[] = {L"COM1"}; printf("Type in COM-port name. "); wscanf(L"%s", wFlName); //swprintf(wFlName, L"%s", file_name); printf("port - %s\n", wFlName); /** Начало. открытие порта. настройка **/ hSerial = CreateFile (FileFullPath, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hSerial == INVALID_HANDLE_VALUE) { printf(" Can't open port.\n"); system("pause"); ExitProcess(1); }; // Конфигурирования dcbSerialParams.DCBlength = sizeof(dcbSerialParams); if (!GetCommState(hSerial, &dcbSerialParams)) { printf(" Can't get port parameters\n"); CloseHandle(hSerial); ExitProcess(1); }; dcbSerialParams.BaudRate = CBR_9600; dcbSerialParams.fBinary = true; dcbSerialParams.fParity = NOPARITY; // False dcbSerialParams.fOutxCtsFlow = false; // no flow control by hardware (CTS) dcbSerialParams.fDtrControl = DTR_CONTROL_DISABLE; // no handshaking dcbSerialParams.fDsrSensitivity = false; // no look at DSR dcbSerialParams.fOutX = false; // no software flow control (Xon/Xoff) on Tx dcbSerialParams.fInX = false; // no software flow control (Xon/Xoff) on Rx dcbSerialParams.fErrorChar = false; // don't change error chars (checked by parity if it is True) dcbSerialParams.fNull = false; // we'll take even NULL characters dcbSerialParams.fRtsControl = RTS_CONTROL_DISABLE; // no flow control by hardware (RTS) // 8 битов данных, без бита четности, два стоповых бита dcbSerialParams.ByteSize = 8; dcbSerialParams.Parity = NOPARITY; dcbSerialParams.StopBits = TWOSTOPBITS; if(!SetCommState(hSerial, &dcbSerialParams)){ printf(" Can't set port parameters.\n"); CloseHandle(hSerial); system("pause"); ExitProcess(1); }; // время ожидания /* timeouts.ReadIntervalTimeout=50; timeouts.ReadTotalTimeoutConstant=50; timeouts.ReadTotalTimeoutMultiplier=10; timeouts.WriteTotalTimeoutConstant=50; timeouts.WriteTotalTimeoutMultiplier=10; */ if(!SetCommTimeouts(hSerial, &timeouts)){ printf(" Can't set port timeout.\n"); CloseHandle(hSerial); ExitProcess(1); }; do { printf("Type in drive No (0..7, 8 - exit) - "); scanf("%u", &DriveN); if (DriveN == 8) break; DriveN &= NDRIVES_MASK; printf("Number of halfsteps (0..127, 128 - exit) - "); scanf("%u", &Nsteps); if (Nsteps == 128) break; Nsteps &= NSTEPS_MASK; printf("Direction (1 - to there, 0 - from there) - "); scanf("%u", &Direction); Direction &= DIR_MASK; Direction <<= DIR_POSITION; Nsteps = Nsteps | Direction; drvN = DriveN & ONE_BYTE; printf(" Drive number is ready to be sent - %x\n", drvN); Send(hSerial, &drvN); Recv(hSerial, &rslt); if (rslt != uart_ack) { printf(" Wrong acknowledge got - %x\n", rslt); break; }; Nst = Nsteps & ONE_BYTE; printf(" Command is ready to be sent - %x\n", Nst); Send(hSerial, &Nst); Recv(hSerial, &rslt); if (rslt != uart_ack) { printf(" Wrong acknowledge - %x\n", rslt); break; }; } while (true); /** Конец. **/ CloseHandle(hSerial); system("pause"); return 0; } void Recv (HANDLE hSerial, unsigned char *szBuff) { DWORD dwBytesRW = 0; int RdWrResult; DWORD i; wchar_t lastError[1024]; // чтение RdWrResult = ReadFile(hSerial, szBuff, RDWR_BUFSZ, &dwBytesRW, NULL); printf(" Number of bytes read - %u\n", dwBytesRW); printf(" Data read - "); for (i = 0; i < dwBytesRW; i ++) { printf("%x ", szBuff[i]); }; printf("\n"); if(!RdWrResult){ printf("Fail on recieve.\n"); CloseHandle(hSerial); system("pause"); ExitProcess(1); } } void Send (HANDLE hSerial, unsigned char *szBuff) { DWORD dwBytesRW = 0; int RdWrResult; DWORD i; wchar_t lastError[1024]; // запись RdWrResult = WriteFile(hSerial, szBuff, RDWR_BUFSZ, &dwBytesRW, NULL); printf(" Number of bytes writen - %u\n", dwBytesRW); printf(" Data writen - "); for (i = 0; i < dwBytesRW; i ++) { printf("%x ", szBuff[i]); }; printf("\n"); if(!RdWrResult || dwBytesRW != RDWR_BUFSZ) { printf("Fail on send.\n"); CloseHandle(hSerial); system("pause"); ExitProcess(1); } } Связь настроена на формат 8N2. Помогите советом или хотя бы направлением на поиск. Еще вопрос небольшой. Хотелось бы мигалки впендюрить на линии RX и TX на MAX232. Что бы наблюдать есть ли вообще передача.
  22. Здравствуйте, пытаюсь установить связь между микроконтроллером (плата STM32F4DISCOVERY) и радиомодемом, управляемым АТ командами. Подключение к радиомодему осуществляется посредством rs232. Подключая ПК к модему всё работает, т.е. корректно отправляются команды и приходят ответы. Подключая МК к ПК связь есть, т.е. UART на МК рабочий. Подключая МК к модему связи нет - устройство не отвечает на команды. Сопряжение МК с модемом и с ПК осушествляю при помощи стандартной схему rs232-uart на max232. Прикрепляю фотографии экрана осциллографа (V/дел. = 5), ловил сигнал на TX линии: 1. МК подключен к ПК и МК высылает сообщения. Терминальная программа на ПК корректно получает высылаемые сообщения. 2. МК всё еще подключен к ПК + землю и ТX подключил к модему. Высылаемые сообщения больше не доходят до ПК. Может кто-нибудь сталкивался с подобным или может что-либо посоветовать?
  23. Возникла небольшая пробемка с получением микроокнтроллером значения, получаемого с UART. В UART передается строка вида: F6, т.е. шестнадцатиричное значение. Т.е. получается 2 байта F и 6. В микроконтроллере, мне необходимо принять эти данные и получить переменную с шестнадцатиричным значением т.е. например int c = 0xF6; Данные я принял, получив массив char UD[2] = {'F','6'}, а как мне их теперь "склеить" и получить 0xF6 не сображу
  24. Уважаемые профи! подскажите как подключить простые китайские весы к компьютеру, чтобы можно было выводить данные на экран. Подскажите! поделитесь схемой. Можно ли с дисплея выводить данные? Я в этом деле человек новый, но решение данной задачи очень нужно. Вот такие весы!
×
×
  • Create New...