CAN kolidiert mit Display

Gast #1931358
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.
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.
Gast
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.
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".
Gast
so siehts aus
1
int main( void )
2
{
3
  SystemInit();   // Funktionsaufruf Systeminitialisierung
4
  lcd_init();
5
  INOUT_Def();
6
 
7
  /* Please note, the bit timing is based on the setting of the 
8
  PCLK, if different PCLK is used, please read can.h carefully 
9
  and set your CAN bit timing accordingly. */  
10
 
11
  CAN_Init(BITRATE500K15MHZ);       // Bitrate = 500kbaud bei 15MHz
12
  NVIC_EnableIRQ(CAN_IRQn);         // Interrupts freischalten
13

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

19
 CAN_SetACCF( ACCF_ON );          // Filtermodus festlegen
20

21
  while ( 1 )
22
  {
23
  /* Transmit initial message on CAN 1 */
24
  while ( !(LPC_CAN1->GSR & (1 << 3)) );
25
         MsgBuf_TX1.DataA = data[0];
26
         MsgBuf_TX1.DataB = data[1];
27
  if ( CAN1_SendMessage( &MsgBuf_TX1 ) == FALSE )
28
  {
29
    continue;
30
  }
31

32
  /* please note: FULLCAN identifier will NOT be received as it's not set 
33
  in the acceptance filter. */
34
   if ( CAN1RxDone == TRUE )
35
  {
36
    CAN1RxDone = FALSE;
37
   
38
  } /* Message on CAN 2 received */
39
  
40
     lcd_draw_string(font_vw_16px, NORMAL_STYLE,"m/h",79,50,255);
41
}
Gast
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.
Gast
1
/******************************************************************************
2
** Function name:    CAN_ISR_Rx1
3
**
4
** Descriptions:    CAN Rx1 interrupt handler
5
**
6
** parameters:      None
7
** Returned value:    None
8
** 
9
******************************************************************************/
10
void CAN_ISR_Rx1( void )
11
{LPC_GPIO2->FIOSET =0x01;
12
  uint32_t * pDest;                  
13

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

18
  pDest++;
19
  *pDest = LPC_CAN1->RID; /* ID  */
20
  
21

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

25

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

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

35

36
}
37

38
/*****************************************************************************
39
** Function name:    CAN_Handler
40
**
41
** Descriptions:    CAN interrupt handler
42
**
43
** parameters:      None
44
** Returned value:    None
45
** 
46
*****************************************************************************/
47
void CAN_IRQHandler(void)  
48
{    
49
  LPC_GPIO2->FIOPIN &= ~(0x00000040);
50
  CANStatus = LPC_CANCR->CANRxSR;   /* Score CAN Status */
51
  if ( CANStatus & (1 << 8) )       /* if a message received */
52
  {
53
  CAN1RxCount++;              
54
  CAN_ISR_Rx1();              /* go to CAN_ISR_RX1() */
55
  }
56

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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 15 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.