Sergy
-
Постов
65 -
Зарегистрирован
-
Посещение
Тип контента
Профили
Форумы
Блоги
Сообщения, опубликованные Sergy
-
-
Обнаружил, что эдакое "зависание" происходит на вот этом участке:
CheckFinishPrevSnd: sbis UCSRA, TXC rjmp CheckFinishPrevSnd
Из этого цикла и не можем выйти.
А ведь именно после него происходит выдача на отправление через
out UDR, dataTemp
.
Помогите разобраться что не так в этом цикле?
Я так думаю, что придется использовать прерывания "по приему" и "по передаче"?
0 -
Аналогичная ситуация. Есть-ли решение? Пробывали токопроводящим клеем, ничего хорошего не вышло, он растекается и замыкает соседние дорожки и затвердевает порядка 30 минут, один контакт получилось вывести а второй нет :-(, и обратно с графитом стирается. Может есть другие варианты?
Насчет других вариантов не скажу. У меня получилось все таки токопроводящим клеем сделать. Провод крепили крокодилами (что бы не шевелился). Во время клеения ровняли клей лезвием. Накладывали клей - зубочисткой. Оставляли сохнуть на сутки.
0 -
Ясно. А, вообще, моя схема хоть работоспособна?Я уже замаялся тестовые прошивки клепать по пара-пять раз в день и на диоды смотреть как они молчат.
К примеру:
.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В.
Что это за дела не могу сообразить.
0 -
А схема там попутана, точно.
Там - по ссылке или у меня?
Вообще, я по-думываю, что наверное надо было таймауты выставить вменяемые, а не безожидательный порт настраивать.
И, вообще, это нормально, что сразу по получении первого байта данных я начинаю отправку подтверждения? В плане - "стоповые биты" и все такое, линия должна быть отпущена некоторое время перед очередной отправкой. То есть: у меня скорость передачи данных выставлена 9600 битов в секунду; это значит, что один бит занимает 0,000104167 секунды; при двух стоповых битах линия должна быть отпущена вот столько времени - 0,000208333 секунды. А у меня сразу же начинается отправка байта подтверждения. Это нормально или стоило бы выждать?
0 -
Ладно. С max-ми я-то разберусь. Тут бы еще с включением к компьютеру разобраться. Нарыл схемку на сайте. И никак не могу сообразить - чего же они используют одну единую линию (и то - зацикленную) и DB9 у них находится со стороны TTL? Может я не правильно составил свою схему?
0 -
Да не нужно эту микросхему (MC33199)-это схема для автодиагностики . Просто на примере этой схеме хотел показать, как реализована индикация приема-передачи для MAX 232 . Смотрите только на обвязку MAX232.
Но в описании на MAX232 (от MAXIM и от TI) конденсаторы указаны в 1мкФ. А вот у st232 - 0.1мкФ.
Может какая опечатка на картинке?
И все же мне досадно с программой.
0 -
Индикация для MAX 232:
А можно ли обойтись без MX33199? Просто это нужно наскоряк - за два дня доделать (вместе с программой).
Я имею в виду - осилит ли RS232 на компьютере нагрузку в два канала?
0 -
Привет всем местным!
Имеется вот такая схемка:
Алгоритм на контроллере простой - принимает два байта данных по 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. Что бы наблюдать есть ли вообще передача.
0 -
Понял.
0 -
Вопрос был безотносительно схемы. Просто задумался чего-то.
0 -
Но ведь периоды у МК планируются разные. Значит набег смещения началов тактов неизбежен.
Да. Но из-за различных погрешностей тактовой частоты набеги будут разными.
0 -
И что это даст? Ведомые МК работать будут с непрерывной генерацией периодов, т.е. "ждать друг друга" не будут. Так и не понял "прелести" такой точности и чему мешает рассинхронизация тактирования.
Нужна не синхронность в ожидании ими друг друга, но синхронность (минимизация погрешности) в задержках между выполнением команд на различных МК.
0 -
Рассинхронизацию можно наносекундами измерять в случае, если используются кварцы. Время сильно может уплыть, если Вы будете измерять год. Если Вы измеряете секунды - накопленная ошибка в виде лишних сотен наносекнуд вряд ли повлияет на отсчёт такого короткого времени.
Если всё равно не хотите мириться с лишними наносекундами - поставьте один тактовый генератор, контроллеры настройте на внешний генератор и разведите с одного ТГ на все МК общий такт. И всё равно там будет небольшая рассинхронизация из-за ограничения времени распостранения сигнала - логично, что тот контроллер, который ближе к ТГ, получит фронт раньше, чем тот, что дальше. Ну и соответственно разница по времени будет ещё более мизерной - минимально доступной
abs(T1-T2)+abs(d1-d2)А если взять идеальный такт без погрешности d1 и d2 = 0 ??? Выходит 3 + abs(0 - 0) = 3 + 0 = всё равно 3. Как так c ТГ без погрешности разброс 3 ??? Я конечно не знаю, как это считается, но эта формула на рассчёт ошибки не тянет.
abs(T1-T2)+abs(d1-d2) - Это абсолютное значение задержки между выполнеными командами. Погрешность составляет abs(d1-d2).
По-скольку предполагается длительная работа обоих МК (ну, скажем час-два, может больше), то погрешность станет накопляться.
С чего бы ей накопляться, если все вновь приказанные интервалы отмеряются с нуля, а не с того места, где он закончил предыдущий счёт? Или обнуления нет? хехе
Интервал отмеряются "от нуля". Но ведь этими интервалами задан алгоритм - то есть последовательное выполнение команд (выдача импульса по окончанию каждого интервала времени). Каждый ведомый МК работает так - взял длительность интервала времени из внешней ОЗУ, выждал этот интервал, дал импульс, взял следующую длительность...
Если синхронизация по времени нужно, то не проще ли подать внешний 1Гц сигнал на выводы прерывания и по нему считать время, а старт счета производить ведущим контроллером???
Я бы так и сделал, но интервалы времени могут иметь длительность до миллисекунд и до пары тактов МК и до секунд.
Мне тут посоветовали сделать так. Что бы не париться с внешним генератором можно использовать на головном МК его внутренний генератор и от него тактировать ведомые контроллеры.
Насчет опытной конструкции - даже если рассинхронизация будет небольшой, имеет смысл хотя бы знать как устранять ее в некоторых других случаях. Вопрос - всегда имеет место.
0 -
Рассинхронизации чего? Sergy, чего вы опасаетесь конкретно? Какой алгоритм должен дать сбой из-за рассинхронизации? Объясните подробнее, лучше с примером.
Ок. Такой вот пример.
Одному МК дали команду - ждать T1=5 секунд. Другому МК дали команду - ждать T2=2 секунды (dT = abs(T1-T2) = 3 секунды). У каждого МК свой погрешность тактирования (как на выполнение команд - на случай реализации задержки циклом, так и на таймере). Предположим, погрешность первого МК - d1, второго - d2.
По окончании выполнения обоими МК своих команд dT составит abs(T1-T2)+abs(d1-d2) != 3 сек.
По-скольку предполагается длительная работа обоих МК (ну, скажем час-два, может больше), то погрешность станет накопляться, а значит у нас будет не один abs(d1-d2), а целая их сумма - по командам - sum(abs(d1-d2)). i - счетчик команд (длительностей интервалов времени).
Желание мое - уменьшить abs(d1-d2).
0 -
Насчет передачи данных в работе. Они действительно передаются, но только между внешней ОЗУ и ведомым МК. У каждого ведомого МК своя внешняя память.
Переданными ведомым МК длинами интервалов времени заложен некоторый алгоритм. Выполнение его будет по-началу синхронным. Но поскольку у каждого МК своя погрешность в тактировании, то это может сказаться на рассинхонизации в будущем.
0 -
Если много МК...
...то общаться они будут между собой по интерфейсу TWI(I2C) и не важно, какая у них будет рассинхронизация.
Нет. В моем случае общение происходит по SPI. И не между ведомыми МК.
0 -
Возможность конечно есть. Только вот, без вашей помощи, этого никак не сделать.
Какие изменения, доработки доступны в вашей системе?
Система находиться на стадии разработки. Потому пока любые, кроме концептуальных - то есть алгоритма работы системы. А алгоритм такой:
Головной (ведущий) контроллер получает через UART данные (те самые длительности временных интервалов) и записывает их во внешнюю ОЗУ соответствующего ведомого контроллера. После этого ждет кодового слова по UART и дает всем сигнал (по линии внешнего прерывания) ведомым МК.
Только запуск всех МК от одного осциллятора.
А если они находятся на разных платах? Дело в том, что в будущем подразумевается изменение количества ведомых МК.
Хотя, в принципе, можно их и на одной плате сделать, ведь максимальное количество ограничено.
Можете схему подсказать на подключение нескольких МК к одному генератору? Или используется стандартное включение (конденсаторы + кристалл и совместное использование выводов)? А как тогда насчет помех в связи с внутренностями МК?
0 -
Здравствуйте.
В некоторой системе имеется несколько микроконтроллеров. Все они используют внутренние тактовые генераторы на одинаковой частоте. Работу все они начинают одновременно. Вполне возможно, что через некоторое время между ними возникнет рассинхронизация.
Есть ли возможность синхронизировать эти несколько МК?
Каждый из этих МК делает одно и то же. Читает длительность временного интервала из внешней (для каждого своей) памяти, выжидает его по таймеру или циклом, делает свое дело и читает длительность следующего временного интервала.
Заранее благодарен за ответ или подсказку.
0 -
Перепаял схему. Уменьшил длины проводников. Схема стала нормально работать.
0 -
Здраствуйте.
Недавно спаял схему на L297 и L298 для управления шаговым двигателем.
Схему сделал модульной - управляющая часть (L297 и ее обвязка) отдельно от коммутатора (L298).
Начал проверять отдельные части. Часть с L298 - вполне рабочая. Вручную выставлял входные напряжения идвигатель вращался как положено.
Проверил и L297. Тут с работой не сложилось.
Сама схема с L297:
Измерил сигналы на ногах 1-12, 16, 20.
Pin 1:
Pin 2:
Pin 3:
Pin 4, 5:
Pin 6:
Pin 7, 8, 9:
Pin 10:
Pin 11:
Pin 12:
Pin 16:
Pin 20:
На картинках -
Vp-p - разность максимума и минимума напряжения сигнала
dV - разность напряжения между серыми верхней и нижней линиями
dT - разность по времени между серыми правой и левой линиями
1/dT - соответствующая dT частота
Z - линия нулевого напряжения.
При съеме сигналов линии Sense1 и Sense2 "висели".
Еще на схеме неточность есть. Конденсатор C2 - 3.3nF, резистор R1 - 22k. Эти параметры соответствуют частоте генератора близкой к 21кГц.
На 15-й ноге напряжение около 1.2 В.
Джампер на 11 ноге выставлен в положение +5 В.
Кто что может подсказать по этому поводу?
Маюсь уже неделю с этой схемой. Третий раз перепаял заново.
0 -
Начал снимать графит. Под ним не оказалось меди. Подумываю насчет клея...
0 -
К графитовым площадкам приходят медные дорожки, к ним и паяй.
Я их уже искал. Не нашел. Полностью вымощено графитом и дорожки подводящие и сами контактные площадки.
Сегодня, наверное, уже ничего не буду делать. У нас здесь пол-десятого (детское время, но все же). Погляжу кто еще что предложит.
Если кому интересно - телефон Nokia 1280.
0 -
Если надо на 5 мин - прижми прищепкой
Кабы только на 5 минут. Тут на полгода минимум надо.
Графит счистить шкуркой, под ним будет медь. К ней и припаяться.А медь точно будет? Я уже думал сделать отверстие и винтом с шайбой прижать, но вовремя заметил дорожки на плате под графитом. Я просто я не уверен, что это медь покрытая графитом (телефон не мой, но слезно по-просили помочь).
Я так понимаю нождачка-нулкевка в самый раз будет.
0 -
Здраствуйте!
Имеется телефон в уже разобраном состоянии. Разобранный он с целью вывода контактов одной кнопки вызова наружу. Контакты на клавиатуре (вполне естественно) графитовые. Нужно именно к ним и припаяться. Пытался залудить контакты и с канифолью и с аспирином (ацетил-салицыловая кислота) эффект - не лудится.
Может кто чего посоветует? Сил уже нет искать. А припаять нужно до боли срочно.
0
Связь Atmega8 С Пк Через Rs232
в МК для начинающих
Опубликовано · Изменено пользователем Sergy
Я уже проверил. убрал цикл проверки флага TXC. На max232 пошел бликовать диод, показывающий передачу.
UPD: Возможная причина - у меня отключены прерывания как USART-а так и глобально. А это значит, что если я нигде не записываю 1 в флаг TXC, то он никоим образом не снимется. Потому и был стопор. Думаю (надеюсь), что это так.