Sergy Опубликовано 1 марта, 2013 Поделиться Опубликовано 1 марта, 2013 (изменено) Привет всем местным! Имеется вот такая схемка: Алгоритм на контроллере простой - принимает два байта данных по 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. Что бы наблюдать есть ли вообще передача. Изменено 1 марта, 2013 пользователем Sergy 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
galunko Опубликовано 1 марта, 2013 Поделиться Опубликовано 1 марта, 2013 Индикация для MAX 232: 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
20% скидка на весь каталог электронных компонентов в ТМ Электроникс!Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!Перейти на страницу акции Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849
Sergy Опубликовано 1 марта, 2013 Автор Поделиться Опубликовано 1 марта, 2013 Индикация для MAX 232: А можно ли обойтись без MX33199? Просто это нужно наскоряк - за два дня доделать (вместе с программой). Я имею в виду - осилит ли RS232 на компьютере нагрузку в два канала? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
galunko Опубликовано 1 марта, 2013 Поделиться Опубликовано 1 марта, 2013 Да не нужно эту микросхему (MC33199)-это схема для автодиагностики . Просто на примере этой схеме хотел показать, как реализована индикация приема-передачи для MAX 232 . Смотрите только на обвязку MAX232. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Sergy Опубликовано 1 марта, 2013 Автор Поделиться Опубликовано 1 марта, 2013 Да не нужно эту микросхему (MC33199)-это схема для автодиагностики . Просто на примере этой схеме хотел показать, как реализована индикация приема-передачи для MAX 232 . Смотрите только на обвязку MAX232. Но в описании на MAX232 (от MAXIM и от TI) конденсаторы указаны в 1мкФ. А вот у st232 - 0.1мкФ. Может какая опечатка на картинке? И все же мне досадно с программой. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
galunko Опубликовано 1 марта, 2013 Поделиться Опубликовано 1 марта, 2013 MAX-ы 232 разные бывают. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Sergy Опубликовано 1 марта, 2013 Автор Поделиться Опубликовано 1 марта, 2013 Ладно. С max-ми я-то разберусь. Тут бы еще с включением к компьютеру разобраться. Нарыл схемку на сайте. И никак не могу сообразить - чего же они используют одну единую линию (и то - зацикленную) и DB9 у них находится со стороны TTL? Может я не правильно составил свою схему? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
andryvlad Опубликовано 2 марта, 2013 Поделиться Опубликовано 2 марта, 2013 Там только передача данных с ПК, а петля Rx/Tx сделана для контроля отправленных данных в окне терминала. А схема там попутана, точно. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Sergy Опубликовано 2 марта, 2013 Автор Поделиться Опубликовано 2 марта, 2013 А схема там попутана, точно. Там - по ссылке или у меня? Вообще, я по-думываю, что наверное надо было таймауты выставить вменяемые, а не безожидательный порт настраивать. И, вообще, это нормально, что сразу по получении первого байта данных я начинаю отправку подтверждения? В плане - "стоповые биты" и все такое, линия должна быть отпущена некоторое время перед очередной отправкой. То есть: у меня скорость передачи данных выставлена 9600 битов в секунду; это значит, что один бит занимает 0,000104167 секунды; при двух стоповых битах линия должна быть отпущена вот столько времени - 0,000208333 секунды. А у меня сразу же начинается отправка байта подтверждения. Это нормально или стоило бы выждать? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
fuckir Опубликовано 2 марта, 2013 Поделиться Опубликовано 2 марта, 2013 MAX232 работает и с 0.1 мкф и с 1 мкф. проверено! Использую обычно 0.1 0 В поисках работы.. Looking for job Ссылка на комментарий Поделиться на другие сайты Поделиться
Sergy Опубликовано 2 марта, 2013 Автор Поделиться Опубликовано 2 марта, 2013 (изменено) Ясно. А, вообще, моя схема хоть работоспособна?Я уже замаялся тестовые прошивки клепать по пара-пять раз в день и на диоды смотреть как они молчат. К примеру: .include "m8def.inc" ; fosc = 8MHz ; Fuse-bits : MSB ... LSB (76543210) ; High byte: 11011111 ; Low byte : 11100100 .def temp = r25 .def temp2 = r18 .def dataTemp = r21 .def driveN = r19 .def stepsN = r20 ; формируем задержку .def Razr0 = r22 .def Razr1 = r23 .def Razr2 = r24 .equ Waiting0 = 0b10000000 .equ Waiting1 = 0b00011010 .equ Waiting2 = 0b00000110 ; ---------------------------------- ; подтверждение при передаче по 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; sbi PORTB, 1 main_cycle: ; ожидаем приема от ПК по uart ; cbi PORTB, 1 ; посылаем по uart один единственный байт. ldi dataTemp, UART_ACK rcall UART_Snd ; sbi PORTB, 1 ; подождем 250 миллисекунд? ;-) ldi Razr0, Waiting0 ldi Razr1, Waiting1 ldi Razr2, Waiting2 Waiting_250ms: subi Razr0, 1 sbci Razr1, 0 sbci Razr2, 0 brcc Waiting_250ms 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 - unused,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 ; SPI recieve routine (it uses FIFO-ed SPI with 0b00000000 data to be sent) ; In - NONE ; Out - dataTemp - retrieved byte SPI_Recieve: clr dataTemp rcall SPI_MasterTransmit in dataTemp, SPDR 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 Если закоментировать перед main_cycle команду sbi PORTB, 1 и раскоментировать эту же команду внутри цикла main_cycle, то на 15-м пине (PORTB1) нет напряжения. А если оставить команду sbi PORTB, 1 перед main_cycle рамкоменьированной - на PORTB1 есть напряжение. При этом на линии TX (третий пин) всегда +5В. Что это за дела не могу сообразить. Изменено 2 марта, 2013 пользователем Sergy 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Sergy Опубликовано 2 марта, 2013 Автор Поделиться Опубликовано 2 марта, 2013 Обнаружил, что эдакое "зависание" происходит на вот этом участке: CheckFinishPrevSnd: sbis UCSRA, TXC rjmp CheckFinishPrevSnd Из этого цикла и не можем выйти. А ведь именно после него происходит выдача на отправление через out UDR, dataTemp . Помогите разобраться что не так в этом цикле? Я так думаю, что придется использовать прерывания "по приему" и "по передаче"? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
COKPOWEHEU Опубликовано 2 марта, 2013 Поделиться Опубликовано 2 марта, 2013 MAX232 работает и с 0.1 мкф и с 1 мкф. проверено! Использую обычно 0.1 У меня с 10 мкФ и 22 мкФ работает Помогите разобраться что не так в этом цикле? Евстифеев рекомендует такую процедуру передачи USARTJTransmit: ; Ждать очистки буфера передатчика sbis UCSRA,UDRE rjmp USART_Transmit ; Скопировать 9-й бит данных из г17 в ТХВ8 ;мой коммент: следующие 4 строки можно выкинуть если используется 8N1 без проверки на ошибки. cbi UCSRB,TXB8 sbrc rl7,0 sbi UCSRB,TXB8 ; Загрузить младший байт данных в буфер, начать передачу out UDR,rl6 ret Может дело в ожидании UDRE а не TXC. 0 Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз. Часть моих наработок. Ссылка на комментарий Поделиться на другие сайты Поделиться
Sergy Опубликовано 2 марта, 2013 Автор Поделиться Опубликовано 2 марта, 2013 (изменено) Может дело в ожидании UDRE а не TXC. Я уже проверил. убрал цикл проверки флага TXC. На max232 пошел бликовать диод, показывающий передачу. UPD: Возможная причина - у меня отключены прерывания как USART-а так и глобально. А это значит, что если я нигде не записываю 1 в флаг TXC, то он никоим образом не снимется. Потому и был стопор. Думаю (надеюсь), что это так. Изменено 2 марта, 2013 пользователем Sergy 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
fuckir Опубликовано 2 марта, 2013 Поделиться Опубликовано 2 марта, 2013 COKPOWEHEU на сколько я помню там по рекомендациям является кратность 10. В отладочных платах ,микрочипа по-крайней мере, вешают кондеры 0.1 мк 0 В поисках работы.. Looking for job Ссылка на комментарий Поделиться на другие сайты Поделиться
COKPOWEHEU Опубликовано 2 марта, 2013 Поделиться Опубликовано 2 марта, 2013 зависит от марки микросхемы, для старых версий рекомендуется 10 мкФ, новые и при 0.1 мкФ работают. 22 мкФ ставил так как ничего лучше под рукой не было. <...> Возможная причина - у меня отключены прерывания как USART-а так и глобально.<...>Думаю (надеюсь), что это так. Нет, я недавно пытался запустить avr910-совместимый бутлоадер, не разрешал там прерывания, но прием и передача осуществлялись нормально, именно с проверкой битов UDRE и RXC (если интересно частота 115200, 8N1) причем в симуляторе студии на этом месте зависает либо я просто не знаю как ему сказать что передача завершена, но это не важно. 0 Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз. Часть моих наработок. Ссылка на комментарий Поделиться на другие сайты Поделиться
Sergy Опубликовано 2 марта, 2013 Автор Поделиться Опубликовано 2 марта, 2013 Нет, я недавно пытался запустить avr910-совместимый бутлоадер, не разрешал там прерывания, но прием и передача осуществлялись нормально, именно с проверкой битов UDRE и RXC (если интересно частота 115200, 8N1) причем в симуляторе студии на этом месте зависает либо я просто не знаю как ему сказать что передача завершена, но это не важно. По RXC у меня прием нормально осуществляется. Передача нормально ведется по UDRE. P.S.: У студии есть симулятор? Возможно ему стоит дать на скормление какой-нибудь файл или по-пробовать что-нибудь с виртуальным портом? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Sergy Опубликовано 3 марта, 2013 Автор Поделиться Опубликовано 3 марта, 2013 С UART-ом я разобрался. Выставил таймауты, нормально прием пошел (контроллер не успевал так быстро отвечать). Но появились кое-какие помехи. Составил небольшую программу (для ПК и для меги) для кольцевания связи. То есть - на компе задал байт на отправку, мега его принимает и отправляет назад, комп этот байт выводит. Помехи такие - иногда выставляется старший бит в логическую единицу. При этом, когда подключаюсь через HyperTerminal, то таких "спецэффектов" не показывается. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.