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.
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!!!
ich bitte um Entschuldigung, was ist denn jetzt mit kann mir keiner helfen???????
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
@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.
Der ist oben schon als DocX drin...der Widerstand scheint drin zu sein, der Wert steht nicht dran...
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.
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
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.
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
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.