Перенос на Win

Тема в разделе "WASM.SOFTWARE", создана пользователем Andrei, 10 июн 2018.

  1. Andrei

    Andrei Member

    Публикаций:
    0
    Регистрация:
    13 апр 2018
    Сообщения:
    322
  2. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    Смотри в ЛС.
     
  3. Andrei

    Andrei Member

    Публикаций:
    0
    Регистрация:
    13 апр 2018
    Сообщения:
    322
    Диск забрал, сеньк гранд ...
     
  4. Andrei

    Andrei Member

    Публикаций:
    0
    Регистрация:
    13 апр 2018
    Сообщения:
    322
    Подскажите, вот код, в нем есть ф-ция void ADC_Handler (void)
    Эта ф-ция нигде не вызывается, а программа работает откуда идет вызов это ф-ции ?
    Код (C++):
    1.  
    2. void setup()
    3. {
    4.   Serial.begin (57600) ; // was for debugging
    5.   adc_setup () ;         // setup ADC
    6.   pmc_enable_periph_clk (TC_INTERFACE_ID + 0*3+0) ;  // clock the TC0 channel 0
    7.   TcChannel * t = &(TC0->TC_CHANNEL)[0] ;    // pointer to TC0 registers for its channel 0
    8.   t->TC_CCR = TC_CCR_CLKDIS ;  // disable internal clocking while setup regs
    9.   t->TC_IDR = 0xFFFFFFFF ;     // disable interrupts
    10.   t->TC_SR ;                   // read int status reg to clear pending
    11.   t->TC_CMR = TC_CMR_TCCLKS_TIMER_CLOCK1 |   // use TCLK1 (prescale by 2, = 42MHz)
    12.               TC_CMR_WAVE |                  // waveform mode
    13.               TC_CMR_WAVSEL_UP_RC |          // count-up PWM using RC as threshold
    14.               TC_CMR_EEVT_XC0 |     // Set external events from XC0 (this setup TIOB as output)
    15.               TC_CMR_ACPA_CLEAR | TC_CMR_ACPC_CLEAR |
    16.               TC_CMR_BCPB_CLEAR | TC_CMR_BCPC_CLEAR ;
    17.   t->TC_RC =  875 ;     // counter resets on RC, so sets period in terms of 42MHz clock
    18.   t->TC_RA =  440 ;     // roughly square wave
    19.   t->TC_CMR = (t->TC_CMR & 0xFFF0FFFF) | TC_CMR_ACPA_CLEAR | TC_CMR_ACPC_SET ;  // set clear and set from RA and RC compares
    20.   t->TC_CCR = TC_CCR_CLKEN | TC_CCR_SWTRG ;  // re-enable local clocking and switch to hardware trigger source.
    21.   setup_pio_TIOA0 () ;  // drive Arduino pin 2 at 48kHz to bring clock out
    22.   dac_setup () ;        // setup up DAC auto-triggered at 48kHz
    23.   REG_PIOC_OER = 0x1 <<22; //Порт С 22 пин на выход
    24.   REG_PIOB_OER = 0x1 <<27; //Порт B 27 пин на выход
    25. }
    26. void setup_pio_TIOA0 ()  // Configure Ard pin 2 as output from TC0 channel A (copy of trigger event)
    27. {
    28.   PIOB->PIO_PDR = PIO_PB25B_TIOA0 ;  // disable PIO control
    29.   PIOB->PIO_IDR = PIO_PB25B_TIOA0 ;   // disable PIO interrupts
    30.   PIOB->PIO_ABSR |= PIO_PB25B_TIOA0 ;  // switch to B peripheral
    31. }
    32. void dac_setup ()
    33. {
    34.   pmc_enable_periph_clk (DACC_INTERFACE_ID) ; // start clocking DAC
    35.   DACC->DACC_CR = DACC_CR_SWRST ;  // reset DAC
    36.   DACC->DACC_MR =
    37.     DACC_MR_TRGEN_EN | DACC_MR_TRGSEL (1) |  // trigger 1 = TIO output of TC0
    38.     (1 << DACC_MR_USER_SEL_Pos) |  // select channel 0
    39.     DACC_MR_REFRESH (0x0F) |       // bit of a guess... I'm assuming refresh not needed at 48kHz
    40.     (24 << DACC_MR_STARTUP_Pos) ;  // 24 = 1536 cycles which I think is in range 23..45us since DAC clock = 42MHz
    41.   DACC->DACC_IDR = 0xFFFFFFFF ; // no interrupts
    42.   DACC->DACC_CHER = DACC_CHER_CH0 << 1 ; // enable chan0
    43. }
    44. void dac_write (int val)
    45. {
    46.   DACC->DACC_CDR = val & 0xFFF ;
    47. }
    48. void adc_setup ()
    49. {
    50.   NVIC_EnableIRQ (ADC_IRQn) ;   // enable ADC interrupt vector
    51.   ADC->ADC_IDR = 0xFFFFFFFF ;   // disable interrupts
    52.   ADC->ADC_IER = 0x80 ;         // enable AD7 End-Of-Conv interrupt (Arduino pin A0)
    53.   ADC->ADC_CHDR = 0xFFFF ;      // disable all channels
    54.   ADC->ADC_CHER = 0x80 ;        // enable just A0
    55.   ADC->ADC_CGR = 0x15555555 ;   // All gains set to x1
    56.   ADC->ADC_COR = 0x00000000 ;   // All offsets off
    57.   ADC->ADC_MR = (ADC->ADC_MR & 0xFFFFFFF0) | (1 << 1) | ADC_MR_TRGEN ;  // 1 = trig source TIO from TC0
    58. }
    59. // Circular buffer, power of two.
    60. #define BUFSIZE 0x400
    61. #define BUFMASK 0x3FF
    62. volatile int samples [BUFSIZE] ;
    63. volatile int sptr = 0 ;
    64. volatile int isr_count = 0 ;   // this was for debugging
    65. #ifdef __cplusplus
    66. extern "C"
    67. {
    68. #endif
    69. void ADC_Handler (void)
    70. {
    71.   if (ADC->ADC_ISR & ADC_ISR_EOC7)   // ensure there was an End-of-Conversion and we read the ISR reg
    72.   {
    73.     int val = *(ADC->ADC_CDR+7) ;    // get conversion result
    74.     samples [sptr] = val ;           // stick in circular buffer
    75.     sptr = (sptr+1) & BUFMASK ;      // move pointer
    76.     dac_write (0xFFF & ~val) ;       // copy inverted to DAC output FIFO
    77.   }
    78.   isr_count ++ ;
    79. }
    80. #ifdef __cplusplus
    81. }
    82. #endif
    83. void loop()
    84. {
    85.            REG_PIOC_SODR = 0x1 << 22; //c22 = 8 pin
    86.            REG_PIOB_CODR = 0x1 << 27; //b27=13 pin
    87.            delay(1000);
    88.            REG_PIOC_CODR = 0x1 << 22; //c22=8 pin
    89.            REG_PIOB_SODR = 0x1 << 27; //b27 = 13 pin
    90.            delay(1000);
    91. }
    92.  
     
  5. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
    вот тут включается
     
  6. Andrei

    Andrei Member

    Публикаций:
    0
    Регистрация:
    13 апр 2018
    Сообщения:
    322
    Так ж да разрешаем прерывания, по ADC, но откуда компилятор узнал что по прерыванию нужно выполнить ADC_Handler ?
     
  7. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
    Andrei, оно объявлено в сорцах атмел-а
    Код (C):
    1. void ADC_Handler        ( void ) __attribute__ ((weak, alias("Dummy_Handler")));
    Объявляя у себя этот хэндлер - вы просто перегружаете объявление.
     
  8. Andrei

    Andrei Member

    Публикаций:
    0
    Регистрация:
    13 апр 2018
    Сообщения:
    322
    Не понимаю, а если я функцию назову (void )ADC_INT (void)
    То тоже работать будет ? Или еще где то её прописать нужно ?
    Щас проверим ...
    Не не работает, нужно писать именно ADC_Handler, не понимаю
     
    Последнее редактирование: 27 июн 2018
  9. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    Это магия, происходящая на этапе линковки.
     
  10. Andrei

    Andrei Member

    Публикаций:
    0
    Регистрация:
    13 апр 2018
    Сообщения:
    322
    Не понимаю я этого, никак (
    Пробовал назвать ADC_INT компилится но не работает,,,
    Где то то ведь указан именно Handler
     
    Последнее редактирование: 27 июн 2018
  11. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
    если вы хотите так назвать обработчик - то работать не будет. Но вы же можете внутри ADC_Handler вызвать свою функцию если вам так принципиально.
    Обработчик захардкорен с названием ADC_Handler.
    Если ее нет - то используется заглушка по дефолту которую я приводил ранее, там пустая процедура.
    Вы же понимаете что вам для удобства сделали та - объявляете функцию и все. Вам не надо заморачиваться с очень многими вещами.
     
  12. Andrei

    Andrei Member

    Публикаций:
    0
    Регистрация:
    13 апр 2018
    Сообщения:
    322
    Вот терь понял, что это название вектора прерывания зашито в среде разработки, ...
     
    Последнее редактирование: 27 июн 2018
  13. Andrei

    Andrei Member

    Публикаций:
    0
    Регистрация:
    13 апр 2018
    Сообщения:
    322
    Шестая строка
    Код (C++):
    1.  pmc_enable_periph_clk (TC_INTERFACE_ID + 0*3+0)
    0*3+0 ???? для чего это ? Для наглядности ? ведь это все равно равно 0
     
  14. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.077
    Товарищ, Надеюсь, ты победил :) + по идее, сетевуху усбишную можно взять.