

sidy
Свой-
Posts
351 -
Joined
-
Last visited
-
MPLAB IDE v8.92 разное поведение в Win7 и Win10
sidy posted a topic in В помощь начинающему
Добрый день! Есть MPLAB v8.92 и программа, написанная на ассемблере для PIC. Так вот, когда прошиваешь контроллер с помощью ПК на котором установлена Win7 64bit все нормально - программа работает как и задумано. Но когда прошиваешь контроллер на ПК, на котором установлена Win10 64bit, возникает проблема - вместо констант, которые записываются в EEPROM "по умолчанию" записываются совершенно другие значения. Контроллер pic18f452. В чем может быть дело? -
Мат выкладки формирования ШИМ для усилителя класса Д и не только
sidy replied to Zx80's topic in Математика и Физика
Это что за книга? -
Вопрос по защите входных цепей RS485
sidy replied to sidy's topic in В помощь начинающему
А если эти резисторы установить большей величины, например 100...200 Ом? -
Вопрос по защите входных цепей RS485
sidy replied to sidy's topic in В помощь начинающему
Понятно. А какой номинал должен быть у этих резисторов? -
Вопрос по защите входных цепей RS485
sidy posted a topic in В помощь начинающему
Добрый день! Возник вопрос по схеме защиты входных цепей приемо-передатчика RS485: На схеме есть резисторы R32, R31 - какова их функция? (Поискал в интернете подобные схемы попадались без этих резисторов) И какой должен быть их номинал? -
PIC18 сбои при работе I2C
sidy replied to sidy's topic in В помощь начинающему
Я не мог подумать, что в микросхеме "с завода" может быть включен WDT. -
PIC18 сбои при работе I2C
sidy replied to sidy's topic in В помощь начинающему
Выключил WDT. Сигнал RST исчез. Обмен работает исправно. k155la3 выражаю Вам благодарность! Спасибо. Очень помогли. -
PIC18 сбои при работе I2C
sidy replied to sidy's topic in В помощь начинающему
Я прочитал регистр 0х0А - Watchdog Control - значение 0х9E или 0b1001 1110 - т.е. получается, что WDT включен Прочитал еще регистр 0х0B - Companion Control - там все нули. И еще дополню. Процессы в программе не причем - я проверил это путем удерживание МК в состоянии сброс. А на выходе ~RST микросхемы все равно продолжает с той же периодичностью появляться сигнал. -
PIC18 сбои при работе I2C
sidy replied to sidy's topic in В помощь начинающему
Проверил линию питания и сигнал ~RST: Питание стабильно. (Значит получается, что LVD не причем?) Да период получается всегда около ~5 сек. С началом обмена по i2c сброс не связан (верхний луч ~RST нижний SCL): Остается еще проверить WDT - но по описанию у него максимальный период 3 сек. -
PIC18 сбои при работе I2C
sidy replied to sidy's topic in В помощь начинающему
Да, действительно - PFI переподключил на землю. (Не помогло) R6, R7 1 кОм Питание PIC18 тоже +5 В. Он не виснет намертво - следующий запрос может пройти нормально. Раз 10 за минуту происходит такой затык. Длина линий небольшая. Вот что на выходе RST (написано, что если не используется оставьте не подключенным) Какой второй блокировочный конденсатор? По питанию батареи? -
PIC18 сбои при работе I2C
sidy replied to sidy's topic in В помощь начинающему
Вот схема включения Батарея подключена. Кварц стабилен. -
PIC18 сбои при работе I2C
sidy replied to sidy's topic in В помощь начинающему
Стало понятно почему так происходит. Есть функция проверки подтверждение 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 условие? -
PIC18 сбои при работе I2C
sidy replied to sidy's topic in В помощь начинающему
Понятно. Спасибо. -
PIC18 сбои при работе I2C
sidy replied to sidy's topic in В помощь начинающему
Чтобы обратиться к часам я должен передать адрес 0xD0. Если я сдвину этот адрес на 1 влево, то получу 0хА0. И микросхема не воспримет этот адрес как верный. -
PIC18 сбои при работе I2C
sidy replied to sidy's topic in В помощь начинающему
Попробовал использовать данный пример: // 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;