www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PIC18F reagiert bei ext. INT1 nicht


Autor: Rödu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
/*Header*/
#ifdef USE_PIC18F4685
  #define __PICF4685
#else
  #define __PICF4680
#endif

/*Includes*/
#include "p18f4685.h"    //definition for PIC18F
#include "CAN18XX8.h"    //definition for CAN
#include "main.h"      //global Defines
#include "delays.h"      //delay library
#include "em4095.h"      //RFID





/**************************************************************/
/*        Function: High priority interrupt routine    */
/**************************************************************/

#pragma code
#pragma interrupt InterruptHandlerHigh

void InterruptHandlerHigh ()
{
  if(IRQ_INT1_FLAG)
  {
    IRQ_INT1_FLAG = CLEAR;        //clear ext. interrupt 1 flag
  }
    if(TMR0_OVERFLOW_FLAG)          //check for TMR0 overflow
    {                                   
      TMR0_OVERFLOW_FLAG = CLEAR;
      
    }
}

/**************************************************************/
/*        Function: High priority interrupt Vector    */
/**************************************************************/

#pragma code InterruptVectorHigh = 0x08
void
InterruptVectorHigh (void)
{
  _asm
    goto InterruptHandlerHigh     //jump to interrupt routine
  _endasm
}

/**************************************************************/
/*          Function: PIC Initializing          */
/**************************************************************/
void PIC_Init(void)
{
  /*Port init*/
  TRISB = 0b11001011;        // Port-B definition: RB7=in / RB6=in / RB5=out / RB4=out / CANRX=in / CANTX=out / RB1=in / RB0=in
  TRISA = 0b11111111;       // Bit 0 to 6 are not used

  /*interrupt init*/
  IRQ_PRIORITY = ENABLE;
  //IRQ_GLOBAL_LOWPRIO = DISABLE;
  //IRQ_GLOBAL_HIGHPRIO = 1;  // only high priority IRQ
  IRQ_TMR0 = ENABLE;
  IRQ_INT0 = DISABLE;
  IRQ_PORTB_CHANGE = DISABLE;
  IRQ_INT1_EDGE_SELECT = RISING;
  IRQ_INT1_PRIORITY = HIGH;
  IRQ_INT1 = ENABLE;
  IRQ_INT1_FLAG = CLEAR;
  IRQ_TMR0_PRIORITY = HIGH;

  INTCONbits.GIE = 1;
  INTCONbits.PEIE = 0;
  
  /*Timer 0 init*/
  TMR0_CLK_SOURCE_SELECT = 0;    // Internal instruction cycle clock (CLKO)
  TMR0_PRESCALER_notACTIV = 0;  // Timer0 clock input comes from prescaler output. Prescaler activated
  TMR0_PRESCALER_T0PS0 = 1;
  TMR0_PRESCALER_T0PS1 = 0;
  TMR0_PRESCALER_T0PS2 = 0;    // Set prescaler value 1:4 -> TIMER clock = 0.1us
  TMR0_OVERFLOW_FLAG = CLEAR;
  TMR0_8BIT = ENABLE;
  
  TMR0 = DISABLE;          // Enable TIMER 0

}


/**************************************************************/
/*          Function: CAN Initializing          */
/**************************************************************/
void CAN_Init(void)
{
  /*Sets Baudrate of 125KB and goes back to normal mode*/
  CANInitialize(SJW_125K,BRP_125K,PHSEG1_125K,PHSEG2_125K,PROPSEG_125K, CAN_CONFIG_ALL_VALID_MSG);

  CANSetOperationMode(CAN_OP_MODE_CONFIG);            // Set CAN module into configuration mode       
  RXB0CONbits.RXBODBEN = ENABLE;                  // Double receive buffer if RXBuffer 0 full -> Message in RXBuffer 1
  CIOCONbits.ENDRHI = ENABLE;                   // CAN Tx PIN will drive VDD when recessive      
  CANSetOperationMode(CAN_OP_MODE_NORMAL);             // Set CAN module into normal mode
}

/**************************************************************/
/*          Function: MAIN                 */
/**************************************************************/
void main(void){
  /*temporary definition  */
  BYTE MessageData[8];
  BYTE DataLen = 8;
  unsigned long ID = 0x11;
  MessageData[0]=0x08;
  MessageData[1]=0x80;
  MessageData[2]=0x11;
  MessageData[3]=0x01;
  MessageData[4]=0x02;
  MessageData[5]=0x04;
  MessageData[6]=0x12;
  MessageData[7]=0x14;
  


  /*Initializing of the moduls: CAN, RF and PIC*/
  RF_Init();
  CAN_Init();
  PIC_Init();

  while(1)
    {  
    

    CANSendMessage(ID, MessageData, DataLen, CAN_TX_PRIORITY_0 & CAN_TX_STD_FRAME & CAN_TX_NO_RTR_FRAME);
  
    Delay10KTCYx(255);
    }  

}

Der PIC18F4685 will den externen INT1 nicht auslösen.
Meiner Meinung nach habe ich alle Register gesetzt. Wenn ich den Timer0 
aktiviere springt er nach dem overflow schön an seinen Platz, aber 
jedoch nicht der INT1.
Das anliegende Signal ist ein TTL Ausgang von einem anderen IC. Die 
Flanken sind also relativ steil 0V-5V.
-Global Interrupt Flag ist gesetzt.
-INT1 aktivert

Er reagiert weder auf rising noch auf falling edges.
Woran könnte dies liegen? Die Suchfunktion hat mich leider nicht weiter 
gebracht.

Danke schonmal.
Grüsse
Rödu

Autor: Bernd Rüter (Firma: Promaxx.net) (bigwumpus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sieh Dir mal das Register ADCON1 an und evtl. die Config-Bits.
Der Eingang hat versch. Aufgaben, unter anderem auch einen 
Analog-Eingang. Ist der aktiv (per Default nach Reset ?) kannst Du den 
digitalen Kram vergessen!

Autor: Rödu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Eingänge sind bei den CONFIG-bits auf digital eingestellt.
A/D Wandler in ADCON0 ist auch deaktiviert.

Autor: Rödu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich werde nicht ganz schlüssig, was bei meinem PIC vor sich geht.
Wenn ich in den CONFIG Bits auf "configured as analog input on reset" 
instelle kann ich den PORTB konfigueren (inputs, outputs, Pegel,....).
Gehe ich nun auf "configured as digital I/O on reset", was eigentlich 
auch richtig wäre, reagiert der PORTB nicht mehr auf meine Befehle. Ich 
kann sie nicht mehr HIGH und LOW schalten.
TRISB sollte korrekt eingestellt sein. Keine Ahnung wo das hakt, hier.

Autor: Rödu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe das Gefühl, dass mit den Config Bits etwas nicht ordnungsgemäss 
abläuft.
Wenn ich nun die Config-Bits des PICs in den Code nehme, meldet er immer 
den Fehler, dass sie zweimal definiert sind.
Im Programm Code ist aber nichts zu sehen, ausser der Teil im 
Header-File.

Wo verstecken sich beim MPLab die Config-files für einen PIC18F noch?
Ich möchte sie nicht im MPlab definieren, sondern im Code.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.