CAN kolidiert mit Display

Gast #1931358
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.
#1931361
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.
Gast #1931380
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.
#1931389
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".
Gast #1931405
Lesenswert?

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 #1931473
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren