logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[AT90CAN128][C] MAgistrala CAN-błędy w odbieranych danych

Krzysiek_k1984 06 Cze 2008 14:05 3601 1
REKLAMA
  • #1 5219278
    Krzysiek_k1984
    Poziom 13  
    Witam.

    Chciałem wysłać ramkę danych po magistrali jednak ciąg bitów, które odczytuje jest zupełnie inny od tego co chcę wysłać. Już nie mam pomysłów co może być nie tak. Oto kod programu:
    
    #include<avr/io.h>
    #include<compat/deprecated.h>
    #include<avr/interrupt.h>
    #include<util/delay.h>
    
    
    //--------------------------------------------------------
    //---------->>> INICJALIZACJA KONTROLERA CAN <<<----------
    //--------------------------------------------------------
    
    void init_CAN(void)
    {
    	unsigned mob;
    	CANGCON|=0x01;			//reset kontrolera CAN
    	CANGCON|=0x00;			//wyłączenie kontrolera CAN
    	CANBT1=0x02;			//Tbit = 20 TQ -> (Tprs=8)+(Tph1=6)+(Tph2=5)+1 - czas 1 bitu trwa 20 Time Quantum
    	CANBT2=0x0E;			//pdf. Atmel str. 267
    	CANBT3=0x4B;
    	for(mob=0;mob<15;mob++)	//czyści wszystkie moby
    	{
    		CANPAGE=(mob<<4);	//przesunięcie wartości "mob" w lewo o 4 pozycje
    		CANSTMOB=0x00;		//wyzerowanie flag przerwań -> inicjalizacja
    		CANCDMOB=0x00;		//ustawienie na 00 -> inicjalizacja
    	}
    	CANTCON=0x00;			//preskaler dla CAN'a ustawiony na 0
    	CANGCON|=0x02;			//tryb CAN aktywny
    }
    
    
    //---------------------------------------------------------
    //---------->>> WYSŁANIE DANYCH NA MAGISTRALĘ <<<----------
    //---------------------------------------------------------
    
    void TxCAN_20A(char nr_mob, unsigned idt, char dlc, char *dane)
    {
    	unsigned char i;
    
    	CANPAGE=nr_mob<<4;		//ustawienie numeru MOb'a
    	CANSTMOB=0x00;			//zeruje flagi przerwań
    	CANCDMOB=0x00;			//dezaktywacja MOb'a - bit 4 IDE na 0 -> CAN 2.0A
    
    	CANIDT2=(idt<<5)&0xE0;	//3 bity -> IDT0, IDT1, IDT2
    	CANIDT1=(idt>>3)&0xFF;	//8 bitów -> od IDT3 do IDT10
    	CANIDT3=0x00;
    	CANIDT4=0x00;			//RTRTAG -> 0 - ramka danych
    
    	CANIDM2=(idt<<5)&0xE0;	//CANIDM ustawiam tak samo jak CANIDT
    	CANIDM1=(idt>>3)&0xFF;
    	CANIDM3=0x00;
    	CANIDM4=0x00;			//RTRMSK ->0 wartość RTR jest ignorowana
    
    	for(i=0; i<dlc; i++)	//wpisanie danych do rejestru
    	CANMSG=dane[i];
    
    	CANCDMOB|=dlc|(1<<CONMOB0);	//ustawia ilość danych w ramce oraz aktywuje transmisję
    
    }
    
    
    int main()
    
    {
    	init_CAN();
    	TxCAN_20A(1,2,6,"dziala");
    
    	while (1)
    	{
    	}
    	return 0;
    }
    
    

    Z góry dzięki za pomoc.


    Poprawiłem tytuł: https://www.elektroda.pl/rtvforum/topic359208.html
    [zumek]
  • REKLAMA
  • #2 5223730
    Krzysiek_k1984
    Poziom 13  
    Sorki jednak wszystko działa poprawnie. Obserwowałem bit po bicie wysłany na magistralę i wszystko jest ok:) Zapomniałem po prostu, że magistrala CAN wysyła po 5 jednakowych bitach bit szpikujący o przeciwnej wartości. To właśnie przez niego nic mi nie pasowało:)
REKLAMA