Forum: Mikrocontroller und Digitale Elektronik CAN-BUS Problem


von Oli. (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Leute

ich benutze einen AT90CAN128 mit 8MHz Quarz, und als BUS-Treiber ist 
einer MCP2551.  Ich versuche CAN-BUS hinzukriegen, es gebt zwei knoten 
einer ist nur Sender und der zweiter nud Empfänger. Von mikrokontroller 
RXCAN TXCAN bekomme ich folgende Signale Siehe Bild1 von dem Bus-Treiber 
bekomme ich aber dieses Bild siehe Bild2 von MCP2551. Schaltplan ist 
auch Im Anhang.
Hier mein Quellcode für den Sender.

#include <stdlib.h>
#include <avr/io.h>
#include "lcd.h"
#include "lcd.c"
#include <util/delay.h>
#include <math.h>
#include <avr/interrupt.h>

// Definitionen  MOb-Selektierung
#define MO_1 1

// Definitionen  MOb-Konfiguration
#define TX 1
#define DLC_1 2
#define NO_IDE 0
#define NO_Reply 0

// Definitionen
#define CANSPD 200        // PAUSE zwischen den CAN BUS Nachrichten
#define ANASPD 50        // PAUSE zwischen den analogen Einzelmessungen


int i=0, sekunde=0;
ISR(TIMER0_OVF_vect)
          {
          //TCNT0=135;
          if(i<=500)
          {
          i++;
          }
          else{
          sekunde++;
          i=0;
          }
          }


volatile unsigned int  TEMPRAUM=0, TEMP1=0, TEMP2=0, TEMP3=0, TEMP4=0, 
TEMP5=0, TEMP6=0, TEMP7=0, TEMP8=0, TEMP9=0, TEMP10=0, TEMP11=0, 
ADCwert=0, can_msg=0;


void CanClearMOB(void)// Löschen der Konfigurationen von MOb0 ... MOb14
{
   unsigned char i, j;
   for(i=0;i<=14;i++)
   {
      CANPAGE = (i << 4);  // XXXX0000 -> Autoincrement aktiviert
      CANSTMOB = 0;
      CANCDMOB = 0;
      CANIDT4 = 0;
      CANIDT3 = 0;
      CANIDT2 = 0;
      CANIDT1 = 0;
      CANIDM4 = 0;
      CANIDM3 = 0;
      CANIDM2 = 0;
      CANIDM1 = 0;
      for(j=0;j<=8;j++)
      {
         CANMSG=0;        //Autoincrement aktiv
      }
   }
}


void CanInit(void)
{

   CanClearMOB();                         // Alle MOb's löschen


   CANBT1 = 0x12;                       // Teiler
   CANBT2 = 0x04;                       // PRS = 7 TQs, PHS1= 7 TQs, 
PHS2= 7 TQs
   CANBT3 = 0x13;                       // ==> Sample Point bei  75 %

// CAN Controller aktivieren
   CANGCON |= 0X02;


}

void can_send(uint8_t mob_nr,uint8_t lenght,int msg_id){

// Initialisierung MOb1 (Sender)

  CanClearMOB();
     CANPAGE  = (mob_nr << 4);          // Selektierung von MOb1
     CANCDMOB|= lenght;                       // n Datenbyte senden
     CANCDMOB|= NO_IDE<<4;                    // Botschaft als Standard 
Frame
     CANCDMOB|= NO_Reply<<5;
     CANIDT1  = msg_id >>3;
     CANIDT2  = msg_id <<5;
     CANCDMOB|= TX<<6;                // Botschaft abschicken



}



int analogwert (uint8_t mux){

ADMUX = (ADMUX & ~(0x1F)) | (mux & 0x1F);

  for(int i=0; i<100; i++ )
        {
      ADCSRA |= (1<<ADSC);              // eine Wandlung "single 
conversion"
      while ( ADCSRA & (1<<ADSC) ) {;}
      ADCwert+= ADCW;                // Wandlungsergebnisse aufaddieren
        }
  ADCwert /=100;
return ADCwert;
}



int main(void){
CanInit();       // Konfiguration und Sendung des CAN BUS
DDRA=0xFF;

char buffer[4];

ADCSRA = (1<<ADEN) | (1<<ADPS0) | (1<<ADSC);       //ADC einschalten 
Vorteiler 64
while ( ADCSRA & (1<<ADSC) ) {;}
ADCwert=ADCW;
ADCW=0;                                   //ADC auslesen und verwerfen

TCCR0A= (1<<CS01);                        //Vorteiler 256 Timer 0 ( für 
die Uhr )
TIMSK0= (1<<TOIE0);                         //Timer0 Interrupt erlauben
sei();

lcd_init(LCD_DISP_ON);
lcd_clrscr();

PORTA=(1<<DDA4) | (1<<DDA5);
while(1){


TEMP1= analogwert(0);
TEMP2= analogwert(1);


if(sekunde==2){
    PORTA=0b00000000;
    _delay_ms(2);
    PORTA=0b00000000;
    sekunde=0;
      for(int i=0; i<10; i++ ){
          TEMPRAUM+=PINC;
          }
    TEMPRAUM/=10;
    PORTA=0b00010000;
    _delay_ms(2);
    PORTA=0b00110000;
    }

      //_delay_ms(CANSPD);
      can_msg=TEMP1;
      can_send(1,2,100);   //can_send(MOB,LÄNGE,ID)
      CANMSG=can_msg;
      CANMSG=can_msg>>8;


itoa ((TEMPRAUM-60),buffer, 10);
lcd_gotoxy(0, 1);
lcd_puts(buffer);
lcd_puts(" ");

itoa ((TEMP1+(TEMPRAUM-60)),buffer, 10);
lcd_gotoxy(0, 0);
lcd_puts(buffer);
lcd_puts(" ");

itoa ((TEMP2+(TEMPRAUM-60)),buffer, 10);
lcd_gotoxy(5, 0);
lcd_puts(buffer);
lcd_puts(" ");


}
}
Weiss einer vielleicht einer wieso der BUS-Treiber nur CANhigh activ ist 
und nich der CANlow obwohl er vom AT90CAN128 normale Signale beckommt. 
verdahtund habe ich überprüft ist alles ok.

von mani (Gast)


Angehängte Dateien:

Lesenswert?

So viel Quellcode macht man in den Anhang, Bilder die 3,3MB groß sind 
schaut keiner an! Mit so einem Bild könnte man theoretisch eine ganze 
Hauswand tapezieren!!! Ohne Mühe geht das auch um den Faktor 20 
kleiner!!!

von Oli. (Gast)


Lesenswert?

ich bitte um Entschuldigung, was ist denn jetzt mit kann mir keiner 
helfen???????

von mani (Gast)


Lesenswert?

Wenn es funktional sein soll und nicht zum lernen, dann würde ich Dir 
empfehlen einfach eine fertige Bib zu nehmen...die hier ist nicht 
schlecht:
http://www.kreatives-chaos.com/artikel/universelle-can-bibliothek

Hab ich selbst schon eingestzt. Funktioniert sehr gut und ist leicht zu 
verstehen.

Grüße
Mani

von mani (Gast)


Lesenswert?

Hast DU eigentlich die beiden Abschlusswiderstände drin?

von Knilch (Gast)


Angehängte Dateien:

Lesenswert?

@Oli.
Hast du Pin 8 vom MCP2551 (DIL) mit 10 Ohm an Masse/GND?
Anbei ein Schaltungsbeispiel mit mega16 und externem CAN-Trasceiver.
Poste mal deinen Schaltplan.

von mani (Gast)


Lesenswert?

Der ist oben schon als DocX drin...der Widerstand scheint drin zu sein, 
der Wert steht nicht dran...

von mani (Gast)


Lesenswert?

Können die LEDs am Ausgang einen Einfluss haben?

von Knilch (Gast)


Lesenswert?

@mani
ok, konnte das docX nicht öffnen, habe nur Office97... :-(

von tom (Gast)


Lesenswert?

hast du einen CAN Monitor/Analyser für den PC, mit dem Du auch etwas 
senden kannst ?

dann benutze den als test-sender/empfänger um deine sourcen in betrieb 
nehmen zu können.

oder du nimmst eine getestete implementierung/applikation um eine 
gültige can-botschaft mit testdaten drin (zyklisch) zu erzeugen mit 
einem knoten. sonst hast du immer das ei-henne problem und 
can-nachrichten anhand scope zu dekodieren ist sehr müßig, von den 
stuff-bits mal ganz abgesehen...

ach ja, an jedem knoten 120 Ohm abschlusswiderstand zwischen CAN+ und 
CAN- am bustransceiver nicht vergessen...

normalerweise solltest du ein differentielles signal an diesen beiden 
Leitungen sehen können, also CAN+ ein bitmuster identisch zum TTL signal 
und CAN- das gleiche invertiert. ansonsten liegt da auch noch etwas im 
argen...

spannungsversorgung überprüfen, pinout checken, buskurzschluss 
ausschliessen, usw.

gruss, tom.

von Oli. (Gast)


Lesenswert?

Danke für die Antworten. Pin Nr 8 von MCP2551 habe ich auf masse mit 
einem 10kgelegt so wie es sein solte die 120 Ohm Wiederstände habe ich 
drin. Es könnten wirklich ja die LED`s sein. muss ich gleich umlöten. 
ich melde mich gleich

von (prx) A. K. (prx)


Lesenswert?

Oli. schrieb:

> ich bitte um Entschuldigung, was ist denn jetzt mit kann mir keiner
> helfen???????

Mit Schaltplan als .docx hast du dir schon mal alle Leute vom Hals 
geschafft, die mit diesem Fileformat nichts anfangen können.

von Oli. (Gast)


Angehängte Dateien:

Lesenswert?

Es lag tatsächlich an den LED`s ich habe jetzt zwar den anderen Knoten 
abgeklemt aber ich denke es muss auch mit dem laufen.
jetz kriege dieses Bild

von Manfred S. (mandinice)


Lesenswert?

Hallo Oli.

Hast Du den Code verwendet den Du in Deiner Anfrage zugefügt hast ?
Sollte der auf einem ATMega64M1 auch funktionieren ?

Meine Aufgabe für nächste Woche wäre nämlich genau dieses.
Wenn ich Deinen Code verwenden dürfte und könnte würde es mir viel 
Arbeit sparen.

hmg
Mandi

von Oli. (Gast)


Lesenswert?

Ich weiss es leider nicht, deas der Quellcode funktioniert weisse ich 
genau weil ich der ich meiner Projektarbeit vor 2 Jahren benutzt habe, 
will aber komischerweise jetzt nicht den Fehler finde aber. Ob es zu 
deinem Controller passt weisse ich nich musst die Register Vergleichen.

von Oli. (Gast)


Lesenswert?

Ja ich habe den selben code benutzt

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.