PIC32MX350F512H-Sériová komunikace-přerušení po příjmu znaku

Ahoj, nehrajete si někdo s tímto MCU? Chtěl bych na něm zprovoznit seriovou komunikaci, ale nejde mi vyvolat přerušení od příjmu znaku. Pokud povolím přerušení od odeslání znaku tak mi program někam odskočí a už se nerozjede…


  /* Map peripheral pins */
  asm("di");
  SYSKEY = 0x0;
  SYSKEY = 0xAA996655;
  SYSKEY = 0x556699AA;
  RPF1R = 0x0001;               // configure the output U3TX to pin RF1
  U3RXR = 0x0100;              // configure the input U3RX to pin RF0
  SYSKEY = 0x0; 

  UARTConfigure(UART3, UART_ENABLE_PINS_TX_RX_ONLY);
  UARTSetLineControl(UART3, UART_DATA_SIZE_8_BITS | UART_PARITY_NONE | UART_STOP_BITS_1);
  UARTSetFifoMode(UART3, UART_INTERRUPT_ON_RX_NOT_EMPTY);
  UARTSetDataRate(UART3, GetPeripheralClock(), DESIRED_BAUDRATE*2);
  UARTEnable(UART3, UART_ENABLE_FLAGS(UART_PERIPHERAL | UART_RX | UART_TX));

  // Configure UART3 RX Interrupt
  INTEnable(INT_SOURCE_UART_RX(UART3), INT_ENABLED);
  INTSetVectorPriority(INT_VECTOR_UART(UART3), INT_PRIORITY_LEVEL_2);
  INTSetVectorSubPriority(INT_VECTOR_UART(UART3), INT_SUB_PRIORITY_LEVEL_0);

asm("ei");

void __ISR(_UART_3_VECTOR, IPL0) IntUart3Handler(){ if(IFS1bits.U3RXIF){ //prijaty seriovy znak IFS1CLR = _IFS1_U3RXIF_MASK; //smazani priznaku prijmu } else{ if(IFS2bits.U3TXIF){ IFS2CLR = _IFS2_U3TXIF_MASK;} }

pokud by někdo věděl kde dělám chybu…slibuju, že už se nikdy nebudu pouštět do programování a půjdu se věnovat jen krásným ženám

:arrow_right: administrator: přejmenováno z "PIC32MX350F512H"

Na mě doma čeká PIC32MX250F128B (všechny PIC32 jsou v podstatě stejné, liší se jen pouzdrem a velikostí paměti), nicméně ještě jsem si s ním nehrál, protože C se teprve začínám učit. Nicméně zas bych to programování úplně nezatracoval, až tě chytí prostata, tak ti ty krásné ženy časem spíš “polezou krkem” :smiley:

Tak tohle mi příjde v tuto chvíli jako nesmyl, protože jsem dlohou dobu dělal s PIC32MX695F512L o kterém bych řekl, že jsem ho ovládnul…tento procesor zatím ovládá mě, protože to co funguje u 695, u 350 nefunguje.

BTW: těšil jsem se, že mi někdo poradí a já už nikdy nebudu programovat…tím pádem bych se mohl věnovat něčemu hezčímu…díky tomuto opět klesám až na dno propasti zoufalství.

Ahoj, všechny MCU řady PIC32MX mají stejné jádro MIPS4K a liší se jen v perifériích, tím je zajištěna relativně snadná přenositelnost programů.
Ale k tvému problému: inicializace a nastavení vypadají OK, ale obsluha přerušení není úplná.

  1. zakaž přerušení od TX, když nic neposíláš není potřeba a tady povede k zacyklení programu.
  2. při přerušení od RX musíš vyčíst data z buffru, aby později nepřetekl.
    Zkus to odladit a uvidíš. Kdyby to ani pak nefungovalo, tak zkontroluj toto:
    nastavení bitu U3RXIF při přijmu znaku po sběrnici, nastavení Baud Rate, není chyba v jiné části programu, zapojení HW.

Přeji ti hodně úspěchu u žen 8)

Ahoj…tak zasílám rozřešení mého problému. Celé to bylo způsobeno špatným přemapováním RX pinu na periferii. Správně to mělo být provedeno takto:

SYSKEY = 0x0;
SYSKEY = 0xAA996655;
SYSKEY = 0x556699AA;
PPSOutput(1, RPF1, U3TX);
PPSInput(2, U3RX, RPF0);      
SYSKEY = 0x0;

Sorry ženy…letos se Vám ještě věnovat nebudu :smiley: