prepojenie dvoch atmega16 cez TWI a SPI
Moderátori: psichac, Moderátori
prepojenie dvoch atmega16 cez TWI a SPI
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
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
0
Naposledy upravil/-a fagi v 29 Jan 2018, 13:41, upravené celkom 2 krát.
-
- 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
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.
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í.
Re: prepojenie dvoch atemga16 cez TWI
no ano uart mi treba na komunikaciu taže mas skusit SPI ?
no ano to aj ja viem len ten kod sa neviem vysomarit aky by to v tom vyzeralo na slave
no ano to aj ja viem len ten kod sa neviem vysomarit aky by to v tom vyzeralo na slave
0
Re: prepojenie dvoch atemga16 cez TWI
OT- ďalší, čo má rýchlejšie prsty ako klávesnicu..... oprav si názov témy... č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í.
Ku každému čínskemu výrobku by mali pribaliť jedného číňana, aby som ho mohol nakopať do ....,ked sa to pokazí.
Re: prepojenie dvoch atmega16 cez TWI a SPI
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'
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
Re: prepojenie dvoch atemga16 cez TWI
Ano HW uart mozes mat obsadeny a v tom pripade si naprogramujes SW uart na vhodne piny. Usetris vodice na rozdiel od SPI .fagi napísal:uart už mam obsadený pre daco ine
0
Re: prepojenie dvoch atmega16 cez TWI a SPI
Skus namiesto tohoto
#define SELECT() PORTB &= ~(1 << PB4) /* CS = L */
dat toto
#define SELECT (PORTB &= ~(1 << PB4)) /* CS = L */
a podobne aj na DESELECT
#define SELECT() PORTB &= ~(1 << PB4) /* CS = L */
dat toto
#define SELECT (PORTB &= ~(1 << PB4)) /* CS = L */
a podobne aj na DESELECT
0
-
- 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
tie makrá sú korektné, asi si ich skôr použil než deklaroval.
Toto si asi prehliadol.
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.
Toto si asi prehliadol.
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?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.
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í.
-
- Podobné témy
- Odpovedí
- Zobrazení
- Posledný príspevok
-
- 28 Odpovedí
- 1772 Zobrazení
-
Posledný príspevok od používateľa Victorio
-
- 10 Odpovedí
- 4244 Zobrazení
-
Posledný príspevok od používateľa alexandr
-
- 12 Odpovedí
- 1036 Zobrazení
-
Posledný príspevok od používateľa dufffo
-
- 9 Odpovedí
- 1215 Zobrazení
-
Posledný príspevok od používateľa Edgar
-
- 22 Odpovedí
- 1131 Zobrazení
-
Posledný príspevok od používateľa Rafi87