Witam.
Nie potrafię poradzić sobie z takim problemem. Chciałem zamienić liczbę BIN na DEC, ale coś mi nie wychodzi. Problem polega na tym, że te bity wysyłane są po magistrali CAN, a dokładniej chodzi o bity DLC w polu sterującym (DLC0 - najmłodszy bit). Zczytuje je i dzięki nim obliczę ile bajtów będzie zawierało następne pole z danymi. Dodatkowym problemem jest fakt, że jeśli na magistrali CAN wystąpi po sobie 5 identycznych bitów to ciąg bitów uzupełniany jest bitem szpikującym o przeciwnej wartości. Nie jest on później brany pod uwagę przez uC. Tak więc jeśli w polu arbitrażu wystąpiły np. 3 bity dominujące ('0'), w polu sterującym bity IDE i r0 też będą dominujące to "kod długości danych" nie będzie 4, ale 5 bitowy. Ten 1 bit nie będzie brany pod uwagę. Napisałem taki program, ale niestety błędnie zamienia on na DEC. Proszę więc o pomoc.
ramka_CAN[CAN_bit] - bit jaki znajduje się w danej chwili na magistrali
Nie potrafię poradzić sobie z takim problemem. Chciałem zamienić liczbę BIN na DEC, ale coś mi nie wychodzi. Problem polega na tym, że te bity wysyłane są po magistrali CAN, a dokładniej chodzi o bity DLC w polu sterującym (DLC0 - najmłodszy bit). Zczytuje je i dzięki nim obliczę ile bajtów będzie zawierało następne pole z danymi. Dodatkowym problemem jest fakt, że jeśli na magistrali CAN wystąpi po sobie 5 identycznych bitów to ciąg bitów uzupełniany jest bitem szpikującym o przeciwnej wartości. Nie jest on później brany pod uwagę przez uC. Tak więc jeśli w polu arbitrażu wystąpiły np. 3 bity dominujące ('0'), w polu sterującym bity IDE i r0 też będą dominujące to "kod długości danych" nie będzie 4, ale 5 bitowy. Ten 1 bit nie będzie brany pod uwagę. Napisałem taki program, ale niestety błędnie zamienia on na DEC. Proszę więc o pomoc.
//oblicza długość pola danych z bitów DLC w polu sterującym
if(CAN_bit>(14+i && CAN_bit<=(18+i)))//pomija bity IDE i r0
{
unsigned char suma_DLC=1; //wartość z 4 bitów DLC
unsigned char bit=3; //4 bity DLC - od 2^3 od 2^0
//sprawdza czy bit nie jest bitem szpikującym
if((ramka_CAN[CAN_bit-1]+ramka_CAN[CAN_bit-2]+ramka_CAN[CAN_bit-3]+ramka_CAN[CAN_bit-4]+ramka_CAN[CAN_bit-5]!=0) ||(ramka_CAN[CAN_bit-1]+ramka_CAN[CAN_bit-2]+ramka_CAN[CAN_bit-3]+ramka_CAN[CAN_bit-4]+ramka_CAN[CAN_bit-5]!=5))
{
if(ramka_CAN[CAN_bit]==1) //jeżeli bit recesywny
{
char j;
suma_DLC=1;
for(j=1;j<=bit;j++) //potęgowanie liczby 2 w celu
suma_DLC=suma_DLC*2; //obliczenia liczby bajtów danych
}
bit--;
}
CAN_data=(suma_DLC*8); //ilość bitów w polu danych
}
ramka_CAN[CAN_bit] - bit jaki znajduje się w danej chwili na magistrali