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

StasRadeon

Members
  • Постов

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

  • Посещение

Информация

  • Пол
    Мужчина
  • Город
    Moldova

Электроника

  • Стаж в электронике
    Менее года
  • Сфера радиоэлектроники
    микроконтроллеры

Посетители профиля

1 528 просмотров профиля

Достижения StasRadeon

Стажер

Стажер (3/14)

  • 10 постов на форуме
  • Неделя на форуме
  • Месяц на форуме
  • Год на форуме

Последние значки

-1

Репутация

  1. Заработол. Но когда поставил на реальный микроконтроллер не работает. В Протеус работает Поставил мой код и как подключил hardware . Может чтото не конфигурировал правильно. proteus.rar
  2. там и код на чем там сейчас работаю i2c_debug.rar
  3. когда комментировал: while(I2C1STATbits.ACKSTAT); тогда работает, отправляет , но неправильно. присоединяю что я вижу в PROTEUS Весь код и Proteus Simulation в посте в первый пост I2C_debuger.rar
  4. StasRadeon

    Модуль I2C в dsPIC33F

    Здраствуйте, появилось такая проблема. захотел запустить программа I2C из даташит. и когда запустил в Протеус , вижу что ждёт здесь : -> while(I2C1STATbits.ACKSTAT); Можете сказать пожалуйста где ошибся я. отправляет только MasterWriteI2C1(0xE) и потом ждёт Код : #include <p33FJ32GP204.h> #include<i2c.h> #include "libpic30.h" _FOSCSEL(0x02); _FWDT(FWDTEN_OFF); _FOSC(0xE2); #define OSC 8000000UL // тактовая частота главного генератора (задаётся вручную) #define FCY OSC/2 // значение для расчёта скорости обмена Ш2С void DelayMs(unsigned int Ms) { int delay_cnst; while(Ms>0) { Ms--; for(delay_cnst = 0; delay_cnst <220; delay_cnst++); } } int main(void) { unsigned int config2, config1; unsigned char *wrptr; unsigned char tx_data[] = {'M','I','C','R','O','C','H','I','P','\0'}; wrptr = tx_data; unsigned int brg = ((FCY)/400000 - ((FCY)/10000000UL))-1; // данная формула из даташита config2 = brg; config1 = (I2C1_ON & I2C1_IDLE_CON & I2C1_CLK_HLD & I2C1_IPMI_DIS & I2C1_7BIT_ADD & I2C1_SLW_DIS & I2C1_SM_DIS & I2C1_GCALL_DIS & I2C1_STR_DIS & I2C1_NACK & I2C1_ACK_DIS & I2C1_RCV_DIS & I2C1_STOP_DIS & I2C1_RESTART_DIS & I2C1_START_DIS); StopI2C1(); CloseI2C1(); OpenI2C1(config1,config2); DelayMs(100); IdleI2C1(); StartI2C1(); /* Wait till Start sequence is completed */ while(I2C1CONbits.SEN); /* Clear interrupt flag */ IFS1bits.MI2C1IF = 0; /* Write Slave address and set master for transmission */ MasterWriteI2C1(0xE); /* Wait till address is transmitted */ while(I2C1STATbits.TBF); // 8 clock cycles while(!IFS1bits.MI2C1IF); // Wait for 9th clock cycle IFS1bits.MI2C1IF = 0; // Clear interrupt flag while(I2C1STATbits.ACKSTAT); /* Transmit string of data */ MasterputsI2C1(wrptr); StopI2C1(); /* Wait till stop sequence is completed */ while(I2C1CONbits.PEN); CloseI2C1(); return 0; } I2C.rar
  5. огромное спасибо! , заработало как надо
  6. FRC + PLL -> 80 MHZ CLKDIVbits.PLLPRE = 0; PLLFBDbits.PLLDIV = 43 - 2; CLKDIVbits.PLLPOST = 0; FOSC = 80 MHz FCY = FOSC / 2 = ~40 MHz (39.61375 MIPS) Tcy (the instruction cycle) = 1/40 MHz = 25ns Tad > 117.6ns ; Tad = Tcy /(ADCS + 1) = (1/40MHz) * 5 = ~125ns; правильно ?
  7. Да, правильно там 63 + 1 ; Tad=Tcy*(adcs+1)=(1/40Mhz)*64=1.6us Tc = 14 * 1.6 = 22.4 us про AD1CON3bits.ADRC = 1; написано -> 1 = ADC internal RC clock все же , я чего то не делаю правильно
  8. здравствуйте , у меня такая проблема : настроел ацп , чтобы время конверсией ацп было 22.4 us. настроил чтоба конверсия не было автоматической , а сделал функцию unsigned int read_adc_value(void) { AD1CON1bits.SAMP = 1; // start //while(!AD1CON1bits.SAMP); __delay_us(10); AD1CON1bits.SAMP = 0; // stop while(!AD1CON1bits.DONE); return ADCBUF0; } Когда в MPLAB X ставлю breakpoint показывает мне время конверсией около 5 ms . Пожалуйста, может кто то посмотреть и подскажет где я не делаю правильно . Мой расчеты : =====PLL -> 80 MHz==================== CLKDIVbits.PLLPRE = 0; PLLFBDbits.PLLDIV = 43 - 2; CLKDIVbits.PLLPOST = 0; // 43 x: 79.2275 MHz = 39.61375 MIPS ==================================== ========ADC -> 22us ================= Tad=Tcy*(adcs+1)=(1/40)*4 = 1.6us Tc = 14 * 1.6 = 22.4 us ==================================== Работаю на то чтобы взять 8000 - 10000 значения от ацп в секунду , и потом все значения переслать в ПК. Если есть другие идеи как можно взяты эти 8000 - 10000 значения по быстрее , пожалуста скажите и мне. Microcontroller : DSPIC33fj128MC802 ADC_DSPIC33.X.rar
  9. Спасибо огромное всем , отпишусь когда будет проект готовый.
  10. void InitUART1() { U1MODEbits.UARTEN = 0; U1STAbits.UTXEN = 0; U1MODEbits.ABAUD = 0; U1MODEbits.BRGH = 0; //High Speed mode U1MODEbits.PDSEL = 0; // Fara paritate U1MODEbits.STSEL = 0; // 1 bit de Stop/ // U1BRG = (Fcy / (16 * BaudRate)) - 1 // U1BRG = (36850000 / (16 * 256000)) - 1 // U1BRG = 10 U1BRG = 10;//256.000//239; U1MODEbits.UARTEN = 1; //Activam UART U1STAbits.UTXEN = 1; //Activam Transmisia _delay__us(30); // 1/256000 //DELAY_105uS это последние модификацие в коде, но тоже не очень быстро ;
  11. через два-три часа отпишусь, буду дома чтоба тестировать . спасибо большое
  12. но когда я смотрел в Device Manager в ПК , порт больше чем 128.000 не принимает. А как сделать так что побоище. Допустить поставим 256000, -> 0.64 seconds; Тоже мало
  13. bits_per_character -> 8 data bits + 1 start bit + 1 stop bit bytes x bits_per_character / bits_per_second 16000 x 10 / 128000 = 1.25 seconds. 16 x 1024 x 10 / 128000 = 1.28 seconds. правильное мышление ?
  14. Moldova Хорошо, и как мне повысить на 16 килобайт/сек ? Проблема в УАРТ как видно. Дайте маленький пример, пожалуйста
  15. Это значит что если я отправлю 3 символа ( потому что работаю ацп на 10 битов и я отправляю [0-256 максимум ] аdc value ( но не сложно и 1024 ) ) то будет нужно в 3 раза быстрее, правильно понел ? То значит нужно будет UART -> 256.000 ? и значит что Freq , не должен быть 40 Мнz , а 80 Mhz Правильно ? и видно что мне нужно использовать и Direct Memory Acces (DMA)
×
×
  • Создать...