Перейти к содержанию

Sergy

Members
  • Постов

    65
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные Sergy

  1. Может дело в ожидании UDRE а не TXC.

    Я уже проверил. убрал цикл проверки флага TXC. На max232 пошел бликовать диод, показывающий передачу.

    UPD: Возможная причина - у меня отключены прерывания как USART-а так и глобально. А это значит, что если я нигде не записываю 1 в флаг TXC, то он никоим образом не снимется. Потому и был стопор. Думаю (надеюсь), что это так.

  2. Обнаружил, что эдакое "зависание" происходит на вот этом участке:

    CheckFinishPrevSnd:
       sbis UCSRA, TXC
       rjmp CheckFinishPrevSnd
    

    Из этого цикла и не можем выйти.

    А ведь именно после него происходит выдача на отправление через

    out UDR, dataTemp

    .

    Помогите разобраться что не так в этом цикле?

    Я так думаю, что придется использовать прерывания "по приему" и "по передаче"?

  3. Аналогичная ситуация. Есть-ли решение? Пробывали токопроводящим клеем, ничего хорошего не вышло, он растекается и замыкает соседние дорожки и затвердевает порядка 30 минут, один контакт получилось вывести а второй нет :-(, и обратно с графитом стирается. Может есть другие варианты?

    Насчет других вариантов не скажу. У меня получилось все таки токопроводящим клеем сделать. Провод крепили крокодилами (что бы не шевелился). Во время клеения ровняли клей лезвием. Накладывали клей - зубочисткой. Оставляли сохнуть на сутки.

  4. Ясно. А, вообще, моя схема хоть работоспособна?Я уже замаялся тестовые прошивки клепать по пара-пять раз в день и на диоды смотреть как они молчат.

    К примеру:

    .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В.

    Что это за дела не могу сообразить.

  5. А схема там попутана, точно.

    Там - по ссылке или у меня?

    Вообще, я по-думываю, что наверное надо было таймауты выставить вменяемые, а не безожидательный порт настраивать.

    И, вообще, это нормально, что сразу по получении первого байта данных я начинаю отправку подтверждения? В плане - "стоповые биты" и все такое, линия должна быть отпущена некоторое время перед очередной отправкой. То есть: у меня скорость передачи данных выставлена 9600 битов в секунду; это значит, что один бит занимает 0,000104167 секунды; при двух стоповых битах линия должна быть отпущена вот столько времени - 0,000208333 секунды. А у меня сразу же начинается отправка байта подтверждения. Это нормально или стоило бы выждать?

  6. Ладно. С max-ми я-то разберусь. Тут бы еще с включением к компьютеру разобраться. Нарыл схемку на сайте. И никак не могу сообразить - чего же они используют одну единую линию (и то - зацикленную) и DB9 у них находится со стороны TTL? Может я не правильно составил свою схему?

  7. Да не нужно эту микросхему (MC33199)-это схема для автодиагностики . Просто на примере этой схеме хотел показать, как реализована индикация приема-передачи для MAX 232 . Смотрите только на обвязку MAX232.

    Но в описании на MAX232 (от MAXIM и от TI) конденсаторы указаны в 1мкФ. А вот у st232 - 0.1мкФ.

    Может какая опечатка на картинке?

    И все же мне досадно с программой.

  8. Привет всем местным!

    Имеется вот такая схемка:

    5dcbb5ec840f.jpg

    Алгоритм на контроллере простой - принимает два байта данных по 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. Что бы наблюдать есть ли вообще передача.

  9. И что это даст? Ведомые МК работать будут с непрерывной генерацией периодов, т.е. "ждать друг друга" не будут. Так и не понял "прелести" такой точности и чему мешает рассинхронизация тактирования.

    Нужна не синхронность в ожидании ими друг друга, но синхронность (минимизация погрешности) в задержках между выполнением команд на различных МК.

  10. Рассинхронизацию можно наносекундами измерять в случае, если используются кварцы. Время сильно может уплыть, если Вы будете измерять год. Если Вы измеряете секунды - накопленная ошибка в виде лишних сотен наносекнуд вряд ли повлияет на отсчёт такого короткого времени.

    Если всё равно не хотите мириться с лишними наносекундами - поставьте один тактовый генератор, контроллеры настройте на внешний генератор и разведите с одного ТГ на все МК общий такт. И всё равно там будет небольшая рассинхронизация из-за ограничения времени распостранения сигнала - логично, что тот контроллер, который ближе к ТГ, получит фронт раньше, чем тот, что дальше. Ну и соответственно разница по времени будет ещё более мизерной - минимально доступной :)

    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Гц сигнал на выводы прерывания и по нему считать время, а старт счета производить ведущим контроллером???

    Я бы так и сделал, но интервалы времени могут иметь длительность до миллисекунд и до пары тактов МК и до секунд.

    Мне тут посоветовали сделать так. Что бы не париться с внешним генератором можно использовать на головном МК его внутренний генератор и от него тактировать ведомые контроллеры.

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

  11. Рассинхронизации чего? 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).

  12. Насчет передачи данных в работе. Они действительно передаются, но только между внешней ОЗУ и ведомым МК. У каждого ведомого МК своя внешняя память.

    Переданными ведомым МК длинами интервалов времени заложен некоторый алгоритм. Выполнение его будет по-началу синхронным. Но поскольку у каждого МК своя погрешность в тактировании, то это может сказаться на рассинхонизации в будущем.

  13. Возможность конечно есть. Только вот, без вашей помощи, этого никак не сделать.

    Какие изменения, доработки доступны в вашей системе?

    Система находиться на стадии разработки. Потому пока любые, кроме концептуальных - то есть алгоритма работы системы. А алгоритм такой:

    Головной (ведущий) контроллер получает через UART данные (те самые длительности временных интервалов) и записывает их во внешнюю ОЗУ соответствующего ведомого контроллера. После этого ждет кодового слова по UART и дает всем сигнал (по линии внешнего прерывания) ведомым МК.

    Только запуск всех МК от одного осциллятора.

    А если они находятся на разных платах? Дело в том, что в будущем подразумевается изменение количества ведомых МК.

    Хотя, в принципе, можно их и на одной плате сделать, ведь максимальное количество ограничено.

    Можете схему подсказать на подключение нескольких МК к одному генератору? Или используется стандартное включение (конденсаторы + кристалл и совместное использование выводов)? А как тогда насчет помех в связи с внутренностями МК?

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

    В некоторой системе имеется несколько микроконтроллеров. Все они используют внутренние тактовые генераторы на одинаковой частоте. Работу все они начинают одновременно. Вполне возможно, что через некоторое время между ними возникнет рассинхронизация.

    Есть ли возможность синхронизировать эти несколько МК?

    Каждый из этих МК делает одно и то же. Читает длительность временного интервала из внешней (для каждого своей) памяти, выжидает его по таймеру или циклом, делает свое дело и читает длительность следующего временного интервала.

    Заранее благодарен за ответ или подсказку.

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

    Недавно спаял схему на L297 и L298 для управления шаговым двигателем.

    Схему сделал модульной - управляющая часть (L297 и ее обвязка) отдельно от коммутатора (L298).

    Начал проверять отдельные части. Часть с L298 - вполне рабочая. Вручную выставлял входные напряжения идвигатель вращался как положено.

    Проверил и L297. Тут с работой не сложилось.

    Сама схема с L297:

    17da119f1563.jpg

    Измерил сигналы на ногах 1-12, 16, 20.

    Pin 1:

    0bed8037ce07.jpg

    Pin 2:

    21c86c5b25df.jpg

    Pin 3:

    b46a826e79e3.jpg

    Pin 4, 5:

    58b249c6dbbb.jpg

    Pin 6:

    c704a14415d5.jpg

    Pin 7, 8, 9:

    a5ec19495243.jpg

    Pin 10:

    7a3a31d78f3b.jpg

    Pin 11:

    4e586f92a549.jpg

    Pin 12:

    93e035fe43c3.jpg

    Pin 16:

    e2614ba87924.jpg

    Pin 20:

    ecbb17e4cfe7.jpg

    На картинках -

    Vp-p - разность максимума и минимума напряжения сигнала

    dV - разность напряжения между серыми верхней и нижней линиями

    dT - разность по времени между серыми правой и левой линиями

    1/dT - соответствующая dT частота

    Z - линия нулевого напряжения.

    При съеме сигналов линии Sense1 и Sense2 "висели".

    Еще на схеме неточность есть. Конденсатор C2 - 3.3nF, резистор R1 - 22k. Эти параметры соответствуют частоте генератора близкой к 21кГц.

    На 15-й ноге напряжение около 1.2 В.

    Джампер на 11 ноге выставлен в положение +5 В.

    Кто что может подсказать по этому поводу?

    Маюсь уже неделю с этой схемой. Третий раз перепаял заново.

  16. К графитовым площадкам приходят медные дорожки, к ним и паяй.

    Я их уже искал. Не нашел. Полностью вымощено графитом и дорожки подводящие и сами контактные площадки.

    Сегодня, наверное, уже ничего не буду делать. У нас здесь пол-десятого (детское время, но все же). Погляжу кто еще что предложит.

    Если кому интересно - телефон Nokia 1280.

  17. Если надо на 5 мин - прижми прищепкой

    Кабы только на 5 минут. Тут на полгода минимум надо.

    Графит счистить шкуркой, под ним будет медь. К ней и припаяться.

    А медь точно будет? Я уже думал сделать отверстие и винтом с шайбой прижать, но вовремя заметил дорожки на плате под графитом. Я просто я не уверен, что это медь покрытая графитом (телефон не мой, но слезно по-просили помочь).

    Я так понимаю нождачка-нулкевка в самый раз будет.

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

    Имеется телефон в уже разобраном состоянии. Разобранный он с целью вывода контактов одной кнопки вызова наружу. Контакты на клавиатуре (вполне естественно) графитовые. Нужно именно к ним и припаяться. Пытался залудить контакты и с канифолью и с аспирином (ацетил-салицыловая кислота) эффект - не лудится.

    Может кто чего посоветует? Сил уже нет искать. А припаять нужно до боли срочно.

×
×
  • Создать...