Jump to content
    

sidy

Свой
  • Posts

    351
  • Joined

  • Last visited

Reputation

0 Обычный

About sidy

  • Rank
    Местный
    Местный

Recent Profile Visitors

3,983 profile views
  1. Добрый день! Есть MPLAB v8.92 и программа, написанная на ассемблере для PIC. Так вот, когда прошиваешь контроллер с помощью ПК на котором установлена Win7 64bit все нормально - программа работает как и задумано. Но когда прошиваешь контроллер на ПК, на котором установлена Win10 64bit, возникает проблема - вместо констант, которые записываются в EEPROM "по умолчанию" записываются совершенно другие значения. Контроллер pic18f452. В чем может быть дело?
  2. А если эти резисторы установить большей величины, например 100...200 Ом?
  3. Понятно. А какой номинал должен быть у этих резисторов?
  4. Добрый день! Возник вопрос по схеме защиты входных цепей приемо-передатчика RS485: На схеме есть резисторы R32, R31 - какова их функция? (Поискал в интернете подобные схемы попадались без этих резисторов) И какой должен быть их номинал?
  5. Я не мог подумать, что в микросхеме "с завода" может быть включен WDT.
  6. Выключил WDT. Сигнал RST исчез. Обмен работает исправно. k155la3 выражаю Вам благодарность! Спасибо. Очень помогли.
  7. Я прочитал регистр 0х0А - Watchdog Control - значение 0х9E или 0b1001 1110 - т.е. получается, что WDT включен Прочитал еще регистр 0х0B - Companion Control - там все нули. И еще дополню. Процессы в программе не причем - я проверил это путем удерживание МК в состоянии сброс. А на выходе ~RST микросхемы все равно продолжает с той же периодичностью появляться сигнал.
  8. Проверил линию питания и сигнал ~RST: Питание стабильно. (Значит получается, что LVD не причем?) Да период получается всегда около ~5 сек. С началом обмена по i2c сброс не связан (верхний луч ~RST нижний SCL): Остается еще проверить WDT - но по описанию у него максимальный период 3 сек.
  9. Да, действительно - PFI переподключил на землю. (Не помогло) R6, R7 1 кОм Питание PIC18 тоже +5 В. Он не виснет намертво - следующий запрос может пройти нормально. Раз 10 за минуту происходит такой затык. Длина линий небольшая. Вот что на выходе RST (написано, что если не используется оставьте не подключенным) Какой второй блокировочный конденсатор? По питанию батареи?
  10. Вот схема включения Батарея подключена. Кварц стабилен.
  11. Стало понятно почему так происходит. Есть функция проверки подтверждение slave: // Функция GET_ACKSTAT_BIT возвращает бит ACKSTAT из регистра SSP1CON2: static unsigned char I2C1_getAckstatBit(void) { return SSP1CON2bits.ACKSTAT; // Return ACKSTAT bit } Она вызывается if (I2C1_getAckstatBit()) { return ; } Т.е. периодически нет подтверждения от slave. Осталось только понять почему это происходит. Причем это происходит не хаотично, а всегда после отправки 0xD0. I2C1_sendData(writeAddress); Т.е. возможно как тут уже писал ув. =AK= некорректно проверяется STOP условие?
  12. Чтобы обратиться к часам я должен передать адрес 0xD0. Если я сдвину этот адрес на 1 влево, то получу 0хА0. И микросхема не воспримет этот адрес как верный.
  13. Попробовал использовать данный пример: // The INTERRUPT function waits for the SSP1IF flag to be triggered by the hardware and clears it: // Функция INTERRUPT ожидает, пока аппаратное обеспечение активирует флаг SSP1IF и очищает его static void I2C1_interruptFlagPolling(void) { while (!PIR1bits.SSP1IF){}; // Polling Interrupt Flag PIR1bits.SSP1IF = 0; // Clear the Interrupt Flag } // The OPEN function prepares an I2C operation: Resets the SSP1IF flag and enables the SSP1 module: // Функция OPEN подготавливает работу I2C: сбрасывает флаг SSP1IF и включает модуль SSP1: static void I2C1_open(void) { PIR1bits.SSP1IF = 0; // Clear IRQ SSP1CON1bits.SSPEN = 1; // I2C Master Open } // The CLOSE function disables the SSP1 module // Функция CLOSE отключает модуль SSP1 static void I2C1_close(void) { SSP1CON1bits.SSPEN = 0; // Disable I2C1 } // The START function sends the Start bit by setting the SEN bit and waits for the SSP1IF flag to be triggered // Функция START отправляет бит Start, устанавливая бит SEN, и ожидает срабатывания флага SSP1IF static void I2C1_start(void) { SSP1CON2bits.SEN = 1; // Start Condition I2C1_interruptFlagPolling(); } // The STOP function sends the Stop bit and waits for the SSP1IF flag to be triggered // Функция STOP отправляет стоп-бит и ожидает срабатывания флага SSP1IF static void I2C1_stop(void) { SSP1CON2bits.PEN = 1; // Stop Condition I2C1_interruptFlagPolling(); } // The SEND DATA function loads in SSP1BUF the argument value and waits for the SSP1IF flag to be triggered: // Функция SEND DATA загружает в SSP1BUF значение аргумента и ожидает срабатывания флага SSP1IF: static void I2C1_sendData(unsigned char byte) { SSP1BUF = byte; I2C1_interruptFlagPolling(); } // The GET_ACKSTAT_BIT function returns the ACKSTAT bit from the SSP1CON2 register: // Функция GET_ACKSTAT_BIT возвращает бит ACKSTAT из регистра SSP1CON2: static unsigned char I2C1_getAckstatBit(void) { return SSP1CON2bits.ACKSTAT; // Return ACKSTAT bit } static void I2C1_write1ByteRegister(unsigned char address, unsigned char reg, unsigned char data) { /* Shift the 7-bit address and add a 0 bit to indicate a write operation */ //signed char writeAddress = (address << 1) & ~I2C_RW_BIT; signed char writeAddress = address; I2C1_open(); I2C1_start(); I2C1_sendData(writeAddress); if (I2C1_getAckstatBit()) { return ; } I2C1_sendData(reg); if (I2C1_getAckstatBit()) { return ; } I2C1_sendData(data); if (I2C1_getAckstatBit()) { return ; } I2C1_stop(); I2C1_close(); } При использовании данных функций вернулся к примерно тому что было в первом сообщении - периодически линия SCL опускается, и поднимается не на следующий период обмена (вызов ф-ии I2C1_write1ByteRegister()), а через несколько периодов: (желтый - SCL, синий - SDA) Нормальный обмен Сбой в конце первого байта Период сбоя Еще не понятна строка кода, я ее закомментировал. Зачем сдвигать адрес? signed char writeAddress = (address << 1) & ~I2C_RW_BIT;
×
×
  • Create New...