Skocz do zawartości

[C] Atmega8 SPI MCP3208


Amistar

Pomocna odpowiedź

Witam. Próbuje zmusić Atmege8 do działania z MCP3208

Atmega jest wyposażona w peryferia które działają: wyświetlacz lcd, 3 diody led...

Programuje go przez ISP które po programowaniu odpinam i obserwuje próby użycia SPI

$regfile = "m8def.dat"
$crystal = 1000000
$hwstack = 32
$swstack = 10
$framesize = 40

Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portd.2 , Db6 = Portd.7 , Db7 = Portd.3 , E = Portd.1 , Rs = Portd.0
Config Lcd = 20 * 2
Cursor Off

Config Portc.3 = Output  'diody led
Config Portc.4 = Output
Config Portc.5 = Output
Portc.3 = 1
Portc.4 = 1
Portc.5 = 1


Dim A As Byte
A = &B11000000
Dim B(2) As Byte


Config Spi = Hard , Data Order = Msb , Master = Yes , Polarity = High , Clockrate = 4 , Noss = 1
Enable Spi
Spiinit

Do

Spiout A , 1
Spiin B(1) , 2

Cls
Waitms 500 'czekam by zaobserwować czy procek tu doszedł, objawem jest czysty wyswietlacz
Lcd B(1)
Lcd " "
Lcd B(2)
Wait 1

Loop

Chcę odczytać stan CH0 z MCP3208. Pierwszy bit to bit startu (1) a potem bit typu odczytu (1) oraz kanału (00) reszta się nie liczy (0000) stąd &b11000000

Połaczyłem piny:

SS -> CS

MOSI -> DIN

MISO -> DOUT

SCK -> CLK

Dodam że przed chwilą zauważyłem że linia SS - CS mogła by być podciągnięta do plusa zasilania....

Próbowałem wielu kodów z internetu i mieszałem po kilka na raz, ale nic z tego nie wychodzi. Cały czas pokazują mi się wartości 255 bądź 0. Przy powyższym kodzie tylko 0

Dodam też że przy używaniu dyrektywy $baud której używała połowa programistów bascom isp przestawał działać wyświetlacz lcd - piny enable i rs są podłączone do pinów UARTa w procku...... Stąd też nie używam tej dyrektywy.

Link do komentarza
Share on other sites

Przeanalizuj sobie notę katalogową MCP3208 . Jest tam rozdział "Using the MCP3204/3208 with Microcontroller (MCU) SPI Ports ", gdzie jest opisana ramka komunikacyjna.

Ogólnie wg. diagramów z noty komunikacja z tym układem wymaga 24-bitowego słowa, gdzie niejako pierwsze 12 bit konfiguruje układ, a następne odczytywane 12 bit to właśnie wynik.

IMG_4e549058326bc2437.jpg

Wynika z tego że tego układu tak łatwo nie da się obsłużyć, przynajmniej nie z marszu, a to dlatego że pewne dane zachodzą na siebie, szczególnie w 2 wysyłanym bajcie, gdzie w buforze odczytu pojawia się bajt MSB wyniku. Najlepiej byłoby zdefiniować sobie własne procedury/funkcje.

  • Pomogłeś! 1
Link do komentarza
Share on other sites

No cóż, pomoc nie była duża, ale zainspirowała mnie do wgłębienia się w C.

Jestem na przemian zachwycony elastycznością języka i zirytowany trudną składnią, ale cóż to dopiero drugi dzień programowania. Ciesze się, że wstąpiłem na dobrą drogę zawodową. C rządzi 🙂

Uruchomiłem już i LCD i SPI.

MCP3208 spisuje się świetnie, zadawala mnie jego odporność na zakłócenia.

///////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Inicjalizacja
DDRB |= 0x2C; //ustawienie kierunku bitow portu
SPCR = _BV(SPE) | _BV(MSTR) | _BV(SPR1); 
SS_WYSOKI(); //stan wysoki na SS
// Koniec inicjalizacji
///////////////////////////////////////////////////////////////////////////////////////////////////////////



//***********************************************
// Odczytanie Kanału 4
//***********************************************
     SS_NISKI(); // stan niski na SS
     SPDR = 0x07;
     while(!(SPSR & (1<<SPIF)));
     danaH = SPDR;
     SPDR = 0x00;
     while(!(SPSR & (1<<SPIF)));
     danaH = SPDR; // MSB danych
     SPDR = 0x00;
     while(!(SPSR & (1<<SPIF)));
     danaL = SPDR; // LSB danych
     SS_WYSOKI(); // stan wysoki na SS
//***********************************************
//***********************************************	  

/* edit nie dawno pisałem o problemie z define jakie mam przy pisaniu pierwszej w życiu biblioteki 😉 zastąpiłem define tablicą. */

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.