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

Jak zbudować urządzenie z CAN w BASCOMie na procesorze z wbudowanym CAN?

lukaszg99 11 Gru 2006 12:20 6106 9
REKLAMA
  • #1 3318791
    lukaszg99
    Poziom 10  
    Posty: 27
    Mam napisać prace dyplomowa o CANie z wiedza czysto teorytyczna nie bede mial problemu
    ALE!!! musze jeszcze zrobic urzadzenie pokazujace dzialanie szyny
    najlepiej żebym mogl zczytywac i cos zasterowac myslalem ze moze da sie zrobic cos na prockach
    mających w sobie wbudowany CAN tylko nie wiem jak to zrobić w BASCOMie
    znam tez trochę C++ ale wolałbym BASCOMa!!!

    Proszę o pomoc!!!
    BARDZO PILNE

    MOZE KTOS MA GOTOWY PROJEKT?!
    To jakoś się dogadamy!!!

    :?::?::?::?::?::?::?::?::?:
  • REKLAMA
  • #3 3324229
    piti___
    Poziom 23  
    Posty: 623
    Pomógł: 67
    Ocena: 9
    Witam

    Robie aktualnie projekt z CANa, plytka + oprogramowanie prockow PIC18F2680 + MCP2551. Obsluga CANa jest bardzo prosta, wypelnienie rejestrow konfiguracyjnych i dziala.

    W wersji podstawowej 2x RX_Buffer , 3x TX_Buffer, 5 filtrow, 2 maski.
    Wiecej w datasheet....
  • REKLAMA
  • #4 3325125
    maniio
    Poziom 14  
    Posty: 149
    Pomógł: 3
    Ocena: 9
    jak kolega mysli ze teorie CAN opanuje bardzo szybko to sie myli... Zeby wysterowac czym kolwiek z CAN to nie takie proste jak tu koledzy pisza... Zastanow sie najpierw co chcesz wysterowac.
    Najlatwiej byloby jakbys zrobil dwa uklady z CAN i komunikacje midzy nimi. na jednym i drugim ukladzie wyswietlacz LCD i jakas klawiaturka i bylo by OK.

    na poczatek poczytaj sobie to, moze ci pomoze. W BASCOM nie ma gotowych instrukcji do CAN

    http://www.elektronik.zst.edu.pl/files/can1.pdf
    http://www.elektronik.zst.edu.pl/files/can2.pdf
    http://www.elektronik.zst.edu.pl/files/can3.pdf
    http://www.elektronik.zst.edu.pl/files/can4.pdf
    http://www.elektronik.zst.edu.pl/files/can5.pdf
  • REKLAMA
  • #5 3327598
    lukaszg99
    Poziom 10  
    Posty: 27
    Co do wypowiedzi kolegi ze CANa szybko nie opanuje to sie myli poniewaz bardzo czesto spotykam sie
    z CANem w pracy dlatego wybralem taki temat pracy dyplomowej tylko teraz potrzebuje pomocy zeby zrobic
    urzadzenie z uP np AT90S8535 komunikującym się z MCP2515 (majacym w sobie CAN) za pomocą SPI
    Program miałby czytać informacje z CANa i coś zasterować np diody, odczytac temp itp....

    :arrow::arrow::arrow::|:arrow::arrow::arrow:
  • #6 3327632
    maniio
    Poziom 14  
    Posty: 149
    Pomógł: 3
    Ocena: 9
    Co do wypowiedzi kolegi ze MCP ma CAN, to jednak domniemam ze duzego doswiadczenia z CAN nie masz... MCP to tylko kontroler, a to ze odczytasz to przez SPI to fajnie, ale trzeba jeszcze opanowac protokol transmisji... a z tym jest najwiekszy problem nie ze zrobiniem ukladu. Proponowalbym mimo wszytsko zainwestowanie i zaopatrzenie sie w uklad AT90CAN128 i do tego uklad PCA82C251T bedzie ci ciut latwiej, ale tylko "ciut"
  • REKLAMA
  • #7 3328720
    piti___
    Poziom 23  
    Posty: 623
    Pomógł: 67
    Ocena: 9
    Doglebne opanowanie protokolu nie jest konieczne, najlepiej wykorzystac uC z wbudowanym kontolerem CAN niz dodatkowo komplikowac i korzystac z zew kontorlerow.

    w PICach kazdy rejestr CANa jest w mapie pamieci procka. Tak wyglada konfiguracja CANa w moim projekcie:

    
    void InitCAN()
    {
    	PIE3 = 0; PIR3 = 0; // clear all CAN interrupt flags
    	// zaladuj bajt konfiguracyjny z eepromu
    	config_byte = read_eeprom(CONFIG_BYTE_ADDR,HI_ADDR);
    
    	// request configuration mode
    	CANCON = 0b10000000;
    	// czy juz jest w conf mode ?	
    	while ( (CANSTAT & 0xE0) != 0x80);
    	
    	ECANCON = 0x00;	// mode 0
    
    	// wczytaj ID0
    	ID0H = read_eeprom(ID0H_ADDR,HI_ADDR);
    	//	TXB0SIDH = ID0H;
    	ID0L = (0b11100000 & read_eeprom(ID0L_ADDR,HI_ADDR));	
    	//	TXB0SIDL = ID0L;
    
    	// wczytaj ID0
    	ID1H = read_eeprom(ID1H_ADDR,HI_ADDR);
    	// 	TXB1SIDH = ID1H;
    	ID1L = (0b11100000 & read_eeprom(ID1L_ADDR,HI_ADDR));
    	// 	TXB1SIDL = ID1L;
    	
    	// receive buffer 0 control register
    	RXB0CON |= 0b00100000;
    	// receive buffer 1 control register
    	RXB1CON |= 0b00100000;
    	// odbieraj tylko poprawne pakiety z 11 bitowym ident
    	
    	//---------- laduj filtry ---------
    	RXF0SIDH = read_eeprom(RXF0H_ADDR,HI_ADDR);
    	RXF0SIDL = (0b11100000 & read_eeprom(RXF0L_ADDR,HI_ADDR));
    	RXF1SIDH = read_eeprom(RXF1H_ADDR,HI_ADDR);
    	RXF1SIDL = (0b11100000 & read_eeprom(RXF1L_ADDR,HI_ADDR));
    	RXF2SIDH = read_eeprom(RXF2H_ADDR,HI_ADDR);
    	RXF2SIDL = (0b11100000 & read_eeprom(RXF2L_ADDR,HI_ADDR));
    	RXF3SIDH = read_eeprom(RXF3H_ADDR,HI_ADDR);
    	RXF3SIDL = (0b11100000 & read_eeprom(RXF3L_ADDR,HI_ADDR));
    	RXF4SIDH = read_eeprom(RXF4H_ADDR,HI_ADDR);
    	RXF4SIDL = (0b11100000 & read_eeprom(RXF4L_ADDR,HI_ADDR));
    	RXF5SIDH = read_eeprom(RXF5H_ADDR,HI_ADDR);
    	RXF5SIDL = (0b11100000 & read_eeprom(RXF5L_ADDR,HI_ADDR));
    
    	//---------- laduj maski ---------
    	if(config_byte & 0x04)
    	{
    		RXM0SIDH = read_eeprom(MASK0H_ADDR,HI_ADDR);
    		RXM0SIDL = (0b11100000 & read_eeprom(MASK0L_ADDR,HI_ADDR));
    	}
    	else
    	{
    		RXM0SIDH = 0x00;
    		RXM0SIDL = 0x00;
    	}
    
    	if(config_byte & 0x08)
    	{
    	RXM1SIDH = read_eeprom(MASK1H_ADDR,HI_ADDR);
    	RXM1SIDL = (0b11100000 & read_eeprom(MASK1L_ADDR,HI_ADDR));
    	}
    	else
    	{
    		RXM1SIDH = 0x00;
    		RXM1SIDL = 0x00;
    	}
    
    
    	//---------- ustaw baud rate
    	//---------- Fosc = 40MHz
    	//---------- BRP = 8
    	//---------- Tq = 0.4us
    	//---------- Tbit = 10*Tq = 4us ~ 250kb
    
    	BRGCON1 = 0b01001000;	// Sync jump width time = 2 x Tq BRP = 8
    	BRGCON2 = 0b00010010;	
    	//	BRGCON3 = 0b00000000; // default
    	CIOCON = 0xFF;
    	//----------- CAN INTERRUPT REG
    	InitCAN_interrupt();
    }
    


    Odczytanie danych mozna zrobic nawet tak:
    
    if(RXB0CONbits.RXFUL)
    				{	
    					
    					ID = (RXB0SIDL >> 5) & 0x07;
    					ID |= (WORD)RXB0SIDH << 3;
    
    					if(config_byte & 0x10)
    					{
    						sprintf(Print_buf,(ROM char *)"\t| RX0 received msg.\r\n\t|\r\n\t"
    						"| ID:\r\n\t| DEC:%u\tHEX:%x\tBIN:%b\r\n",ID,ID,ID);
    						ConsolePutString((BYTE *)Print_buf);
    						// kopiuj wszystki dane do bufora i sprawdz ile danych bylo w pakiecie
    						RX0data[0] = RXB0D0;
    						RX0data[1] = RXB0D1;
    						RX0data[2] = RXB0D2;
    						RX0data[3] = RXB0D3;
    						RX0data[4] = RXB0D4;
    						RX0data[5] = RXB0D5;
    						RX0data[6] = RXB0D6;
    						RX0data[7] = RXB0D7;
    
    							sprintf(Print_buf,(ROM char *)"\t| %u bajtow danych.\r\n\t| DATA: ",(RXB0DLC & 0x0F));
    							ConsolePutString((BYTE *)Print_buf);
    
    						for(i = 0; i <  (RXB0DLC & 0x0F); i++)
    						{
    							sprintf(Print_buf,(ROM char *)"%x ",RX0data[i]);
    							ConsolePutString((BYTE *)Print_buf);
    						}
    							RXB0CONbits.RXFUL = 0;
    							ConsolePutROMString( (ROM char *)"\r\n\r\n");
    
    					}
    				}
    



    Fajna rzecza w PICach jest jeszcze tryb w debugowania CANa wyslany pakiet moze byc odebrany jakby przyszedl z sieci (bez czekania na ACK)
  • #9 3330764
    Rysiek_W
    Poziom 12  
    Posty: 27
    Ocena: 2
    Również polecam AT90CAN128 do tego PCA82C250 (lub ATA6660), poza tym darmowe narzędzia i duzo przykładów w necie (biblioteki WINAVR).
  • #10 3333656
    seba240
    Poziom 11  
    Posty: 41
    Ocena: 1
    witam,
    ja polecam at90can128 i TJA1041 jako CAN Transceiver, dziala bardzo dobrze...
    ewentualnie motorola HC12

    pozdrawiam
    sebastian
    ps. jezeli masz dostep do CANoe firmy Vector to potrzebujesz zbudowac tylko jedna plytke i komunikowac sie z PCtem przez CAN. Albo zrobic UART-CAN----CAN-UART i polaczyc 2 PCty ze soba

Podsumowanie tematu

✨ Dyskusja dotyczy budowy urządzenia z interfejsem CAN na procesorze z wbudowanym kontrolerem CAN, programowanego w BASCOMie. Autor pracy dyplomowej poszukuje rozwiązania umożliwiającego odczyt i sterowanie za pomocą magistrali CAN, preferując BASCOM, choć zna też C++. Wskazano, że BASCOM nie posiada gotowych instrukcji do CAN, dlatego zaleca się użycie mikrokontrolerów z wbudowanym kontrolerem CAN, co upraszcza implementację w porównaniu do zewnętrznych kontrolerów SPI, takich jak MCP2515. Przykłady i dokumentacje do nauki protokołu CAN zostały udostępnione. Polecane są mikrokontrolery Atmel z serii AT90CAN128, które mają wbudowany kontroler CAN, a także transceivery CAN, np. PCA82C251, PCA82C250, TJA1041 lub ATA6660. Wspomniano również o alternatywnych rozwiązaniach z procesorami PIC18F2680 z MCP2551. Podkreślono, że opanowanie protokołu CAN wymaga zrozumienia konfiguracji rejestrów i transmisji, ale dostępne są darmowe narzędzia i biblioteki (np. WINAVR) oraz przykłady projektów. Sugerowano budowę dwóch układów CAN komunikujących się ze sobą, np. z wyświetlaczami LCD i klawiaturami, aby pokazać działanie magistrali. Wskazano także na możliwość wykorzystania oprogramowania CANoe firmy Vector do testów i komunikacji z PC.
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA