Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Продукция MICROCHIP

Продукция MICROCHIP Технические вопросы по всей продукции Microchip

Ответ
 
Опции темы Опции просмотра
Старый 07.07.2018, 00:35   #1
Gera82
Senior Member
 
Аватар для Gera82
 
Регистрация: 13.08.2009
Адрес: Frankfurt / Новосибирск
Возраст: 36
Сообщений: 532
Вес репутации: 349/41
Gera82 is a jewel in the roughGera82 is a jewel in the roughGera82 is a jewel in the roughGera82 is a jewel in the rough
По умолчанию PIC32MK и PIC32MZ -> UART и DMA = проблемы

Всем Привет.

Есть две проблемы, которые я не могу решить, нужные идее специалистов.

Есть два камня на плате:
1. PIC32MK1024MCF100, работает как "Slave"
2. PIC32MZ2048EFH144, работает как "Мастер"
оба они связаны двумя UARTами:
1.UART работает без DMA, и с ним проблем нету, он для команд.
2.UART он работает при помощи DMA, он для потока данных, и с ним проблемы:


1. на ПИК32МК виснет вся система, как только включаю DMA который привязан к UART2 TXREG.
Программа может проработать и до 5 минут, но потом отрубается и я не знаю что происходит, прикол в том что как я начинаю отлаживать (с помощью ICD3), то все вроде бы работает без проблем
Как мне проверить? я специально для проверки состояния, в программе дергаю везде "ножками", и в прерываниях тоже, как только программа виснет, останавливаются так же все ножки (их там 7), и не дергаются больше.


PIC32MK:
Код:
char tx_buff[256];


 ...

// DMA1 UART2 TX - This is the DMA setup for the trasmiter    
    DCH1ECON=0;                    // no start or stop IRQs, no pattern match
 //   DCH1CONbits.CHPRI = 3;
////    DCH1ECONbits.PATEN = 0;         // 0 = Pattern match is disabled
 //   DCH1CONbits.CHPATLEN = 1;       // Two bytes of pattern
////    DCH1DATbits.CHPDAT = '\n';      // Pattern definition to finish transfer
    DCH1ECONbits.CHSIRQ = _UART2_TX_VECTOR;       // IRQ vector for "UART1 Transfer Done"
                                    // ===> U1TXREG empty and new Cell of 8 bytes
                                    // Could be transfered 
                                // See table 8-3 p 123 in PIC32MK documentation
    DCH1ECONbits.SIRQEN = 1;    // DMA's interruption enable   
//    DCH1CONbits.CHAEN = 1;
//    DCH1CONbits.CHCHN = 1;
//    DCH1CONbits.CHPIGNEN = 0;     // Enable Pattern Ignore Byte bit, 0 = Disable this feature
    
    DCH1SSA = VirtToPhys(tx_buff);
    DCH1DSA = VirtToPhys(&U2TXREG);
    DCH1SSIZ = 16;              // source size at most x bytes                   
    DCH1DSIZ = 1;               // dst size is 1 byte  
    DCH1CSIZ = 1;               // PIC32MK has 8 bytes Transmitter FIFO                                              
    DCH1INT = 0;                // alle Interupt ausschalten
    // Interrupt setup
    IPC18bits.DMA1IP = 5;
    IPC18bits.DMA1IS = 2;
    IFS2bits.DMA1IF = 0;  
    IEC2bits.DMA1IE = 0;        // Interrupt disable
    DCH1CONbits.CHEN = 1;       // Enable channel 
    
    DMACONbits.ON = 1;
...




 // UART2 Für Master-Slave Databus ------------------------------------
     U2MODEbits.USIDL = 0;                /* Continue in Idle mode */
     U2MODEbits.LPBACK = 0;                /* Disable LoopBack */
    U2MODEbits.PDSEL = 0b00;            /* 8-bit data, no parity */
    U2MODEbits.STSEL = 0;                /* One Stop bit */
    
    U2MODEbits.BRGH = 1;                /* 1 = High-Speed mode – 4x baud clock enabled*/

    U2BRG = BRGVAL_DATARBUS;            //10Mbit
    
    IFS1bits.U2TXIF = 0;                /* Clear interrupt flag */
    IPC14bits.U2TXIP = 2;                // 2 (bei 7 geht DISI nicht) is High priority, 0 is Low priority
    IEC1bits.U2TXIE = 0;                /* Enable receive interrupts */

    IFS1bits.U2RXIF = 0;                /* Clear interrupt flag */
    IPC14bits.U2RXIP = 2;                // 2 (bei 7 geht DISI nicht) is High priority, 0 is Low priority
    IEC1bits.U2RXIE = 0;                /* Enable receive interrupts */

    U2STAbits.UTXEN = 1;                /* 1 = UARTx transmitter is enabled. UxTX pin is controlled by UARTx (if ON = 1*/
    U2STAbits.URXEN = 1;                /* 1 = UARTx receiver is enabled. UxRX pin is controlled by UARTx (if ON = 1) */
    U2STAbits.UTXISEL = 0b10;           /* 10 =Interrupt is generated and asserted while the transmit buffer is empty*/
    
    U2MODEbits.ON = 1;                   /* Enable UART module 1 */
DMA запускается по таймеру 6, сейчас отключил, как включаю, может проработать до 5 минут, все данные видно осциллографом:
Код:
/********************************************************************************
* 1 ms Timer Interrupt, fuer Aufbereitung der Daten und Transfer der Daten über 
* UART2 TX und DMA1
* PBCLK2 = TMR_CLK: 60000000 Mhz / 1000000µs * 1000µs = 60000 (0xEA60)
*********************************************************************************/
void __attribute__((vector(_TIMER_6_VECTOR), interrupt(IPL6AUTO), nomips16))  _T6Interrupt(void)
{
  IFS2bits.T6IF = 0; //Clear Timer6 interrupt flag

  memcpy(&tx_buff, &daten_paket, sizeof(daten_paket));   //Kopiere Struct Daten in buffer_array
  
//  DCH1CONbits.CHEN = 1;       // Enable channel 
//  DCH1ECONbits.CFORCE = 1;    // set CFORCE to 1 to start Transmitter
  
  _2_1_OUT_OC_24V ^= 1;       // Pin toggeln
 }
2. Проблема, я не могу принят эти данные которые шлет мне PIC32MK "Slave". PIC32MZ "Master" и я пытаюсь также с помощью DMA принять тот же самый пакет, который шлет мне PIC32MK.


Данные поступают на ножку, это я вижу осциллографом, но дальше не вижу.




Вот настройка PIC32MZ, где не работает вообще прием данный по УАРТ + ДМА:
Код:
volatile char rx_buff[256];

...

// UART2 Für Master-Slave Databus ------------------------------------
     U2MODEbits.USIDL = 0;                /* Continue in Idle mode */
     U2MODEbits.LPBACK = 0;                /* Disable LoopBack */
    U2MODEbits.PDSEL = 0b00;            /* 8-bit data, no parity */
    U2MODEbits.STSEL = 0;                /* One Stop bit */
    
    U2MODEbits.BRGH = 1;                /* 1 = High-Speed mode – 4x baud clock enabled*/

    U2BRG = BRGVAL_DATARBUS;            //10Mbit
    
    IFS4bits.U2TXIF = 0;                /* Clear interrupt flag */
    IPC36bits.U2TXIP = 2;                // 2 (bei 7 geht DISI nicht) is High priority, 0 is Low priority
    IEC4bits.U2TXIE = 0;                /* Enable receive interrupts */

    IFS4bits.U2RXIF = 0;                /* Clear interrupt flag */
    IPC36bits.U2RXIP = 2;                // 2 (bei 7 geht DISI nicht) is High priority, 0 is Low priority
    IEC4bits.U2RXIE = 0;                /* Enable receive interrupts */

    U2STAbits.UTXEN = 1;                /* 1 = UARTx transmitter is enabled. UxTX pin is controlled by UARTx (if ON = 1*/
    U2STAbits.URXEN = 1;                /* 1 = UARTx receiver is enabled. UxRX pin is controlled by UARTx (if ON = 1) */
    U2STAbits.URXISEL = 0b10;           /* 10 =Interrupt is generated and asserted while the transmit buffer is empty*/
    
    U2MODEbits.ON = 1;                   /* Enable UART module 1 */ 



...


// DMA0 UART2 RX - This is the DMA setup for the receiver    
    IEC4bits.DMA0IE = 0;            // Interrupt disable
    IFS4bits.DMA0IF = 0;            // Interrupt flag CLR
    DCH0CONbits.CHPRI = 3;          // Channel priority
    DCH0ECON = 0;
    
    DCH0ECONbits.CHSIRQ = _UART2_RX_VECTOR;        // IRQ vector for "UART2 Receiver Done"
    DCH0ECONbits.SIRQEN = 1;    // DMA's interruption enable 
    DCH0CONbits.CHAEN = 1;
    DCH0CONbits.CHCHN = 1;
    
    DCH0SSA = VirtToPhys(&U2RXREG);              // Source address
    DCH0DSA = VirtToPhys(rx_buff);     // Destination 
    DCH0SSIZ = 1;                        
    DCH0DSIZ = 16;
    DCH0CSIZ = 1;                                                                     
    DCH0INTbits.CHBCIE = 1;     // Interrupt on block transfer complete
  //  DCH0INTbits.CHERIE = 1;     // Interrupt on errors
    // Interrupt setup
    IPC33bits.DMA0IP = 3;       // Priority
    IPC33bits.DMA0IS = 2;       // Sub priority
    IFS4bits.DMA0IF = 0;        // Interrupt flag CLR
    IEC4bits.DMA0IE = 1;        // Interrupt enable
    DCH0CONbits.CHEN = 1;       // Enable channel
    
     DMACONbits.ON = 1;


...


/********************************************************************************
* DMA0 Interrupt für UART2 RX, Daten von Slave
*********************************************************************************/
void __attribute__((vector(_DMA0_VECTOR), interrupt(IPL3AUTO), nomips16))  _DMA0Interrupt(void) //_DMA0_VECTOR = 72
{

    DCH0INT=0x000000ff;           // clear DMA's channel interrupt flags, CHSDIF, CHSHIF, CHDDIF, CHDHIF, CHBCIF, CHCCIF, CHTAIF, CHERIF
    IFS4bits.DMA0IF = AUS;        // clear interruption flag         
    
    memcpy(&daten_paket, &rx_buff, sizeof(daten_paket)); //Kopiere buffer_array in Struct Daten zurück 
    
}
оба УАРТа (UART1 и 2) работают прекрасно без DMA!

Последний раз редактировалось Gera82; 07.07.2018 в 00:41.
Gera82 вне форума   Ответить с цитированием
Старый 07.07.2018, 17:08   #2
Gera82
Senior Member
 
Аватар для Gera82
 
Регистрация: 13.08.2009
Адрес: Frankfurt / Новосибирск
Возраст: 36
Сообщений: 532
Вес репутации: 349/41
Gera82 is a jewel in the roughGera82 is a jewel in the roughGera82 is a jewel in the roughGera82 is a jewel in the rough
По умолчанию Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы

Цитата:
Сообщение от Gera82 Посмотреть сообщение
1. на ПИК32МК виснет вся система, как только включаю DMA который привязан к UART2 TXREG.
Программа может проработать и до 5 минут, но потом отрубается и я не знаю что происходит, прикол в том что как я начинаю отлаживать (с помощью ICD3), то все вроде бы работает без проблем
Как мне проверить? я специально для проверки состояния, в программе дергаю везде "ножками", и в прерываниях тоже, как только программа виснет, останавливаются так же все ножки (их там 7), и не дергаются больше.!
Информация не совсем корректна, при отладке тоже виснет.
Поток данных останавливается, и я нажимаю "Pause" чтоб посмотреть где актуально я нахожусь, но мне это не удаётся, так как проходит ошибка:
MPLAB has gotten out of synch with the ICD3. Please unplug and reconnect the ICD3 to the USB cable and try the operation again.


Кароче система полностью умирает, как только я вклучаю ДМА. Кстати другие каналы ДМА я тоже пробовал такая же херня
Gera82 вне форума   Ответить с цитированием
Старый 09.07.2018, 09:31   #3
igor_tgru
Senior Member
 
Аватар для igor_tgru
 
Регистрация: 25.02.2007
Возраст: 45
Сообщений: 681
Вес репутации: 1421/62
igor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud of
По умолчанию Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы

А обработчики исключений реализованы ?
igor_tgru на форуме   Ответить с цитированием
Старый 09.07.2018, 12:52   #4
Gera82
Senior Member
 
Аватар для Gera82
 
Регистрация: 13.08.2009
Адрес: Frankfurt / Новосибирск
Возраст: 36
Сообщений: 532
Вес репутации: 349/41
Gera82 is a jewel in the roughGera82 is a jewel in the roughGera82 is a jewel in the roughGera82 is a jewel in the rough
По умолчанию Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы

Цитата:
Сообщение от igor_tgru Посмотреть сообщение
А обработчики исключений реализованы ?
не совсем понял, что имеем ввиду.


я провел много экспериментов по поводу пик32МК и УАРТ + ДМА,
вывод мой такой, он останавливается после 2000-3000 посылок, если прерывание по таймеру приходит каждые 1мсек, то пик32МК останавливаемся через 2-3 секунды, если каждые 10мсек, то через 20-30 секунд, прерывание каждые 100мсек, то примерно 200-300секунд.


я не знаю что конкретно происходит, но мне кажется останавливается SYSCLK (120МГц), ну а если он, то вся периферия.
, SYSCLK настраивал на 60МГц, тоже самая проблема:
В отладочном режиме: зависает ICD3, чтоб его перезапустить приходится вытаскивать из USB и вставлять заново.
MPLAB has gotten out of synch with the ICD3. Please unplug and reconnect the ICD3 to the USB cable and try the operation again.

в рабочем режиме (не отладочном): останавливается вся периферия, я специально для проверки состояния, в программе дергаю везде "ножками", и в прерываниях тоже, они тоже виснут. но контроллер не перезапускается сам автоматически, только через MCLR.


Я пробовал разные каналы УАРТа и ДМА, разные частоты итд, все равно виснет


как только я не запускаю ДМА, то мой ПИК32МК работает без проблем!!!




самое интересное сейчас, я перенес эту настойку УАРТ + ДМА на PIC32MZ, и это хрень работает без проблем, уже как 8 часов
вот рабочая программа на PIC32MZ:
Код:

// UART2 Für Master-Slave Databus ------------------------------------
     U2MODEbits.USIDL = 0;                /* Continue in Idle mode */
     U2MODEbits.LPBACK = 0;                /* Disable LoopBack */
    U2MODEbits.PDSEL = 0b00;            /* 8-bit data, no parity */
    U2MODEbits.STSEL = 0;                /* One Stop bit */
    
    U2MODEbits.BRGH = 1;                /* 1 = High-Speed mode – 4x baud clock enabled*/

    U2BRG = BRGVAL_DATABUS;               //10Mbit
    
    IFS4bits.U2TXIF = 0;                /* Clear interrupt flag */
    IPC36bits.U2TXIP = 2;                // 2 (bei 7 geht DISI nicht) is High priority, 0 is Low priority
    IEC4bits.U2TXIE = 0;                /* Enable receive interrupts */

    IFS4bits.U2RXIF = 0;                /* Clear interrupt flag */
    IPC36bits.U2RXIP = 2;                // 2 (bei 7 geht DISI nicht) is High priority, 0 is Low priority
    IEC4bits.U2RXIE = 0;                /* Enable receive interrupts */

    U2STAbits.UTXEN = 1;                /* 1 = UARTx transmitter is enabled. UxTX pin is controlled by UARTx (if ON = 1*/
    U2STAbits.URXEN = 1;                /* 1 = UARTx receiver is enabled. UxRX pin is controlled by UARTx (if ON = 1) */
    U2STAbits.URXISEL = 0b10;           /* 10 =Interrupt is generated and asserted while the transmit buffer is empty*/
    U2STAbits.UTXISEL = 0b10;           /* 10 =Interrupt is generated and asserted while the transmit buffer is empty*/
    
    
    U2MODEbits.ON = 1;                   /* Enable UART module 1 */ 



 
// DMA1 UART2 TX - This is the DMA setup for the trasmiter    
    DCH1ECON=0;                    // no start or stop IRQs, no pattern match
    DCH1CONbits.CHPRI = 3;
    DCH1ECONbits.CHSIRQ = _UART2_TX_VECTOR;       // IRQ vector for "UART1 Transfer Done"
                                    // ===> U1TXREG empty and new Cell of 8 bytes
                                    // Could be transfered 
                                // See table 8-3 p 123 in PIC32MK documentation
    DCH1ECONbits.SIRQEN = 1;    // DMA's interruption enable   
    DCH1CONbits.CHAEN = 0;
//    DCH1CONbits.CHCHN = 1;
//    DCH1CONbits.CHPIGNEN = 0;     // Enable Pattern Ignore Byte bit, 0 = Disable this feature
    
    DCH1SSA = VirtToPhys(tx_buff);
    DCH1DSA = VirtToPhys(&U2TXREG);
    DCH1SSIZ = 16;              // source size at most x bytes                   
    DCH1DSIZ = 1;               // dst size is 1 byte  
    DCH1CSIZ = 1;               // PIC32MK has 8 bytes Transmitter FIFO                                              
    DCH1INTbits.CHBCIE = 1;     // alle Interupt ausschalten
    
    
    // Interrupt setup
    IPC33bits.DMA1IP = 5;
    IPC33bits.DMA1IS = 2;
    IFS4bits.DMA1IF = 0;  
   // IEC2bits.DMA1IE = 1;        // Interrupt disable
  //  DCH1CONbits.CHEN = 1;       // Enable channel 
    
    DMACONbits.ON = 1;
    
    // Timer 7 für DMA Tx transfer, Interrupt alle 1ms    
    
       T7CONbits.TON = 0; // Stop any 16-bit Timer5 operation
       T6CONbits.TON = 0; // Stop any 16/32-bit Timer5 operation
       T6CONbits.T32 = 1; // Enable 32-bit Timer mode
       T6CONbits.TCS = 0; // Select internal instruction cycle clock
       T6CONbits.TGATE = 0; // Disable Gated Timer mode
       T6CONbits.TCKPS = 0b010; // Select 1:1 Prescaler
       TMR7 = 0x00; // Clear 32-bit Timer (msw)
       TMR6 = 0x00; // Clear 32-bit Timer (lsw)
       PR7 = 0x1; // Load 32-bit period value (msw)  Interrupt (0x1F4AA)
       PR6 = 0xF4AA; // Load 32-bit period value (lsw)
       IPC8bits.T7IP = 7; // 111 = Interrupt is priority 7 (highest priority interrupt)
       IFS1bits.T7IF = 0; // Clear Timer7 interrupt flag
       IEC1bits.T7IE = 1; // Enable Timer7 interrupt

       T6CONbits.TON = 1;  // Einschalten


...


void __attribute__((vector(_TIMER_7_VECTOR), interrupt(IPL7AUTO), nomips16))  _T7Interrupt(void)
{
   
  IFS1bits.T7IF = 0; // Clear Timer7 interrupt flag

  
  daten_paket.position++;
  
  _31_OUT_OC_24V ^= 1;       // Pin tooglen

  memcpy(&tx_buff, &daten_paket, sizeof(daten_paket));   //Kopiere Struct Daten in buffer_array
  
  if (DCH1CONbits.CHEN == 0)
  {     
  DCH1CONbits.CHEN = 1;       // Enable channel 
  DCH1ECONbits.CFORCE = 1;    // set CFORCE to 1 to start Transmitter
  }
  
}
а вот не рабочая программа на PIC32MК:
Код:

 // UART2 Für Master-Slave Databus ------------------------------------
     U2MODEbits.USIDL = 0;                /* Continue in Idle mode */
     U2MODEbits.LPBACK = 0;                /* Disable LoopBack */
    U2MODEbits.PDSEL = 0b00;            /* 8-bit data, no parity */
    U2MODEbits.STSEL = 0;                /* One Stop bit */
    
    U2MODEbits.BRGH = 1;                /* 1 = High-Speed mode – 4x baud clock enabled*/

    U2BRG = BRGVAL_DATABUS;            //10Mbit
    
    IFS1bits.U2TXIF = 0;                /* Clear interrupt flag */
    IPC14bits.U2TXIP = 3;                // 2 (bei 7 geht DISI nicht) is High priority, 0 is Low priority
    IPC14bits.U2TXIS = 2;                // sub priority, 0 is Low priority
    IEC1bits.U2TXIE = 0;                /* Enable receive interrupts */

    IFS1bits.U2RXIF = 0;                /* Clear interrupt flag */
    IPC14bits.U2RXIP = 3;                // 2 (bei 7 geht DISI nicht) is High priority, 0 is Low priority
    IPC14bits.U2RXIS = 2;                // sub priority, 0 is Low priority
    IEC1bits.U2RXIE = 0;                /* Enable receive interrupts */

    U2STAbits.UTXEN = 1;                /* 1 = UARTx transmitter is enabled. UxTX pin is controlled by UARTx (if ON = 1*/
    U2STAbits.URXEN = 1;                /* 1 = UARTx receiver is enabled. UxRX pin is controlled by UARTx (if ON = 1) */
    U2STAbits.UTXISEL = 0b10;           /* 10 =Interrupt is generated and asserted while the transmit buffer is empty*/
    
    U2MODEbits.CLKSEL = 0b00;           // 00 = PBCLKx(1), 01 = SYSCLK, 10 = FRC, 11 = REFCLK1
    
    U2MODEbits.ON = 1;                   /* Enable UART module 1 */   



 // DMA1 UART2 TX - This is the DMA setup for the trasmiter    
    DCH1ECON=0;                    // no start or stop IRQs, no pattern match
    DCH1CONbits.CHPRI = 3;
    DCH1ECONbits.CHSIRQ = _UART2_TX_VECTOR;       // IRQ vector for "UART1 Transfer Done"
                                    // ===> U1TXREG empty and new Cell of 8 bytes
                                    // Could be transfered 
                                // See table 8-3 p 123 in PIC32MK documentation
    DCH1ECONbits.SIRQEN = 1;    // DMA's interruption enable   
    DCH1CONbits.CHAEN = 0;
//    DCH1CONbits.CHCHN = 1;
//    DCH1CONbits.CHPIGNEN = 0;     // Enable Pattern Ignore Byte bit, 0 = Disable this feature
    
    DCH1SSA = VirtToPhys(tx_buff);
    DCH1DSA = VirtToPhys(&U2TXREG);
    DCH1SSIZ = 16;              // source size at most x bytes                   
    DCH1DSIZ = 1;               // dst size is 1 byte  
    DCH1CSIZ = 1;               // PIC32MK has 8 bytes Transmitter FIFO                                              
    DCH1INTbits.CHBCIE = 1;     // alle Interupt ausschalten
    
    
    // Interrupt setup
    IPC18bits.DMA1IP = 5;
    IPC18bits.DMA1IS = 2;
    IFS2bits.DMA1IF = 0;  
   // IEC2bits.DMA1IE = 1;        // Interrupt disable
  //  DCH1CONbits.CHEN = 1;       // Enable channel 
    
    DMACONbits.ON = 1;
    
    
    
// Timer 6 für DMA Tx transfer, Interrupt alle 1ms    
    T6CONbits.ON = 0;        // Stop any 32-bit Timer7 operation
    T6CONbits.T32 = 1;       // Enable 32-bit Timer mode       
    T6CONbits.TCS = 0;       // Select internal instruction cycle clock
    T6CONbits.TGATE = 0;     // Disable Gated Timer mode
    T6CONbits.TCKPS = 0b000; // Select 1:1 Prescaler
       
    TMR6 = 0x00; // Clear 32-bit Timer (msw)
    PR6 = 60000; // PBCLK2 = TMR_CLK: 60000000 Mhz / 1000000µs * 1000µs = 60000 (0xEA60)
       
    IPC19bits.T6IP = 6; // 7 (bei 7 geht DISI nicht) is High priority, 0 is Low priority
    IPC19bits.T6IS = 3; // Sub priority, 0 is Low priority
    IFS2bits.T6IF = 0; //Clear Timer7 interrupt flag
    IEC2bits.T6IE = 1; // Enable Timer7 interrupt

...


void __attribute__((vector(_TIMER_6_VECTOR), interrupt(IPL7AUTO), nomips16))  _T6Interrupt(void)
{
  _2_1_OUT_OC_24V = 1;       // Pin toggeln
   
  IFS2CLR = _IFS2_T6IF_MASK;
 // IFS2bits.T6IF = 0; //Clear Timer7 interrupt flag
  
  daten_paket.position++;

  memcpy(&tx_buff, &daten_paket, sizeof(daten_paket));   //Kopiere Struct Daten in buffer_array
  
  if (DCH1CONbits.CHEN == 0)
  {     
  DCH1CONbits.CHEN = 1;       // Enable channel 
  DCH1ECONbits.CFORCE = 1;    // set CFORCE to 1 to start Transmitter
  }
  
  _2_1_OUT_OC_24V = 0;       // Pin toggeln
 }
ключевой вопрос, что это за хюйня такая

Последний раз редактировалось Gera82; 09.07.2018 в 13:06.
Gera82 вне форума   Ответить с цитированием
Старый 09.07.2018, 13:09   #5
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 31
Сообщений: 1,747
Вес репутации: 3274/71
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы

Gera82
не совсем понял, что имеем ввиду. - exceptions. куча всего в mips решается с помощью исключений.

гуглите mips exceptions.

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

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

+errata к mk почитайте.
besogon вне форума   Ответить с цитированием
Старый 09.07.2018, 13:21   #6
Gera82
Senior Member
 
Аватар для Gera82
 
Регистрация: 13.08.2009
Адрес: Frankfurt / Новосибирск
Возраст: 36
Сообщений: 532
Вес репутации: 349/41
Gera82 is a jewel in the roughGera82 is a jewel in the roughGera82 is a jewel in the roughGera82 is a jewel in the rough
По умолчанию Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы

Цитата:
Сообщение от besogon Посмотреть сообщение
Gera82

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

+errata к mk почитайте.
Да я копирую по прерыванию сначала struct -> array, а потом сразу шлю их.

я отключал копирование, все равно виснет:
//memcpy(&tx_buff, &daten_paket, sizeof(daten_paket)); //Kopiere Struct Daten in buffer_array


errata к mk я смотрел, нечего про ДМА не стоит
Gera82 вне форума   Ответить с цитированием
Старый 09.07.2018, 13:33   #7
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 31
Сообщений: 1,747
Вес репутации: 3274/71
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы

Gera82
можете обработчик исключений вставить в проект?
в одной из соседних тем был.

чтобы в случае чего увидеть, где беда.
besogon вне форума   Ответить с цитированием
Старый 09.07.2018, 13:38   #8
Gera82
Senior Member
 
Аватар для Gera82
 
Регистрация: 13.08.2009
Адрес: Frankfurt / Новосибирск
Возраст: 36
Сообщений: 532
Вес репутации: 349/41
Gera82 is a jewel in the roughGera82 is a jewel in the roughGera82 is a jewel in the roughGera82 is a jewel in the rough
По умолчанию Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы

эт0, я правильно понимаю:
Код:
static enum {
    EXCEP_IRQ = 0,            // interrupt
    EXCEP_AdEL = 4,            // address error exception (load or ifetch)
    EXCEP_AdES,                // address error exception (store)
    EXCEP_IBE,                // bus error (ifetch)
    EXCEP_DBE,                // bus error (load/store)
    EXCEP_Sys,                // syscall
    EXCEP_Bp,                // breakpoint
    EXCEP_RI,                // reserved instruction
    EXCEP_CpU,                // coprocessor unusable
    EXCEP_Overflow,            // arithmetic overflow
    EXCEP_Trap,                // trap (possible divide by zero)
    EXCEP_IS1 = 16,            // implementation specfic 1
    EXCEP_CEU,                // CorExtend Unuseable
    EXCEP_C2E                // coprocessor 2
} _excep_code;
static unsigned int _epc_code;
static unsigned int _excep_addr;
// this function overrides the normal _weak_ generic handler
void _general_exception_handler(void)
{
    asm volatile("mfc0 %0,$13" : "=r" (_excep_code));
    asm volatile("mfc0 %0,$14" : "=r" (_excep_addr));
    _excep_code = (_excep_code & 0x0000007C) >> 2;    
    while (1) {
        // Examine _excep_code to identify the type of exception
        // Examine _excep_addr to find the address that caused the exception
    }
 }

мы туда попадаем, если в системе разные проблемы типа: bus error (load/store)
я правильно понимаю?
Gera82 вне форума   Ответить с цитированием
Старый 09.07.2018, 13:44   #9
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 31
Сообщений: 1,747
Вес репутации: 3274/71
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы

Gera82
по идее должны попадать. вообще на реализацию в xc32 надо смотреть.
besogon вне форума   Ответить с цитированием
Старый 09.07.2018, 13:44   #10
igor_tgru
Senior Member
 
Аватар для igor_tgru
 
Регистрация: 25.02.2007
Возраст: 45
Сообщений: 681
Вес репутации: 1421/62
igor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud of
По умолчанию Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы

Цитата:
Сообщение от Gera82 Посмотреть сообщение
не совсем понял, что имеем ввиду.
только то что пишем
спасибо besogon он более "развернуто" ответил, если еще более по "народному" это немаскируемые прерывания возникающие при программно-аппаратных проблемах
igor_tgru на форуме   Ответить с цитированием
Старый 09.07.2018, 13:48   #11
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 31
Сообщений: 1,747
Вес репутации: 3274/71
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы

Gera82
сделайте стресс тест и в нем гоняйте, пока у Вас не упадет.
чтобы особо не ждать, можно еще бряк воткнуть в исключении перед циклом.
Код:
#ifdef __DEBUG
__asm__("sdbbp");
#endif
besogon вне форума   Ответить с цитированием
Старый 09.07.2018, 13:48   #12
Gera82
Senior Member
 
Аватар для Gera82
 
Регистрация: 13.08.2009
Адрес: Frankfurt / Новосибирск
Возраст: 36
Сообщений: 532
Вес репутации: 349/41
Gera82 is a jewel in the roughGera82 is a jewel in the roughGera82 is a jewel in the roughGera82 is a jewel in the rough
По умолчанию Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы

Цитата:
Сообщение от besogon Посмотреть сообщение
Gera82
по идее должны попадать. вообще на реализацию в xc32 надо смотреть.
бреакпоинт я поставил, система зависла и я к сожалению туда не попадаю
Gera82 вне форума   Ответить с цитированием
Старый 09.07.2018, 13:50   #13
igor_tgru
Senior Member
 
Аватар для igor_tgru
 
Регистрация: 25.02.2007
Возраст: 45
Сообщений: 681
Вес репутации: 1421/62
igor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud of
По умолчанию Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы

Цитата:
Сообщение от Gera82 Посмотреть сообщение
мы туда попадаем, если в системе разные проблемы типа: bus error (load/store)
я правильно понимаю?
правильно , только "в супе не хватает" индикации что мы попали в исключение
igor_tgru на форуме   Ответить с цитированием
Старый 09.07.2018, 13:51   #14
Gera82
Senior Member
 
Аватар для Gera82
 
Регистрация: 13.08.2009
Адрес: Frankfurt / Новосибирск
Возраст: 36
Сообщений: 532
Вес репутации: 349/41
Gera82 is a jewel in the roughGera82 is a jewel in the roughGera82 is a jewel in the roughGera82 is a jewel in the rough
По умолчанию Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы

Цитата:
Сообщение от igor_tgru Посмотреть сообщение
только то что пишем
спасибо besogon он более "развернуто" ответил, если еще более по "народному" это немаскируемые прерывания возникающие при программно-аппаратных проблемах
теперь понял эти типо вот этого только в 16ти битниках:
Код:
/* Primary Exception Vector handlers:
These routines are used if INTCON2bits.ALTIVT = 0.
All trap service routines in this file simply ensure that device
continuously executes code within the trap service routine. Users
may modify the basic framework provided here to suit to the needs
of their application. */
//================================================================
// OSCFAIL: Oscillator Failure Trap Status bit
void __attribute__((interrupt,no_auto_psv)) _OscillatorFail(void)
{ INTCON1bits.OSCFAIL = 0; //Clear the trap flag
  error_menue_anzeigen(ERROR_TRAP_OSCILLATOR); //Fehlermeldung ausgeben;
}
//================================================================
// ADDRERR: Address Error Trap Status bit
// DS read access when DSRPAG = 0x000 will force an Address Error trap.
void __attribute__((interrupt,no_auto_psv)) _AddressError(void)
{ INTCON1bits.ADDRERR = 0; //Clear the trap flag
  error_menue_anzeigen(ERROR_TRAP_ADDRESS_ERROR); //Fehlermeldung ausgeben;
}
//================================================================
// SGHT: Software Generated Hard Trap Status bit
void __attribute__((interrupt,no_auto_psv)) _HardTrapError(void)
{ INTCON4bits.SGHT = 0; //Clear the trap flag
  error_menue_anzeigen(ERROR_TRAP_HARD); //Fehlermeldung ausgeben;
}
//================================================================
// STKERR: Stack Error Trap Status bit
void __attribute__((interrupt,no_auto_psv)) _StackError(void)
{ INTCON1bits.STKERR = 0; //Clear the trap flag
  error_menue_anzeigen(ERROR_TRAP_STACK); //Fehlermeldung ausgeben;
}
//================================================================
// MATHERR: Math Error Status bit
void __attribute__((interrupt,no_auto_psv)) _MathError(void)
{ INTCON1bits.MATHERR = 0; //Clear the trap flag
  error_menue_anzeigen(ERROR_TRAP_MATH); //Fehlermeldung ausgeben;
}
//================================================================
// DMACERR: DMAC Trap Flag bit
void __attribute__((interrupt,no_auto_psv)) _DMACError(void)
{ INTCON1bits.DMACERR = 0; //Clear the trap flag
  error_menue_anzeigen(ERROR_TRAP_DMA); //Fehlermeldung ausgeben;
}
//================================================================
// SWTRAP: Software Trap Status bit
void __attribute__((interrupt,no_auto_psv)) _SoftTrapError(void)
{ INTCON2bits.SWTRAP = 0; //Clear the trap flag
  error_menue_anzeigen(ERROR_TRAP_SOFT); //Fehlermeldung ausgeben;
}
Gera82 вне форума   Ответить с цитированием
Старый 09.07.2018, 13:54   #15
igor_tgru
Senior Member
 
Аватар для igor_tgru
 
Регистрация: 25.02.2007
Возраст: 45
Сообщений: 681
Вес репутации: 1421/62
igor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud of
По умолчанию Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы

Цитата:
Сообщение от besogon Посмотреть сообщение
чтобы особо не ждать, можно еще бряк воткнуть в исключении перед циклом.
вроде при эксепшене отладчик перестает функционировать (почему то у меня в памяти такое осталось(проверить не могу, проект с пык32 давно в архив сдан))
igor_tgru на форуме   Ответить с цитированием
Старый 09.07.2018, 14:01   #16
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 31
Сообщений: 1,747
Вес репутации: 3274/71
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы

igor_tgru
вроде при эксепшене отладчик перестает функционировать - я отлаживался segger jlink - там работает.
besogon вне форума   Ответить с цитированием
Старый 09.07.2018, 14:04   #17
Gera82
Senior Member
 
Аватар для Gera82
 
Регистрация: 13.08.2009
Адрес: Frankfurt / Новосибирск
Возраст: 36
Сообщений: 532
Вес репутации: 349/41
Gera82 is a jewel in the roughGera82 is a jewel in the roughGera82 is a jewel in the roughGera82 is a jewel in the rough
По умолчанию Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы

виснет, но не попадаю я туда. или я не правильно что то делаю?

Код:
static enum {
    EXCEP_IRQ = 0,            // interrupt
    EXCEP_AdEL = 4,            // address error exception (load or ifetch)
    EXCEP_AdES = 5,                // address error exception (store)
    EXCEP_IBE = 6,                // bus error (ifetch)
    EXCEP_DBE = 7,                // bus error (load/store)
    EXCEP_IVE_1 = 10,                // 
    EXCEP_IVE_2 = 11,                // 
//    EXCEP_Sys = ,                // syscall
//    EXCEP_Bp,                // breakpoint
//    EXCEP_RI,                // reserved instruction
//    EXCEP_CpU,                // coprocessor unusable
//    EXCEP_Overflow,            // arithmetic overflow
    EXCEP_Trap = 13,                // trap (possible divide by zero)
    EXCEP_IS1 = 16,            // implementation specfic 1
    EXCEP_WATCH = 23,                //
//    EXCEP_CEU,                // CorExtend Unuseable
//    EXCEP_C2E                // coprocessor 2
} _excep_code;
static unsigned int _epc_code;
static unsigned int _excep_addr;
// this function overrides the normal _weak_ generic handler
void _general_exception_handler(void)
{
    asm volatile("mfc0 %0,$13" : "=r" (_excep_code));
    asm volatile("mfc0 %0,$14" : "=r" (_excep_addr));
    _excep_code = (_excep_code & 0x0000007C) >> 2;    

    while (1) {
        // Examine _excep_code to identify the type of exception
        // Examine _excep_addr to find the address that caused the exception
#ifdef __DEBUG
__asm__("sdbbp");
#endif
        
    }
}
Gera82 вне форума   Ответить с цитированием
Старый 09.07.2018, 14:05   #18
igor_tgru
Senior Member
 
Аватар для igor_tgru
 
Регистрация: 25.02.2007
Возраст: 45
Сообщений: 681
Вес репутации: 1421/62
igor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud of
По умолчанию Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы

Цитата:
Сообщение от besogon Посмотреть сообщение
igor_tgru
вроде при эксепшене отладчик перестает функционировать - я отлаживался segger jlink - там работает.
нее, у меня пыккит3 был. я с ним горя хапнул
igor_tgru на форуме   Ответить с цитированием
Старый 09.07.2018, 14:07   #19
igor_tgru
Senior Member
 
Аватар для igor_tgru
 
Регистрация: 25.02.2007
Возраст: 45
Сообщений: 681
Вес репутации: 1421/62
igor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud of
По умолчанию Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы

Цитата:
Сообщение от Gera82 Посмотреть сообщение
виснет, но не попадаю я туда. или я не правильно что то делаю?
на плате светодиоды есть ? если да, то годно будет в дедлупе зажечь какую нибудь уникальную комбинацию.

для MX такое пользовал

Код:
/** TRAP-ы для нахождения искл. ситуаций ***************************/
static enum // Exception handler
{
 EXCEP_IRQ = 0,  // interrupt
 EXCEP_AdEL = 4,  // address error exception (load or ifetch)
 EXCEP_AdES,   // address error exception (store)
 EXCEP_IBE,   // bus error (ifetch)
 EXCEP_DBE,   // bus error (load/store)
 EXCEP_Sys,   // syscall
 EXCEP_Bp,   // breakpoint
 EXCEP_RI,   // reserved instruction
 EXCEP_CpU,   // coprocessor unusable
 EXCEP_Overflow,  // arithmetic overflow
 EXCEP_Trap,   // trap (possible divide by zero)
 EXCEP_IS1 = 16,  // implementation specfic 1
 EXCEP_CEU,   // CorExtend Unuseable
 EXCEP_C2E   // coprocessor 2
} _excep_code;
static unsigned int _excep_addr;
// this function overrides the normal _weak_ generic handler
void _general_exception_handler(void)
{
 asm volatile("mfc0 %0,$13" : "=r" (_excep_code));
 asm volatile("mfc0 %0,$14" : "=r" (_excep_addr));
 _excep_code = (_excep_code & 0x0000007C) >> 2;
 while(1)
 {
	 
	LED_ERROR_ON; 
  // Examine _excep_code to identify the type of exception
  // Examine _excep_addr to find the address that caused the exception
  Nop();
  Nop();
  Nop();
 }
} // End of exception handler
igor_tgru на форуме   Ответить с цитированием
Старый 09.07.2018, 14:14   #20
Gera82
Senior Member
 
Аватар для Gera82
 
Регистрация: 13.08.2009
Адрес: Frankfurt / Новосибирск
Возраст: 36
Сообщений: 532
Вес репутации: 349/41
Gera82 is a jewel in the roughGera82 is a jewel in the roughGera82 is a jewel in the roughGera82 is a jewel in the rough
По умолчанию Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы

Цитата:
Сообщение от igor_tgru Посмотреть сообщение
на плате светодиоды есть ? если да, то годно будет в дедлупе зажечь какую нибудь уникальную комбинацию.

для MX такое пользовал

Код:
/** TRAP-ы для нахождения искл. ситуаций ***************************/
static enum // Exception handler
{
 EXCEP_IRQ = 0,  // interrupt
 EXCEP_AdEL = 4,  // address error exception (load or ifetch)
 EXCEP_AdES,   // address error exception (store)
 EXCEP_IBE,   // bus error (ifetch)
 EXCEP_DBE,   // bus error (load/store)
 EXCEP_Sys,   // syscall
 EXCEP_Bp,   // breakpoint
 EXCEP_RI,   // reserved instruction
 EXCEP_CpU,   // coprocessor unusable
 EXCEP_Overflow,  // arithmetic overflow
 EXCEP_Trap,   // trap (possible divide by zero)
 EXCEP_IS1 = 16,  // implementation specfic 1
 EXCEP_CEU,   // CorExtend Unuseable
 EXCEP_C2E   // coprocessor 2
} _excep_code;
static unsigned int _excep_addr;
// this function overrides the normal _weak_ generic handler
void _general_exception_handler(void)
{
 asm volatile("mfc0 %0,$13" : "=r" (_excep_code));
 asm volatile("mfc0 %0,$14" : "=r" (_excep_addr));
 _excep_code = (_excep_code & 0x0000007C) >> 2;
 while(1)
 {
     
    LED_ERROR_ON; 
  // Examine _excep_code to identify the type of exception
  // Examine _excep_addr to find the address that caused the exception
  Nop();
  Nop();
  Nop();
 }
} // End of exception handler

ладно попробую без отладки, но с отладкой не работает:
Код:
static enum {
    EXCEP_IRQ = 0,            // interrupt
    EXCEP_MOD = 1,            // 
    EXCEP_TLBL = 2,            // 
    EXCEP_TLBS = 3,            //         
    EXCEP_AdEL = 4,            // address error exception (load or ifetch)
    EXCEP_AdES = 5,                // address error exception (store)
    EXCEP_IBE = 6,                // bus error (ifetch)
    EXCEP_DBE = 7,                // bus error (load/store)    
    EXCEP_Sys = 8,                // syscall
    EXCEP_Bp = 9,                // breakpoint           
    EXCEP_RI = 10,                // reserved instruction
    EXCEP_CpU = 11,                // coprocessor unusable
    EXCEP_Overflow = 12,            // arithmetic overflow
    EXCEP_Trap = 13,                // trap (possible divide by zero)
    EXCEP_IS1 = 16,            // implementation specfic 1
    EXCEP_TLBRI = 19,            //     
    EXCEP_TLBEI = 20,            //       
    EXCEP_WATCH = 23,                //
    EXCEP_MCCHECK = 24,                //        
    EXCEP_DSPDIS = 26,                //          
//    EXCEP_CEU,                // CorExtend Unuseable
//    EXCEP_C2E                // coprocessor 2
} _excep_code;
static unsigned int _epc_code;
static unsigned int _excep_addr;
// this function overrides the normal _weak_ generic handler
void _general_exception_handler(void)
{
    asm volatile("mfc0 %0,$13" : "=r" (_excep_code));
    asm volatile("mfc0 %0,$14" : "=r" (_excep_addr));
    _excep_code = (_excep_code & 0x0000007C) >> 2;    

    while (1) {
        // Examine _excep_code to identify the type of exception
        // Examine _excep_addr to find the address that caused the exception
#ifdef __DEBUG
__asm__("sdbbp");
#endif
        
    }
}
Gera82 вне форума   Ответить с цитированием
Старый 09.07.2018, 14:22   #21
Gera82
Senior Member
 
Аватар для Gera82
 
Регистрация: 13.08.2009
Адрес: Frankfurt / Новосибирск
Возраст: 36
Сообщений: 532
Вес репутации: 349/41
Gera82 is a jewel in the roughGera82 is a jewel in the roughGera82 is a jewel in the roughGera82 is a jewel in the rough
По умолчанию Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы

ну не попадаю я туда, что делать? в нормально рабочем режиме тоже не попадаю, ногу включаю а она не включается.
Код:
// this function overrides the normal _weak_ generic handler
void _general_exception_handler(void)
{
    asm volatile("mfc0 %0,$13" : "=r" (_excep_code));
    asm volatile("mfc0 %0,$14" : "=r" (_excep_addr));
    _excep_code = (_excep_code & 0x0000007C) >> 2;    

    while (1) {
        // Examine _excep_code to identify the type of exception
        // Examine _excep_addr to find the address that caused the exception
#ifdef __DEBUG
__asm__("sdbbp");
#endif
        _2_7_OUT_OC_24V = 1;
    }
}
Gera82 вне форума   Ответить с цитированием
Старый 09.07.2018, 14:29   #22
Gera82
Senior Member
 
Аватар для Gera82
 
Регистрация: 13.08.2009
Адрес: Frankfurt / Новосибирск
Возраст: 36
Сообщений: 532
Вес репутации: 349/41
Gera82 is a jewel in the roughGera82 is a jewel in the roughGera82 is a jewel in the roughGera82 is a jewel in the rough
По умолчанию Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы

Может в настройка контроллера что не так или компилятора?
Код:
// *****************************************************************************
// *****************************************************************************
// Section: Device Configuration
// *****************************************************************************
// *****************************************************************************
/*** DEVCFG0 ***/
#pragma config DEBUG =      OFF
#pragma config JTAGEN =     OFF
#pragma config ICESEL =     ICS_PGx3
#pragma config TRCEN =      OFF
#pragma config BOOTISA =    MIPS32
#pragma config FSLEEP =     OFF
#pragma config DBGPER =     ALLOW_PG2
#pragma config SMCLR =      MCLR_NORM
#pragma config SOSCGAIN =   GAIN_2X
#pragma config SOSCBOOST =  ON
#pragma config POSCGAIN =   GAIN_LEVEL_3
#pragma config POSCBOOST =  ON
#pragma config EJTAGBEN =   NORMAL
#pragma config CP =         OFF

/*** DEVCFG1 ***/
#pragma config FNOSC =      SPLL
#pragma config DMTINTV =    WIN_127_128
#pragma config FSOSCEN =    OFF
#pragma config IESO =       ON
#pragma config POSCMOD =    HS
#pragma config OSCIOFNC =   OFF
#pragma config FCKSM =      CSDCMD
#pragma config WDTPS =      PS1048576
#pragma config WDTSPGM =    STOP
#pragma config FWDTEN =     OFF
#pragma config WINDIS =     NORMAL
#pragma config FWDTWINSZ =  WINSZ_25
#pragma config DMTCNT =     DMT9
#pragma config FDMTEN =     OFF

/*** DEVCFG2 ***/

#pragma config FPLLIDIV =   DIV_2
#pragma config FPLLRNG =    RANGE_5_10_MHZ
#pragma config FPLLICLK =   PLL_POSC
#pragma config FPLLMULT =   MUL_96
#pragma config FPLLODIV =   DIV_4
#pragma config UPLLEN =     OFF  

/*** DEVCFG3 ***/
#pragma config USERID =     0xffff
#pragma config PGL1WAY =    OFF
#pragma config PMDL1WAY =   OFF
#pragma config IOL1WAY =    OFF

/*** BF1SEQ0 ***/
#pragma config TSEQ =       0xffff
#pragma config CSEQ =       0xffff
Gera82 вне форума   Ответить с цитированием
Старый 09.07.2018, 21:18   #23
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 31
Сообщений: 1,747
Вес репутации: 3274/71
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы

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

может стоит попробовать расставить какие-нибудь контрольные точки, по прохождению которых можно о чем-то судить?

вообще все это выглядит очень странно.
besogon вне форума   Ответить с цитированием
Старый 09.07.2018, 21:35   #24
Gera82
Senior Member
 
Аватар для Gera82
 
Регистрация: 13.08.2009
Адрес: Frankfurt / Новосибирск
Возраст: 36
Сообщений: 532
Вес репутации: 349/41
Gera82 is a jewel in the roughGera82 is a jewel in the roughGera82 is a jewel in the roughGera82 is a jewel in the rough
По умолчанию Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы

Цитата:
Сообщение от besogon Посмотреть сообщение
Gera82
я так понимаю, что нужно как-то определить точку, в которой висит при условии, что в отладке по каким-то причинам это невозможно.
у Вас, кстати, nmi как-нибудь обрабатывается?

может стоит попробовать расставить какие-нибудь контрольные точки, по прохождению которых можно о чем-то судить?

вообще все это выглядит очень странно.
да очень странно, у меня мозги кипят
nmi нет.


я убрал в программе все лишнее, и оставил только УАРТ, ДМА и ТАЙМЕР6, все остальное отключил нах*й, и только теперь работает.
Код:
#include <xc.h>
#include "main.h"
#include "delay.h"
#include <stdio.h>
#include <string.h>


// *****************************************************************************
// *****************************************************************************
// Section: Device Configuration
// *****************************************************************************
// *****************************************************************************
/*** DEVCFG0 ***/
#pragma config DEBUG =      OFF
#pragma config JTAGEN =     OFF
#pragma config ICESEL =     ICS_PGx3
#pragma config TRCEN =      OFF
#pragma config BOOTISA =    MIPS32
#pragma config FSLEEP =     OFF
#pragma config DBGPER =     ALLOW_PG2
#pragma config SMCLR =      MCLR_NORM
#pragma config SOSCGAIN =   GAIN_2X
#pragma config SOSCBOOST =  ON
#pragma config POSCGAIN =   GAIN_LEVEL_3
#pragma config POSCBOOST =  ON
#pragma config EJTAGBEN =   NORMAL
#pragma config CP =         OFF

/*** DEVCFG1 ***/
#pragma config FNOSC =      SPLL
#pragma config DMTINTV =    WIN_127_128
#pragma config FSOSCEN =    OFF
#pragma config IESO =       ON
#pragma config POSCMOD =    HS
#pragma config OSCIOFNC =   OFF
#pragma config FCKSM =      CSDCMD
#pragma config WDTPS =      PS1048576
#pragma config WDTSPGM =    STOP
#pragma config FWDTEN =     OFF
#pragma config WINDIS =     NORMAL
#pragma config FWDTWINSZ =  WINSZ_25
#pragma config DMTCNT =     DMT9
#pragma config FDMTEN =     OFF

/*** DEVCFG2 ***/

#pragma config FPLLIDIV =   DIV_2
#pragma config FPLLRNG =    RANGE_5_10_MHZ
#pragma config FPLLICLK =   PLL_POSC
#pragma config FPLLMULT =   MUL_96
#pragma config FPLLODIV =   DIV_4
#pragma config UPLLEN =     OFF  

/*** DEVCFG3 ***/
#pragma config USERID =     0xffff
#pragma config PGL1WAY =    OFF
#pragma config PMDL1WAY =   OFF
#pragma config IOL1WAY =    OFF

/*** BF1SEQ0 ***/
#pragma config TSEQ =       0xffff
#pragma config CSEQ =       0xffff



volatile char tx_buff[256];





static enum {
    EXCEP_IRQ = 0,            // interrupt
    EXCEP_MOD = 1,            // 
    EXCEP_TLBL = 2,            // 
    EXCEP_TLBS = 3,            //         
    EXCEP_AdEL = 4,            // address error exception (load or ifetch)
    EXCEP_AdES = 5,                // address error exception (store)
    EXCEP_IBE = 6,                // bus error (ifetch)
    EXCEP_DBE = 7,                // bus error (load/store)    
    EXCEP_Sys = 8,                // syscall
    EXCEP_Bp = 9,                // breakpoint           
    EXCEP_RI = 10,                // reserved instruction
    EXCEP_CpU = 11,                // coprocessor unusable
    EXCEP_Overflow = 12,            // arithmetic overflow
    EXCEP_Trap = 13,                // trap (possible divide by zero)
    EXCEP_IS1 = 16,            // implementation specfic 1
    EXCEP_TLBRI = 19,            //     
    EXCEP_TLBEI = 20,            //       
    EXCEP_WATCH = 23,                //
    EXCEP_MCCHECK = 24,                //        
    EXCEP_DSPDIS = 26,                //          
//    EXCEP_CEU,                // CorExtend Unuseable
//    EXCEP_C2E                // coprocessor 2
} _excep_code;
static unsigned int _epc_code;
static unsigned int _excep_addr;


// this function overrides the normal _weak_ generic handler
void _general_exception_handler(void)
{
    asm volatile("mfc0 %0,$13" : "=r" (_excep_code));
    asm volatile("mfc0 %0,$14" : "=r" (_excep_addr));
    _excep_code = (_excep_code & 0x0000007C) >> 2;    

    while (1) {
        // Examine _excep_code to identify the type of exception
        // Examine _excep_addr to find the address that caused the exception
#ifdef __DEBUG
__asm__("sdbbp");
#endif
        _2_7_OUT_OC_24V = 1;
    }
}



/********************************************************************************
 *                                                                              *
 *  Funktion:      int main(void)                                               *
 *                                                                              *
 *------------------------------------------------------------------------------*
 *  Description:
 ********************************************************************************/
int main(void) {
    
    OSCswitching();         // Alle Clocks einstellen
    Init_IO ();             // Pins IN/OUT/CN/ANALOG konfigurieren
    Init_PPS();             // Peripheral Pin Select
    Init_Periphery();       // Periphery einstellen    
    
    
while(1)
    {
    
    delay_ms(100);
    T6CONbits.ON = 1;    // Daten Fluss Einschalten
       

    }    
}



/********************************************************************************
 *                                                                              *
 *  Funktion:      OSCswitching                                                 *
 *                                                                              *
 *------------------------------------------------------------------------------*
 *  Description:
 ********************************************************************************/
void OSCswitching(void)
{   
    volatile unsigned int cp0;

    // Unlock Sequence
    asm volatile("di"); // Disable all interrupts
    SYSKEY = 0xAA996655;
    SYSKEY = 0x556699AA;  
    
    //1111111 = PBCLKx is SYSCLK divided by 128
    //1111110 = PBCLKx is SYSCLK divided by 127
    //0000011 = PBCLKx is SYSCLK divided by 4
    //0000010 = PBCLKx is SYSCLK divided by 3
    //0000001 = PBCLKx is SYSCLK divided by 2 
    //0000000 = PBCLKx is SYSCLK divided by 1

    // PB1DIV
    // Peripheral Bus 1 cannot be turned off, so there's no need to turn it on
    PB1DIVbits.PBDIV = 1; // Peripheral Bus 1 Clock Divisor Control (PBCLK1 is SYSCLK divided by 2)

    // PB2DIV
    PB2DIVbits.ON = 1; // Peripheral Bus 2 Output Clock Enable (Output clock is enabled)
    PB2DIVbits.PBDIV = 1; // Peripheral Bus 2 Clock Divisor Control (PBCLK2 is SYSCLK divided by 2)

//    // PB3DIV
//    PB3DIVbits.ON = 1; // Peripheral Bus 2 Output Clock Enable (Output clock is enabled)
//    PB3DIVbits.PBDIV = 1; // Peripheral Bus 3 Clock Divisor Control (PBCLK3 is SYSCLK divided by 2)
//
//    // PB4DIV
//    PB4DIVbits.ON = 1; // Peripheral Bus 4 Output Clock Enable (Output clock is enabled)
//    while (!PB4DIVbits.PBDIVRDY); // Wait until it is ready to write to
//    PB4DIVbits.PBDIV = 1; // Peripheral Bus 4 Clock Divisor Control (PBCLK4 is SYSCLK divided by 2)
//
//    // PB5DIV
//    PB5DIVbits.ON = 1; // Peripheral Bus 5 Output Clock Enable (Output clock is enabled)
//    PB5DIVbits.PBDIV = 1; // Peripheral Bus 5 Clock Divisor Control (PBCLK5 is SYSCLK divided by 2)
//    
//    // PB6DIV
//    PB6DIVbits.ON = 1; // Peripheral Bus 6 Output Clock Enable (Output clock is enabled)
//    PB6DIVbits.PBDIV = 4; // Peripheral Bus 6 Clock Divisor Control (PBCLK5 is SYSCLK divided by 4)
//
//    // PB7DIV
//    PB7DIVbits.ON = 1; // Peripheral Bus 7 Output Clock Enable (Output clock is enabled)
//    PB7DIVbits.PBDIV = 0; // Peripheral Bus 7 Clock Divisor Control (PBCLK7 is SYSCLK divided by 2)


    // CHECON - Set up prefetch
    SYS_DEVCON_PerformanceConfig(SYS_CLOCK_MHZ);
   
    
    
    // Set up caching
    cp0 = _mfc0(16, 0);
    cp0 &= ~0x07;
    cp0 |= 0b011; // K0 = Cacheable, non-coherent, write-back, write allocate
    _mtc0(16, 0, cp0);  

    // Lock Sequence
    SYSKEY = 0x33333333;
    asm volatile("ei"); // Enable all interrupts
      
}



/********************************************************************************
 *                                                                              *
 *  Funktion           SYS_DEVCON_PerformanceConfig                             *
 *                                                                              *
 *------------------------------------------------------------------------------*
 *
 *  description:
 *
 *
 ********************************************************************************/
void __attribute__((nomips16)) SYS_DEVCON_PerformanceConfig( unsigned long sysclk )
{
    

    /* Set the PFM wait states based on the system clock and ECC setting */
    if (sysclk <= 60000000UL)
        CHECONbits.PFMWS = 1;   // Wait States = 1
    else if (sysclk <= 80000000UL)
        CHECONbits.PFMWS = 2;   // Wait States = 2
    else
        CHECONbits.PFMWS = 3;   // Wait States = 3

    /* Enable Prefetch Cache Module */
    CHECONbits.PREFEN = 1;         // 01 Enable predictive prefetch for CPU instructions only
}



/********************************************************************************
 *                                                                              *
 *  Funktion           Init_IO                                                  *
 *                                                                              *
 *------------------------------------------------------------------------------*
 *
 *  description:
 *
 *
 ********************************************************************************/
void Init_IO (void)
{
     
        // PORTG Einstellung:
        // RG0(MC_TXD2_SLAVE_MC_RXD2(RXD2)) = in, RG1(MC_RXD2_SLAVE_MC_TXD2(TXD2)) = out, 
        // RG6(NC) = out, RG7(NC) = out, RG8(NC) = out, RG9(NC) = out,
        // RG10(2.1.OUT_OC_MC_OUT(DO)) = out, RG11(2.13.OUT_OC_MC_OUT(DO)) = out, 
        // RG12(NC) = out, RG13(2.7.OUT_OC_MC_OUT(DO)) = out, RG14(2.8.OUT_OC_MC_OUT(DO)) = out,
        // RG15(2.6.OUT_OC_MC_OUT(DO)) = out,
        LATG  = 0;                // Port alle auf LOW schalten
        TRISG = (1 << 0);         // PINS die auf Input eingestellt werden, 1 = Input
        CNENG = 0;                // CN Interrupt einzelne PINS aktivieren
        ANSELG = 0;               // PINS die Analog eingestellt werden, 1 = Analog

        
}



/********************************************************************************
 *                                                                              *
 *  TASK:           Init_PPS                                                    *
 *                                                                              *
 *------------------------------------------------------------------------------*
 *
 *  description:
 *
 *
 ********************************************************************************/
void Init_PPS (void)
{

        CFGCONbits.IOLOCK = 0;        // PPS Unlock
        CFGCONbits.PMDLOCK = 0;       // 0 = Peripheral module is not locked. Writes to PMD registers are allowed
        CFGCONbits.JTAGEN = 0;        // 0 = Disable the JTAG port

// input remappeble pins
        U2RXRbits.U2RXR = 0b1011;         // RPG0(0b1011) -> U2RX



// output remappeble pins
        RPG1Rbits.RPG1R  = 0b00010;        // RPG1(0b00010) -> U2TX

        
               
        CFGCONbits.IOLOCK = 1;      // PPS Lock
        CFGCONbits.PMDLOCK = 1;     // 1 = Peripheral module is locked. Writes to PMD registers are not allowed


}



/********************************************************************************
 *                                                                              *
 *  TASK:           Init_Periphery                                              *
 *                                                                              *
 *------------------------------------------------------------------------------*
 *  description:
 ********************************************************************************/
void Init_Periphery (void)
{

    
 // UART2 Für Master-Slave Databus ------------------------------------
     U2MODEbits.USIDL = 0;                /* Continue in Idle mode */
     U2MODEbits.LPBACK = 0;                /* Disable LoopBack */
    U2MODEbits.PDSEL = 0b00;            /* 8-bit data, no parity */
    U2MODEbits.STSEL = 0;                /* One Stop bit */
    
    U2MODEbits.BRGH = 1;                /* 1 = High-Speed mode – 4x baud clock enabled*/

    U2BRG = BRGVAL_DATABUS;            //1Mbit
    
    IFS1bits.U2TXIF = 0;                /* Clear interrupt flag */
    IPC14bits.U2TXIP = 3;                // 2 (bei 7 geht DISI nicht) is High priority, 0 is Low priority
    IPC14bits.U2TXIS = 2;                // sub priority, 0 is Low priority
    IEC1bits.U2TXIE = 0;                /* Enable receive interrupts */

    IFS1bits.U2RXIF = 0;                /* Clear interrupt flag */
    IPC14bits.U2RXIP = 3;                // 2 (bei 7 geht DISI nicht) is High priority, 0 is Low priority
    IPC14bits.U2RXIS = 2;                // sub priority, 0 is Low priority
    IEC1bits.U2RXIE = 0;                /* Enable receive interrupts */

    U2STAbits.UTXEN = 1;                /* 1 = UARTx transmitter is enabled. UxTX pin is controlled by UARTx (if ON = 1*/
    U2STAbits.URXEN = 1;                /* 1 = UARTx receiver is enabled. UxRX pin is controlled by UARTx (if ON = 1) */
    U2STAbits.UTXISEL = 0b10;           /* 10 =Interrupt is generated and asserted while the transmit buffer is empty*/
    U2STAbits.URXISEL = 0b10;           /* 10 =Interrupt is generated and asserted while the transmit buffer is empty*/
 
    U2MODEbits.CLKSEL = 0b00;           // 00 = PBCLKx(1), 01 = SYSCLK, 10 = FRC, 11 = REFCLK1
    
    U2MODEbits.ON = 1;                   /* Enable UART module 1 */     
    
    

// DMA1 UART2 TX - This is the DMA setup for the trasmiter    
    DCH1ECON=0;                    // no start or stop IRQs, no pattern match
    DCH1CONbits.CHPRI = 3;
    DCH1ECONbits.CHSIRQ = _UART2_TX_VECTOR;       // IRQ vector for "UART1 Transfer Done"
                                    // ===> U1TXREG empty and new Cell of 8 bytes
                                    // Could be transfered 
                                // See table 8-3 p 123 in PIC32MK documentation
    DCH1ECONbits.SIRQEN = 1;    // DMA's interruption enable   
    DCH1CONbits.CHAEN = 0;
//    DCH1CONbits.CHCHN = 1;
//    DCH1CONbits.CHPIGNEN = 0;     // Enable Pattern Ignore Byte bit, 0 = Disable this feature
    
    DCH1SSA = VirtToPhys(tx_buff);
    DCH1DSA = VirtToPhys(&U2TXREG);
    DCH1SSIZ = 16;              // source size at most x bytes                   
    DCH1DSIZ = 1;               // dst size is 1 byte  
    DCH1CSIZ = 1;               // PIC32MK has 8 bytes Transmitter FIFO                                              
    DCH1INTbits.CHBCIE = 1;     // alle Interupt ausschalten
    
    
    // Interrupt setup
    IPC18bits.DMA1IP = 5;
    IPC18bits.DMA1IS = 2;
    IFS2bits.DMA1IF = 0;  
   // IEC2bits.DMA1IE = 1;        // Interrupt disable
  //  DCH1CONbits.CHEN = 1;       // Enable channel 
    
    DMACONbits.ON = 1;
    
    
    
// Timer 6 für DMA Tx transfer, Interrupt alle 1ms    
    T6CONbits.ON = 0;        // Stop any 32-bit Timer7 operation
    T6CONbits.T32 = 1;       // Enable 32-bit Timer mode       
    T6CONbits.TCS = 0;       // Select internal instruction cycle clock
    T6CONbits.TGATE = 0;     // Disable Gated Timer mode
    T6CONbits.TCKPS = 0b000; // Select 1:1 Prescaler
       
    TMR6 = 0x00; // Clear 32-bit Timer (msw)
    PR6 = 60000; // PBCLK2 = TMR_CLK: 60000000 Mhz / 1000000µs * 1000µs = 60000 (0xEA60)
       
    IPC19bits.T6IP = 6; // 7 (bei 7 geht DISI nicht) is High priority, 0 is Low priority
    IPC19bits.T6IS = 3; // Sub priority, 0 is Low priority
    IFS2bits.T6IF = 0; //Clear Timer7 interrupt flag
    IEC2bits.T6IE = 1; // Enable Timer7 interrupt

    
//    T6CONbits.ON = 1;    // Daten Fluss Einschalten
    
           
// ---------------------------------------------------------    

  
  INTCONbits.MVEC = EIN;   //enable mult-vectored interrupts  
  

}



















/********************************************************************************
* 1 ms Timer Interrupt, fuer Aufbereitung der Daten und Transfer der Daten über 
* UART2 TX und DMA1
* PBCLK2 = TMR_CLK: 60000000 Mhz / 1000000µs * 1000µs = 60000 (0xEA60)
*********************************************************************************/
void __attribute__((vector(_TIMER_6_VECTOR), interrupt(IPL7AUTO), nomips16))  _T6Interrupt(void)
{
  _2_1_OUT_OC_24V = 1;       // Pin toggeln
   
  IFS2CLR = _IFS2_T6IF_MASK;
 // IFS2bits.T6IF = 0; //Clear Timer7 interrupt flag
  
  
  if (DCH1CONbits.CHEN == 0)
  {     
  DCH1CONbits.CHEN = 1;       // Enable channel 
  DCH1ECONbits.CFORCE = 1;    // set CFORCE to 1 to start Transmitter
  }
  
  _2_1_OUT_OC_24V = 0;       // Pin toggeln
}



я заметил, как появляется еше одно прерывании начинает глючить, есть прерывании от UART1 без ДМА:
Код:
/********************************************************************************
* U1RX Interrupt Steuerbus
*********************************************************************************/
void __ISR(_UART1_RX_VECTOR, IPL7AUTO) _U1RXInterrupt(void)
//void __attribute__((vector(_UART1_RX_VECTOR), interrupt(IPL7AUTO), nomips16))  _U1RXInterrupt(void)
{

  IFS1CLR = _IFS1_U1RXIF_MASK;
 // IFS1bits.U1RXIF = AUS;     // clear RX interrupt flag

/* Check for receive errors */
  if(U1STAbits.FERR == EIN)
   {
    }  
/* Must clear the overrun error to keep UART receiving */
  if(U1STAbits.OERR == EIN)
    {
    U1STAbits.OERR = AUS;
    }  
/* Get the data */
    if(U1STAbits.URXDA == EIN)
     {
       ReceivedData_Slave[bytes_slave] = U1RXREG;
       bytes_slave++;
     }
  
  if(ReceivedData_Slave[0] != START_BYTE)
   {
     bytes_slave=0;
   }
  
  if (bytes_slave == 7)
  {
      bytes_slave = 0;
      SYSTEM_FLAG.bits.master_frame_fertig = EIN;
      _2_3_OUT_OC_24V ^= 1;       // Pin tooglen
  }
  
  _2_2_OUT_OC_24V ^= 1;       // Pin tooglen
  
}
как они могут друг другу мешать? на PIC32MZ работает же?!
Gera82 вне форума   Ответить с цитированием
Старый 09.07.2018, 23:06   #25
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 31
Сообщений: 1,747
Вес репутации: 3274/71
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы

Gera82
как они могут друг другу мешать? на PIC32MZ работает же?! - кто-нибудь кроме Вас знает, как у Вас прерывания там работают? pic32mz сильно быстрее и это запросто может скрыть архитектурные изъяны.

в общей модели обработка прерываний происходит следующим образом.

есть основной поток с каким-то приоритетом выполнения. он может быть прерван только прерыванием с приоритетом выполнения выше, чем у потока, который исполняется.

в случае когда происходит прерывание происходит куча вещей.

среди которых в общем случае можно выделить несколько.

сохранение состояния, в котором было ядро, чтобы можно было возвратиться.
(есть моменты, что полное сохранение может и быть отложено, если есть srs, но это дело третье).

переключение на контекст ядра (если нужно)

полезная нагрузка.

восстановление контекста потока.

во время одного прерывания может быть запросто сгенерировано еще прерывание.
это обязательно должно быть учтено в системе.
самые интересные вещи, как правило, в такие моменты и происходят.

что может быть?

может быть неверно сделанный пролог прерываний. что во время вложенных прерываний портится содержимое регистров.
может исчерпываться стек ядра (который используется в прерываниях).
может исчерпываться стек потока.
может быть неверно сделанный эпилог прерываний. что неверно загружается или портится.
куча всего.

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

все это можно более-менее посмотреть с помощью disassembly.
besogon вне форума   Ответить с цитированием
Ответ

Метки
dma, pic32mk, pic32mk pic32mz dma uart, pic32mz, uart


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
PIC32MZ, EBI и DMA vladtv Продукция MICROCHIP 11 16.01.2017 03:50
появились датащиты на PIC32MZ EC Алексей Продукция MICROCHIP 154 16.03.2015 10:43
PIC32 DMA UART сбои при передаче valery1966 Продукция MICROCHIP 8 01.07.2014 17:11
DMA with UART gazpr1bor Продукция MICROCHIP 6 27.07.2010 13:27
Проблемы с прерываниями от UART PIC24HJ128GP510. ROGALIK Продукция MICROCHIP 12 06.08.2008 23:01


Часовой пояс GMT +3, время: 10:56.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd. Перевод: zCarot