 |

|
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 07 09, 16:03. Visos datos yra GMT + 2 valandos.
|
|
|
 |
Forumas » Mikrovaldikliai » Išorinis EEPROM
|
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
|
|
|
Puslapis 1 iš 2 Pereiti prie 1, 2 Toliau |
|
 |
 |
 |
Išorinis EEPROM |
Parašytas: 2006 01 30, 15:29 |
|
|
|
Na štai vidinio EEPROM panaudojimą forumo dalyvių pagalba įvaldžiau, dabar noras pajungti ir išorinį.
Pradžiai norėčiau išmokti elgtis su 24Cxx EEPROM. Jungsiu prie Atmega8515.
Kiek išsiaiškinau galimi du jungimo variantai, tai aparatinis TWI ir programinis I2C. Kadangi Atmega 8515 aparatinio TWI neturi, lieka pasinaudoti programiniu I2C. Pirmiausiai domina, kaip sukurti failą, kurį reikės įrašyti į EEPROM ir kokį soft'ą tam naudoti. Sakykim, norėsiu įrašyti tokius duomenis, kurie dabar sąlyginai yra vidiniame EEPROM:
eeprom testas1[]="Vienas";
eeprom testas2[]="Du";
....
eeprom testas10[]="Desimt";
Antras klausimas, kaip įrašyti tą pagamintą failiuką į EEPROM. Domina ar galima įrašyti, kai EEPROM pajungtas prie AVR'o. Dabar naudoju PonyProg2000 ir programerį iš http://www.elektronika.lt/schematic/theme/67/21/. Tikriausiai reikalingas būtų kažkoks loaderis, kurį reiktų pirmiau perkelti į AVR'ą, o paskui jau reikiamą failą į EEPROM. Bet ar tą galima realizuoti turimom priemonėm?
Kitas klausimas ar galima ant tų pačių AVR kontrolerio išvadų pajungti RTC DS1307 ir EEPROM. Abu jungiami per I2C.
Na ir paskutinis klausimas, kaip realizuoti duomenų nuskaitymą ir rašymą su CodeVisionAVR C kompileriu.
Na va, nepasikuklinau, labai daug paklausiau, tikiuosi padėsite susigaudyti:) |
|
|
|
|
 |
 |
Re: Išorinis EEPROM |
Parašytas: 2006 01 30, 16:07 |
|
|
|
Citata: |
Antras klausimas, kaip įrašyti tą pagamintą failiuką į EEPROM. Domina ar galima įrašyti, kai EEPROM pajungtas prie AVR'o. Dabar naudoju PonyProg2000 ir programerį iš http://www.elektronika.lt/schematic/theme/67/21/. Tikriausiai reikalingas būtų kažkoks loaderis, kurį reiktų pirmiau perkelti į AVR'ą, o paskui jau reikiamą failą į EEPROM. Bet ar tą galima realizuoti turimom priemonėm?
|
Siaip korektiskai veikianti programa pati turetu susirasyti pradinius inicializavimo duomenis i eeproma
Citata: |
Kitas klausimas ar galima ant tų pačių AVR kontrolerio išvadų pajungti RTC DS1307 ir EEPROM. Abu jungiami per I2C.
|
Galima.Tam naudojama adresacija i2c irenginiu. |
|
|
|
|
 |
 |
Išorinis EEPROM |
Parašytas: 2006 01 30, 16:37 |
|
|
|
Nelabai įsivaizduoju, kaip PonyProg2000 programa gali atsirinkti, koks EEPROM prie Atmega8515 prijungtas. Atmega su programeriu šnekasi MOSI, MISO, SCK ir Reset išvadais, o EEPROM prijungtas prie kokio nors PORTB.0 (SCL) ir PORTB.1 (SDA)? Ar aš čia visai grybauju? |
|
|
|
|
 |
Išorinis EEPROM |
Parašytas: 2006 01 30, 17:11 |
|
|
|
Cia jis turejo omenyje, kad vidini isiraso. O isorinis rasomas atskirai su kitu programeriu. Arba programos vykdymo metu
Vienas is variantu: http://www.lancos.com/prog.html#ludipipo
Nebandziau negaliu daugiau nieko apie ji pasakyti. |
|
|
|
|
 |
Išorinis EEPROM |
Parašytas: 2006 01 30, 17:23 |
|
|
|
Su ludipipo viskas ten aišku. Norisi šiek tiek universalesnio būdo, kad nereikėtų EEPROM iš schemos išlupinėti ir atskirai programuoti:) |
|
|
|
|
 |
 |
Išorinis EEPROM |
Parašytas: 2006 01 31, 14:46 |
|
|
|
Matau, kad per daug paklausiau:). Nelabai kas nori patirtimi dalintis:(
Pamėginsiu tada pasidalinti, kiek pavyko išsiaiškinti, tikiuosi sulaukti komentarų.
Kuriame failiuką *.eep, kurį reikės perrašyti į 24c16 EEPROM. Ten turėtų būti sekanti informacija(analogas su vidiniu EEPROM):
eeprom char menu1[]="Pirmadienis";
eeprom char menu2[]="Antradienis";
eeprom char menu3[]="Treciadienis";
eeprom char *menu[]={menu1, menu2, menu3};
eeprom char moon[]={0xee, 0xee, 0xaa, 0xaa};
EEPOM'e viskas atrodyt7 taip:
Adresas:
000000: 50 69 72 6D 61 64 69 65 6E 69 73 00 41 6E 74 72
000010: 61 64 69 65 6E 69 73 00 54 72 65 63 69 61 64 69
000020: 65 6E 69 73 00 EE EE AA AA FF FF FF FF FF FF FF
000030: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
Pvz: Pirmadienis -> 50 69 72 6D 61 64 69 65 6E 69 73 00
žodis baigiasi 00 simboliu.
Išorrinio EEPROM reikšmės nuskaitymas 0x10 adresu (CodeVisionAVR):
/* the I2C bus is connected to PORTB */
/* the SDA signal is bit 3 */
/* the SCL signal is bit 4 */
#asm
.equ __i2c_port=0x18
.equ __sda_bit=3
.equ __scl_bit=4
#endasm
#include <i2c.h>
#define EEPROM_BUS_ADDRESS 0x10
/* read a byte from the EEPROM */
unsigned char eeprom_read(unsigned char address) {
unsigned char data;
i2c_start();
i2c_write(EEPROM_BUS_ADDRESS);
i2c_write(address);
i2c_start();
i2c_write(EEPROM_BUS_ADDRESS | 1);
data=i2c_read(0);
i2c_stop();
return data;
}
void main(void)
{
unsigned char i;
i2c_init();
/* read the byte from address 10h */
i=eeprom_read(0x10);
while (1);
}
Su įrašymu dar nesigauna. Bet kaip man nuskaityti duomenis esančius ne vienoje skiltyje, o keliose? Sakykim "Pirmadienis" prasideda adresu 000000 ir baigiasi 0 simboliu adresu 00000b. Kaip nurodyti programai, kad man riekalingas užrašas yra kažkokiu pradiniu adresu ir kaip ji supras, kokio ilgio tas užrašas, nes kiekvienu atveju jis gali skirtis. Suprantu, kad 0 simbolis lyg ir apibrėžia eilutės pabaigą, bet kaip tai atrodo programiškai? |
|
|
|
|
 |
 |
Išorinis EEPROM |
Parašytas: 2006 01 31, 23:23 |
|
|
|
Domantas rašo: |
Bet kaip man nuskaityti duomenis esančius ne vienoje skiltyje, o keliose? Sakykim "Pirmadienis" prasideda adresu 000000 ir baigiasi 0 simboliu adresu 00000b. Kaip nurodyti programai, kad man riekalingas užrašas yra kažkokiu pradiniu adresu ir kaip ji supras, kokio ilgio tas užrašas, nes kiekvienu atveju jis gali skirtis. Suprantu, kad 0 simbolis lyg ir apibrėžia eilutės pabaigą, bet kaip tai atrodo programiškai? |
Joo... Prisisvajojei Tu ten žiūriu... Ok:
a) Jei nori sužinoti pradžią-pabaigą kiekvieno įrašo (kaip kad parašei), vienintelis būdas - pradėti skaityti nuo adreso 0x00 ir analizuoti kiekvieną nusiskaitytą baitą;
b) Jei nori daryti taip kaip visi daro - naudok fiksuoto ilgio duomenų eilutes (bei kitą įrašo informaciją), ir tada tiksliai galėsi žinoti kokiu adresu yra Tavo norimi duomenys (nebereikės visos atminties per I2C perkratyti ieškant reikiamo duomens). |
|
|
|
|
 |
 |
Išorinis EEPROM |
Parašytas: 2006 02 01, 11:47 |
|
|
|
Kai nieko neišmanai, tai ir prisisvajoji:)
Supratau, kad paprasčiausias būdas yra naudoti fiksuoto ilgio eilutes, t.y
mano atveju žodį "Pirmadienis" įrašysiu 0x00 adresu, sekantį 0x10, dar sekantį 0x20 ir t.t. Tik tokiu atveju nelabai efektyviai išsinaudoja atmintis, bet čia turbūt kompromisas tarp efektyvumo ir paprastumo.
Dabar užstrigau ties kita problema: 24C16 adresacija I2C magistralėje. Iš aprašymo supratau, kad EEPROM išrinkimas I2C magistralėje aprašomas taip: 1 0 1 0 P1 P2 P3 R/W, kur P1-3 yra atminties blokai (pages), kurių yra aštuoni. Jeigu nustatau adresą: 10100010, tai vadinasi turėčiau skaityti duomenis iš pirmojo atminties bloko, kur adresai yra nuo 0x0000 iki 0x01FF, jeigu reikia paskutiniojo bloko, tai adresas turėtų būti 10101110 ir adresai nuo 0x0700 iki 0x07FF. Atitinkamai rašant duomenis į EEPROM pirmas bitas keičiasi į 1. Problema, kad niekaip negaliu įrašyti duomenų į EEPROM. Darau viską pagal pavyzdį, kuris yra CodeVision help'e, tik ten skirta 24C02, bet tai turėtų atitikti pirmą 24C16 duomenų bloką. Štai ištrauka iš help'o:
/*Example how to access an Atmel 24C02 256 byte I2C EEPROM:*/
/* the I2C bus is connected to PORTB */
/* the SDA signal is bit 3 */
/* the SCL signal is bit 4 */
#asm
.equ __i2c_port=0x18
.equ __sda_bit=3
.equ __scl_bit=4
#endasm
#include <i2c.h>
/* function declaration for delay_ms */
#include <delay.h>
#define EEPROM_BUS_ADDRESS 0xa0 (10100000)
/* read a byte from the EEPROM */
unsigned char eeprom_read(unsigned char address) {
unsigned char data;
i2c_start();
i2c_write(EEPROM_BUS_ADDRESS);
i2c_write(address);
i2c_start();
i2c_write(EEPROM_BUS_ADDRESS | 1);
data=i2c_read(0);
i2c_stop();
return data;
}
/* write a byte to the EEPROM */
void eeprom_write(unsigned char address, unsigned char data) {
i2c_start();
i2c_write(EEPROM_BUS_ADDRESS);
i2c_write(address);
i2c_write(data);
i2c_stop();
/* 10ms delay to complete the write operation */
delay_ms(10);
}
void main(void) {
unsigned char i;
/* initialize the I2C bus */
i2c_init();
/* write the byte 55h at address AAh */
eeprom_write(0xaa,0x55);
/* read the byte from address AAh */
i=eeprom_read(0xaa);
while (1); /* loop forever */
}
Ką darau ne taip? |
|
|
|
|
 |
 |
Išorinis EEPROM |
Parašytas: 2006 02 01, 13:39 |
|
|
|
Domantas rašo: |
Dabar užstrigau ties kita problema: 24C16 adresacija I2C magistralėje.
Ką darau ne taip? |
Na visų pirma apsispręsk, kas yra "pirmas bitas"... Nes vienu atveju tai skamba lyg vyriausias bitas, kitu - lyg jauniausias, paskui lyg nulinis arba pirmas...
Antra, kiek rašei - visur naudojai "write" operaciją. Tad skaitymas ir negali veikti. Jauniausias bitas apsprendžia skaityti ar rašyti.
Trečia - ar bent mikroschema kalbasi su Tavim? T.y., ACK atsako?
Domantas rašo: |
Jeigu nustatau adresą: 10100010, tai vadinasi turėčiau skaityti duomenis iš pirmojo atminties bloko, kur adresai yra nuo 0x0000 iki 0x01FF |
Ir vėl - kas yra "pirmas"? Šiuo atveju inicijuoji įrašymą į pirmą bloką, bet ne adresu 0x00-1FF, o nuo 0x100-0x1FF. (puslapio dydis 256 baitai!!!) Jei nori adresuoti nuo 0x00, tai kreipkis į nulinį bloką, o ne į pirmąjį |
|
|
|
|
 |
 |
Išorinis EEPROM |
Parašytas: 2006 02 01, 15:24 |
|
|
|
Ačiū už komentarą.
Pirmas bitas turėjau minty jauniausią, t.y. R/W bitą, o kad naudoju "write" operaciją, tai ten taip procedūros parašytos. Nuskaitymas gaunasi su data=i2c_read(0) komanda.
Būtent skaitymas (aš darau tokią prielaidą) lyg ir vyksta. Metodas gal ir kreivas, bet aš pasijungęs LCD į kurį išvedinėja nuskaitomą EEPROM adresą ir duomenis esančius tuo adresu. EEPROM'as kažkada buvo įrašytas ir nėra tuščias. Nuskaitant duomenys tuo pačiu adresu, gaunu tuos pačius rezultatus. Vadinas nuskaitinėja ne betką. Atjungus maitinimą nuo EEPROM nuskaito tik 0xFF, vadinasi tada nieko nenuskaito. Jeigu tik mėginu rašyti nurodytu adresu kokią nors reikšmę, tai vėliau aš jos tuo adresu nerandu:(
Ten būna ta pati reikšmė, kokia buvo prieš įrašymą.
Dėl blokų truputį suklydau rašydamas, ten viską suprantu teisingai: 000 yra nulinis blokas (žmogiškai pirmas), o 111 septintas (arba žmogiškai aštuntas). |
|
|
|
|
 |
 |
Išorinis EEPROM |
Parašytas: 2006 02 01, 15:35 |
|
|
|
Domantas rašo: |
111 septintas (arba žmogiškai aštuntas). |
"Žmogiškų" terminų elektronikoje nenaudok, nes liksi nesuprastas.
Domantas rašo: |
Jeigu tik mėginu rašyti nurodytu adresu kokią nors reikšmę, tai vėliau aš jos tuo adresu nerandu:( |
Kaip supratau, paprogrames pasiskolinai nuo 24C02....? Šiaip, ji skiriasi nuo 24C16. Pasitikrink ką veikia i2c_write() ir i2c_read() paprogramės. Geriausiu atveju, jei turi galimybę, pažiūrėk kokie konkrečiai signalai vaikšto ant I2C šynos, ir pamatysi koks bitas netinkamoje vietoje yra atsiradęs (skaitmeninis oscilografas tam reikalingas). |
|
|
|
|
 |
 |
Išorinis EEPROM |
Parašytas: 2006 02 01, 16:04 |
|
|
|
Paprogramė nėra būtent 24C02 skirta. Ji skirta I2C įrenginiams. Pavyzdys tik, kaip pajungti 24C02. Štai kopija I2C.h:
/*
CodeVisionAVR C Compiler
(C) 1998-2000 Pavel Haiduc, HP InfoTech S.R.L.
Prototypes for I2C bus master functions
#ifndef _I2C_INCLUDED_
#define _I2C_INCLUDED_
#pragma used+
void i2c_init(void);
unsigned char i2c_start(void);
void i2c_stop(void);
unsigned char i2c_read(unsigned char ack);
unsigned char i2c_write(unsigned char data);
#pragma used-
#endif |
|
|
|
|
 |
Išorinis EEPROM |
Parašytas: 2006 02 01, 16:17 |
|
|
|
Ar gerai pajungtas EEPROM plokštėje? T/y/. A0-A2, WP?
Ir sakau - pažiūrėk kas dedasi ant I2C šynos...
Galų gale, gal kreipiesi į EEPROM dar nebaigus įrašymo ciklo.... |
|
|
|
|
 |
Išorinis EEPROM |
Parašytas: 2006 02 01, 16:21 |
|
|
|
A0-A2 į žemę, o WP +5V. Tiesa pasakius, nuo kažkokios schemos nužiūrėjau.
O skaitmeninio oscilografo neturiu, tai su pažiūrėjimu problema. |
|
|
|
|
 |
Išorinis EEPROM |
Parašytas: 2006 02 01, 20:36 |
|
|
|
Jo, WP į +5 ir yra write protect. Nuo žioplumo vaistų nėra:)
Grįšiu reikės patikrinti ar veikia. |
|
|
|
|
|
 |
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 |
 |
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 |
 |
FS25 Mods
Farming Simulator 25 Mods,
FS25 Maps |
 |
ATS Trailers
American Truck Simulator Mods,
ATS Trucks,
ATS Maps |
 |
Football Training Kit
Football Training Equipment,
Football Skills,
Football Training |
|

|
 |