Forum: Mikrocontroller und Digitale Elektronik CAN kolidiert mit Display


von Tom (Gast)


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.

von (prx) A. K. (prx)


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.

von Tom (Gast)


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.

von (prx) A. K. (prx)


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".

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Ist das OV-Bit gesetzt?

von Tom (Gast)


Lesenswert?

was meinst du damit also mit dem 0V bit?

von Tom (Gast)


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
}

von Tom (Gast)


Lesenswert?

1
  if(MsgBuf_RX1.MsgID == 0x45)   // first ID        
2
  {
3
     data[0] = LPC_CAN1->RDA;
4
     data[1] = LPC_CAN1->RDB;
5
  }

von Tom (Gast)


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.

von Tom (Gast)


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
}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.