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:
Z góry dzięki za pomoc.
Poprawiłem tytuł: https://www.elektroda.pl/rtvforum/topic359208.html
[zumek]
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]