www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik CAN kolidiert mit Display


Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo =)

Ich habe folgendes Problem und wollte mal hören, ob dies schon jemand 
hatte und mir evtl. eine Lösung liefern kann.

Und zwar arbeite ich mit einem LPC1768 dieser kann ein Display ansteuern 
und CAN Botschaften senden und empfangen.
solange ich beides einzeln betreibe funktioniert es wunderbar, sprich 
ich kann CAN Daten senden und empfangen (ich kann dies mit CANOE 
kontrollieren) und wenn ich mein Display betreiben will kann ich Strings 
und Chars darstellen und mit Hilfe von sprintf auch Zahlen.

so nun wollte ich die CAN-Daten auswerten und anschließend anzeigen, 
jedoch stellt mein CAN-Controller jedes mal den Betrieb nach eine 
unbestimmten Zeit ein sobald ich zusätzlich etwas auf mein Display 
schreiben möchte.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und jetzt sollen alle ihre Kistallkugeln polieren? Mehr als "du machst 
offenbar etwas falsch" gibt deine Information nicht her.

So haben CAN Controller typischerweise Fehlerzähler und Statusregister. 
Wäre ja vielleicht nicht uninteressant, da sowohl beim Stillstand als 
auch im Betrieb mal reinzusehen.

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich wollte wissen ob jemand das Problem kennt, da es mir völlig 
unbekannt und unerklärlich ist.

Und mein Fehlerzähler bleibt auf 0.
Ich starte das Programm und alles läuft wie es soll und nach gerade ca. 
40 sekunden stoppt mein Controller den Sendevorgang aber das Senden von 
CANoe an den Controller wird noch vollzogen, jedoch ändern sich meine 
Empfangenen Daten auf dem Controller nicht mehr.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tom schrieb:

> ich wollte wissen ob jemand das Problem kennt, da es mir völlig
> unbekannt und unerklärlich ist.

Das Problem "mein Programm funktioniert nicht" ist jedem hier nur zu gut 
bekannt. Wer sich mal mit CAN befasst hat, der kennt auch die spezifisch 
erweiterte Variante dafür. Hilft dir das jetzt weiter?

Eine andere hoffentlich zielführende Antwort ist das beliebte "Fehler in 
Zeile 42".

Autor: Markus Müller (mmvisual)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist das OV-Bit gesetzt?

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
was meinst du damit also mit dem 0V bit?

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so siehts aus
int main( void )
{
  SystemInit();   // Funktionsaufruf Systeminitialisierung
  lcd_init();
  INOUT_Def();
 
  /* Please note, the bit timing is based on the setting of the 
  PCLK, if different PCLK is used, please read can.h carefully 
  and set your CAN bit timing accordingly. */  
 
  CAN_Init(BITRATE500K15MHZ);       // Bitrate = 500kbaud bei 15MHz
  NVIC_EnableIRQ(CAN_IRQn);         // Interrupts freischalten

  MsgBuf_TX1.Frame = 0x00080000;  // 11-bit, no RTR, DLC is 8 bytes 
  MsgBuf_TX1.MsgID = 0x2ee;       // Explicit Standard ID 
  MsgBuf_TX1.DataA = data[0];
  MsgBuf_TX1.DataB = data[1];

 CAN_SetACCF( ACCF_ON );          // Filtermodus festlegen

  while ( 1 )
  {
  /* Transmit initial message on CAN 1 */
  while ( !(LPC_CAN1->GSR & (1 << 3)) );
         MsgBuf_TX1.DataA = data[0];
         MsgBuf_TX1.DataB = data[1];
  if ( CAN1_SendMessage( &MsgBuf_TX1 ) == FALSE )
  {
    continue;
  }

  /* please note: FULLCAN identifier will NOT be received as it's not set 
  in the acceptance filter. */
   if ( CAN1RxDone == TRUE )
  {
    CAN1RxDone = FALSE;
   
  } /* Message on CAN 2 received */
  
     lcd_draw_string(font_vw_16px, NORMAL_STYLE,"m/h",79,50,255);
}

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
  if(MsgBuf_RX1.MsgID == 0x45)   // first ID        
  {
     data[0] = LPC_CAN1->RDA;
     data[1] = LPC_CAN1->RDB;
  }


Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
habe eben nen bisschen getestet und zwar springt das Programm auch nicht 
mehr in den Interrupt hinein obwohl Daten mit dem richtigen Identifier 
gesendet werden und keine Fehler angezeigt werden.

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
/******************************************************************************
** Function name:    CAN_ISR_Rx1
**
** Descriptions:    CAN Rx1 interrupt handler
**
** parameters:      None
** Returned value:    None
** 
******************************************************************************/
void CAN_ISR_Rx1( void )
{LPC_GPIO2->FIOSET =0x01;
  uint32_t * pDest;                  

  /* initialize destination pointer  */
  pDest = (uint32_t *)&MsgBuf_RX1;
  *pDest = LPC_CAN1->RFS;  /* Frame  */

  pDest++;
  *pDest = LPC_CAN1->RID; /* ID  */
  

  pDest++;
  *pDest =  LPC_CAN1->RDA; /* Data A */


  pDest++;
  *pDest = LPC_CAN1->RDB; /* Data B  */

  Data_Score();        /* jedem Nachrichtenteil A oder B nach der ID geordnet ein Feld zuweisen*/
  
  CAN1RxDone = TRUE;
  LPC_CAN1->CMR = 0x04; /* release receive buffer */
  return;


}

/*****************************************************************************
** Function name:    CAN_Handler
**
** Descriptions:    CAN interrupt handler
**
** parameters:      None
** Returned value:    None
** 
*****************************************************************************/
void CAN_IRQHandler(void)  
{    
  LPC_GPIO2->FIOPIN &= ~(0x00000040);
  CANStatus = LPC_CANCR->CANRxSR;   /* Score CAN Status */
  if ( CANStatus & (1 << 8) )       /* if a message received */
  {
  CAN1RxCount++;              
  CAN_ISR_Rx1();              /* go to CAN_ISR_RX1() */
  }

  if ( LPC_CAN1->GSR & (1 << 6 ) )  /* if there is an error */
  {
  /* The error count includes both TX and RX */
  CAN1ErrCount = LPC_CAN1->GSR >> 16; 
  }
  return;
}

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.