mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik CAN-BUS Problem


Autor: Oli. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: mani (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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!!!

Autor: Oli. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich bitte um Entschuldigung, was ist denn jetzt mit kann mir keiner 
helfen???????

Autor: mani (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

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

Grüße
Mani

Autor: mani (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast DU eigentlich die beiden Abschlusswiderstände drin?

Autor: Knilch (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: mani (Gast)
Datum:

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

Autor: mani (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Können die LEDs am Ausgang einen Einfluss haben?

Autor: Knilch (Gast)
Datum:

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

Autor: tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Oli. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Oli. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Manfred Schön (mandinice)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Oli. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Oli. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja ich habe den selben code benutzt

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.