prepojenie dvoch atmega16 cez TWI a SPI

Všetko čo sa týka mikropočítačov + Sekcia Arduino

Moderátori: psichac, Moderátori

fagi
Stály člen
Stály člen
Príspevky: 110
Dátum registrácie: 23 Máj 2015, 18:09

prepojenie dvoch atmega16 cez TWI a SPI

Príspevok od používateľa fagi » 28 Jan 2018, 15:15

zdravím :) no

chcem spravit komunikaciu dvoch atmega16 cez TWI studoval som toto https://svetelektro.com/clanky/programu ... t-539.html

a no a ale aj tak neviem jak nato, ta knižnica co je tam napísana je len na master ? a ako by to vyzeral kod na strane slave
vlastne jednine čo chcem j toto: 1. atmega posiela 2 hodnoty premenných a druha ich príme a spracuje to je všetko, vysielat budem každých 100ms to je všetko :D
0
Naposledy upravil/-a fagi v 29 Jan 2018, 13:41, upravené celkom 2 krát.

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: prepojenie dvoch atemga16 cez TWI

Príspevok od používateľa peterple » 28 Jan 2018, 17:47

Slave na MCU málokto rieši. Také úlohy ako chceš robiť sa najjednoduchšie riešia UARTom. Ale ten asi potrebuješ na komunikáciu s PC ako debugger. Potom je ďalší vhodný kandidát SPI a až úplne nakoniec TWI.
Funguje to tak že si nakonfiguruješ TWI ako slave, nastavíš adresu, povolíš prerušenie a čakáš. Keď príde správna adresa, tak ťa to preruší a podľa toho či sa číta alebo zapisuje treba zareagovať. Treba čítať DS.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

fagi
Stály člen
Stály člen
Príspevky: 110
Dátum registrácie: 23 Máj 2015, 18:09

Re: prepojenie dvoch atemga16 cez TWI

Príspevok od používateľa fagi » 28 Jan 2018, 19:10

no ano uart mi treba na komunikaciu :D taže mas skusit SPI ? :D
no ano to aj ja viem len ten kod sa neviem vysomarit aky by to v tom vyzeralo na slave :pain:
0

Dumitru
Stály člen
Stály člen
Príspevky: 377
Dátum registrácie: 06 Nov 2011, 22:19
Vek: 32

Re: prepojenie dvoch atemga16 cez TWI

Príspevok od používateľa Dumitru » 28 Jan 2018, 19:19

Skus pozrieť <util/twi.h>
0

m6r3k
Stály člen
Stály člen
Príspevky: 133
Dátum registrácie: 29 Júl 2013, 21:16
Vek: 31

Re: prepojenie dvoch atemga16 cez TWI

Príspevok od používateľa m6r3k » 28 Jan 2018, 19:56

Skus si nastudovat sw uart ;)
0

fagi
Stály člen
Stály člen
Príspevky: 110
Dátum registrácie: 23 Máj 2015, 18:09

Re: prepojenie dvoch atemga16 cez TWI

Príspevok od používateľa fagi » 28 Jan 2018, 20:27

uart už mam obsadený pre daco ine
0

Používateľov profilový obrázok
5ko
Power user
Power user
Príspevky: 10149
Dátum registrácie: 18 Feb 2010, 00:00
Vek: 68

Re: prepojenie dvoch atemga16 cez TWI

Príspevok od používateľa 5ko » 28 Jan 2018, 21:29

OT- ďalší, čo má rýchlejšie prsty ako klávesnicu..... oprav si názov témy... :wink: čo je to atemga?
0
Lenivosť je matka pokroku.Lenivý človek rozmýšla,ako by si robotu uľahčil a tak niečo vynájde.
Ku každému čínskemu výrobku by mali pribaliť jedného číňana, aby som ho mohol nakopať do ....,ked sa to pokazí.

fagi
Stály člen
Stály člen
Príspevky: 110
Dátum registrácie: 23 Máj 2015, 18:09

Re: prepojenie dvoch atmega16 cez TWI a SPI

Príspevok od používateľa fagi » 29 Jan 2018, 13:49

takže po celkovom zvážení som sa rozhodol že namiesti I2C tie atmegy spojím SPI takže master https://svetelektro.com/clanky/programu ... t-528.html
strana funguje vysuela ale zas je otázka ako upravím tu knižnicu na slave ?


v hlavnom programe som dal na prerušenie od spi toto:

ISR(SPI_STC_vect){
SELECT();
data = ReadByteSPI();
DESELECT();

v subore spi.c som upravil funkciu init

void InitSPI(void){

SPI_PORT |= (1<<DD_MISO);

SPI_PORT &= ~(1<<DD_SS);

SPI_DDR &= ~ (1<<DD_MISO);
SPI_DDR |= (1<<DD_MOSI) | (1<<DD_SCK) | (1<<DD_SS);
//nastavenie funkcneho registra SPI (SPCR), CPHA a CPOL v log 0
SPCR |= (1<<SPE) | (1<<SPIE) | (1<<SPR1);
SPCR &= ~ (1<<DORD);
SPCR &= ~ (1<<MSTR);

}


a spi.h zmenil piny na megu16



void InitSPI(void);
void WriteByteSPI(unsigned char byte);
unsigned char ReadByteSPI(void);

#define DD_SS PB4
#define DD_MOSI PB5
#define DD_MISO PB6
#define DD_SCK PB7
#define SPI_DDR DDRB
#define SPI_PORT PORTB

#define SELECT() PORTB &= ~(1 << PB4) /* CS = L */
#define DESELECT() PORTB |= (1 << PB4) /* CS = H */




no a ale mi hadze chyby:

Warning 1 implicit declaration of function 'SELECT'
Warning 2 implicit declaration of function 'ReadByteSPI'
Warning 3 implicit declaration of function 'DESELECT'

Error 5 undefined reference to `SELECT'
Error 6 undefined reference to `DESELECT'
0

m6r3k
Stály člen
Stály člen
Príspevky: 133
Dátum registrácie: 29 Júl 2013, 21:16
Vek: 31

Re: prepojenie dvoch atemga16 cez TWI

Príspevok od používateľa m6r3k » 29 Jan 2018, 14:34

fagi napísal:uart už mam obsadený pre daco ine
Ano HW uart mozes mat obsadeny a v tom pripade si naprogramujes SW uart na vhodne piny. Usetris vodice na rozdiel od SPI .
0

dan21
Ultimate člen
Ultimate člen
Príspevky: 3016
Dátum registrácie: 11 Apr 2007, 00:00
Bydlisko: ZA

Re: prepojenie dvoch atmega16 cez TWI a SPI

Príspevok od používateľa dan21 » 29 Jan 2018, 14:48

Skus namiesto tohoto
#define SELECT() PORTB &= ~(1 << PB4) /* CS = L */

dat toto
#define SELECT (PORTB &= ~(1 << PB4)) /* CS = L */

a podobne aj na DESELECT
0

fagi
Stály člen
Stály člen
Príspevky: 110
Dátum registrácie: 23 Máj 2015, 18:09

Re: prepojenie dvoch atmega16 cez TWI a SPI

Príspevok od používateľa fagi » 29 Jan 2018, 14:55

zatial to chcem skusit skusim s SPI
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: prepojenie dvoch atmega16 cez TWI a SPI

Príspevok od používateľa peterple » 29 Jan 2018, 19:11

tie makrá sú korektné, asi si ich skôr použil než deklaroval.
Toto si asi prehliadol.
b) v Slave móde:

Ak je rozhranie SPI nastavené na režim SLAVE, potom pin SS bude vždy vstupný. Pokiaľ privedieme pin SS do stavu log. 0, aktivujeme SPI rozhranie. V opačnom prípade je rozhranie SPI neaktívne a nie je možné prijať žiadne dáta.
Ten tvoj slave nemá čo povolovať a zakazovať SS. Teda je to úplne zbytočné. Tým že si povolil SPI ako Slave tak je vo vstupnom režime a nejaké cvičenie s výstupnou hodnotou naň nemá vplyv. To si si predstavoval že sám sebe si to SS dá Slave do L? Kedy?
To je naivné akože povoliť SPI v prerušení od prijatia znaku cez SPI. Ako by si sa tam asi dostal, to by najprv musel prísť znak. Ak SS je v jednotke tak SPI v Slave nepracuje - neprijíma.

V prvom rade by to teda asi chcelo aby si si nakreslil schému ako to bude zapojené a potom poriadne prečítať DS alebo tú zawinovu stránku o SPI. Alebo googlit a googlit až nájdeš hotové riešenie.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Napísať odpoveď
  • Podobné témy
    Odpovedí
    Zobrazení
    Posledný príspevok