Gast
#2089966
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.




