|
|
Elektronika.lt portalo forumas
Jūs esate neprisijungęs lankytojas. Norint dalyvauti diskusijose, būtina užsiregistruoti ir prisijungti prie forumo.
Prisijungę galėsite kurti naujas temas, atsakyti į kitų užduotus klausimus, balsuoti forumo apklausose.
Administracija pasilieka teisę pašalinti pasisakymus bei dalyvius,
kurie nesilaiko forumo taisyklių.
Pastebėjus nusižengimus, prašome pranešti.
Dabar yra 2025 01 12, 06:01. Visos datos yra GMT + 2 valandos.
|
|
|
|
Forumas » Mikrovaldikliai » Atmega 16 tarpusavio bendravimas per I2C
|
Jūs negalite rašyti naujų pranešimų į šį forumą Jūs negalite atsakinėti į pranešimus šiame forume Jūs negalite redaguoti savo pranešimų šiame forume Jūs negalite ištrinti savo pranešimų šiame forume Jūs negalite dalyvauti apklausose šiame forume
|
|
|
|
|
|
Atmega 16 tarpusavio bendravimas per I2C |
Parašytas: 2016 03 06, 14:37 |
|
|
|
Taigi iškyla problema, jog nuskaitant registrą, jis atsiunčia papildomai kaip duomenys savo adresą o vėliau tik reikiama info.
vergaujančio atmega 16 adresas 4, nuskaitomo registro adresas yra 0, jo siunciamas skaicius yra 65.
su šeimininkaujančiu atmega16 nuskaitymą atlieku taip: startas, nusiunčiu adresą 4 + 0 , vėliau siunčiamas registro adresas 0, pakartotinis startas, nusiunčiu adresą 4 + 1 ir tada gaunu 5 ir tada tik 65 ir niekaip nesuprantu iš kur tas 5?
šeimininko programa:
Kodas: |
int main(void)
{
DDRB=255;
uint8_t registras0r[8]={0,0,0,0,0,0,0,0};
i2c_init();
_delay_ms(5);
i2c_readReg(4, 0, registras0r, 2);
while(1)
{
PORTB=registras0r[1]; // nuskaitant 0 gaunu 5
}
} |
šeimininko biblioteka: https://github.com/g4lvanix/I2C-master-lib
vergo programa:
Kodas: |
int main(void)
{
I2C_init(4);
sei();
while(1)
{
txbuffer[0]=65;
}
} |
vergo biblioteka: https://github.com/g4lvanix/I2C-slave-lib |
|
|
|
|
|
|
Atmega 16 tarpusavio bendravimas per I2C |
Parašytas: 2016 03 07, 16:18 |
|
|
|
aš ne guru, bet ar čia negali būti, jog TWDR registre lieka 5 po i2c_start(devaddr | 0x01)? nes jeigu (devaddr {t.y.4} | 0x01) = 5;
iš datasheeto "TWDR always contains the last byte present on the bus,",
bet nesuprantu kodėl i2c_read_ack(void) nenuresetina pats.
Kodas: |
uint8_t i2c_readReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length)
{
if (i2c_start(devaddr)) return 1;
i2c_write(regaddr);
if (i2c_start(devaddr | 0x01)) return 1;
for (uint16_t i = 0; i < (length-1); i++)
{
data[i] = i2c_read_ack();
}
data[(length-1)] = i2c_read_nack();
i2c_stop();
return 0;
}
|
|
|
|
|
|
|
|
Atmega 16 tarpusavio bendravimas per I2C |
Parašytas: 2016 03 07, 20:24 |
|
|
|
taip adresas gaunasi 5, kadangi irašant siunčiami 8 bitai, iš kurių 7 kaip adresas ir paskutinis kaip įrašymo ar nuskaitymo bitas. Taigi siunciant adresą su įrašymo bitu gaunama 00000100 šiuo atveju adresas 4, o nuskaitant bendras skaicius gaunamas 5 , nes nuskaitymas yra 1: 00000101. Na čia taip tūri būti. Jei aiškiau bus tai gaunu toki atsakyma (nuliukais vienetukais parašysiu): 00000101 00000101 01000001, užuot gaves: 00000101 01000001. Dėl kokios priežasties atmega atsiunčia savo adresą kaip man aktualius duomenys nė neįsivaizduoju |
|
|
|
|
|
|
Atmega 16 tarpusavio bendravimas per I2C |
Parašytas: 2016 03 08, 09:33 |
|
|
|
Saulius18 rašo: |
taip adresas gaunasi 5, kadangi irašant siunčiami 8 bitai, iš kurių 7 kaip adresas ir paskutinis kaip įrašymo ar nuskaitymo bitas. Taigi siunciant adresą su įrašymo bitu gaunama 00000100 šiuo atveju adresas 4, o nuskaitant bendras skaicius gaunamas 5 , nes nuskaitymas yra 1: 00000101. Na čia taip tūri būti. Jei aiškiau bus tai gaunu toki atsakyma (nuliukais vienetukais parašysiu): 00000101 00000101 01000001, užuot gaves: 00000101 01000001. Dėl kokios priežasties atmega atsiunčia savo adresą kaip man aktualius duomenys nė neįsivaizduoju |
siek tiek klysti
0b00000100 yra ne 4, o 2 pagal visus i2c standartus, todel kai naudoji supaprastinta i2c biblioteka, adresa reikia paslinkti per 1 bita kairen
Kodas: |
DWDR=(devaddr<<1)|r_w;
|
nors jei naudoji ta pacia biblioteka tik tarp dvieju atmegu, tai nebesvarbi ta tikroji adresacija, nes klaida abiejose pusese ta pati. |
|
|
|
|
|
|
Atmega 16 tarpusavio bendravimas per I2C |
Parašytas: 2016 03 08, 15:24 |
|
|
|
Saulius18 rašo: |
Dėl kokios priežasties atmega atsiunčia savo adresą kaip man aktualius duomenys nė neįsivaizduoju |
pabandyk laikinai i2c_master.c užrašyti TWDR reikšmę ir pažiūrėk ar kas pasikeitė. Gal tas 5 neateina iš vergo, o lieka masterio registre po kreipimosi į vergą:
Kodas: |
uint8_t i2c_read_ack(void)
{
TWDR = 22; /*ĮTERPK ŠITĄ EILUTĘ, 22 šiaip bet koks teigiamas sveikas sk <=255 */
}
|
Algis teisingai sako, pats nesenai buvau su tuo susidūręs. Keista tik kad daugumas i2c bibliotekų turi šitą klaidą.
dar slave c failte yra TWDR = txbuffer[buffer_address], ar yra galimybė slave išvesti txbuffer[buffer_address] ir buffer_address reikšmes?
Kodas: |
else if( (TWSR & 0xF8) == TW_ST_DATA_ACK ){ // device has been addressed to be a transmitter
// copy data from TWDR to the temporary memory
data = TWDR;
// if no buffer read address has been sent yet
if( buffer_address == 0xFF ){
buffer_address = data;
}
// copy the specified buffer address into the TWDR register for transmission
TWDR = txbuffer[buffer_address];
// increment buffer read address
buffer_address++;
|
|
|
|
|
|
|
|
Atmega 16 tarpusavio bendravimas per I2C |
Parašytas: 2016 03 08, 18:50 |
|
|
|
ta prasme? tx buffer nusistatau pats kokius duomenys siusti, buffer addres tai pat nusistatau. Pas mane parašyta:
tai čia ir nurodau norima gražžinama reikšmę. Na arba gal nelebai klausimo supratau |
|
|
|
|
|
|
Google paieška forume |
|
|
Naujos temos forume |
|
|
FS25 Tractors
Farming Simulator 25 Mods,
FS25 Maps,
FS25 Trucks |
|
ETS2 Mods
ETS2 Trucks,
ETS2 Bus,
Euro Truck Simulator 2 Mods
|
|
FS22 Tractors
Farming Simulator 22 Mods,
FS22 Maps,
FS25 Mods |
|
VAT calculator
VAT number check,
What is VAT,
How much is VAT |
|
LEGO
Mänguköök,
mudelautod,
nukuvanker |
|
Thermal monocular
Thermal vision camera,
Night vision ar scope,
Night vision spotting scope |
|
FS25 Mods
FS25 Harvesters,
FS25 Tractors Mods,
FS25 Maps Mods |
|
Dantų protezavimas
All on 4 implantai,
Endodontija mikroskopu,
Dantų implantacija |
|
FS25 Mods
FS25 Maps,
FS25 Cheats,
FS25 Install Mods |
|
GTA 6 Weapons
GTA 6 Characters,
GTA 6 Map,
GTA 6 Vehicles |
|
FS25 Mods
Farming Simulator 25 Mods,
FS25 Maps |
|
ATS Trailers
American Truck Simulator Mods,
ATS Trucks,
ATS Maps |
|
|
|