Vítejte na Elektro Bastlírn?
Nuke - Elektro Bastlirna
  Vytvořit účet Hlavní · Fórum · DDump · Profil · Zprávy · Hledat na fóru · Příspěvky na provoz EB

Vlákno na téma KORONAVIRUS - nutná registrace


Nuke - Elektro Bastlirna: Diskuzní fórum

 FAQFAQ   HledatHledat   Uživatelské skupinyUživatelské skupiny   ProfilProfil   Soukromé zprávySoukromé zprávy   PřihlášeníPřihlášení 

čtení a zápis do eeprom u Atmegy128
Jdi na stránku 1, 2, 3  Další
 
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Programování PIC, ATMEL, EEPROM a dalších obvodů
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
Toby



Založen: Feb 18, 2010
Příspěvky: 25

PříspěvekZaslal: čt únor 18 2010, 13:34    Předmět: čtení a zápis do eeprom u Atmegy128 Citovat

ahoj,
potřeboval bych poradit s eeprom pamětí u atmegy128.
Pro zápis do eeprom a čtení z eeprom používám tyto funkce, které jsou napsaná v datasheetu atmegy128.

//cteni z eeprom
unsigned char EEPROM_read(unsigned int uiAddress)
{
/* Wait for completion of previous write */
while(EECR & (1<<EEWE));
/* Set up address register */
EEAR = uiAddress;
/* Start eeprom read by writing EERE */
EECR |= (1<<EERE);
/* Return data from data register */
return EEDR;
}

// zapis do eeprom
void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
{
/* Wait for completion of previous write */
while(EECR & (1<<EEWE));
/* Set up address and data registers */
EEAR = uiAddress;
EEDR = ucData;
/* Write logical one to EEMWE */
EECR |= (1<<EEMWE);
/* Start eeprom write by setting EEWE */
EECR |= (1<<EEWE);
}

funkce pro čtení funguje, ale funkce pro zápis nee.
V datasheetu jsem vyčetl že by se mělo při zápisu vypnout globální přerušení, ale i o vypnutí GIE se do eeprom nic nezapíše.
Programuji to v prostředí CodeVisionAVR a přes Presto UP, jestli by někdo neporadil, kde by mohl být problém.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
bohumilfulin



Založen: Jan 12, 2010
Příspěvky: 109

PříspěvekZaslal: čt únor 18 2010, 15:10    Předmět: Citovat

ty to mas v C ja v assembleru ale jako voditko by to mohlo poslouzit

;********************************************************************************
;INTERNI EEPROM
;********************************************************************************
;********************************************************************************
intEEPROM_write:
;in xh:xl; Set up address in address register
;in temp data k zapisu
;out: -
; Wait for completion of previous write
sbic EECR,EEWE
rjmp intEEPROM_write
; Set up address (xh:xl) in address register
out EEARH,xh
out EEARL,xl
; Write data (temp) to data register
out EEDR,temp
push temp
in temp, SREG ; store SREG value
cli ; disable interrupts during timed sequence
sbi EECR, EEMWE ; start EEPROM write
sbi EECR, EEWE
out SREG, temp ; restore SREG value (I-bit)
pop temp
ret
;********************************************************************************
intEEPROM_read:
;in ; Set up address (xh:xl) in address register
;out:temp data na adrese

; Wait for completion of previous write
sbic EECR,EEWE
rjmp intEEPROM_read
; Set up address (xh:xl) in address register
out EEARH, xh
out EEARL, xl
; Start eeprom read by writing EERE
sbi EECR,EERE
; Read data from data register
in temp,EEDR
ret
;********************************************************************************
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Toby



Založen: Feb 18, 2010
Příspěvky: 25

PříspěvekZaslal: čt únor 18 2010, 16:05    Předmět: re Citovat

assembler moc nepobírám Sad
jak mám ty funkce v tom assembleru zavolat?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Andrea



Založen: Sep 07, 2007
Příspěvky: 9340

PříspěvekZaslal: čt únor 18 2010, 17:31    Předmět: Re: re Citovat

Toby napsal(a):
assembler moc nepobírám Sad
jak mám ty funkce v tom assembleru zavolat?

Z Cčka těžko.
Podle čeho usuzuješ, že čtení funguje a zápis ne? Ty funkce vypadají v pořádku, překladač nic nehlásí?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Toby



Založen: Feb 18, 2010
Příspěvky: 25

PříspěvekZaslal: čt únor 18 2010, 17:42    Předmět: re Citovat

Když manuálně zapíšu do eeprom tak mi to funkce pro čtení přečte správně.
Jakmile chci zapsat do eeprom v programu pomoci fce pro zápis tak mi pak fce pro čtení přečte hodnotu, která je deafaultně nastavená v eeprom, čili špatnou hodnotu.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Andrea



Založen: Sep 07, 2007
Příspěvky: 9340

PříspěvekZaslal: čt únor 18 2010, 17:47    Předmět: Re: re Citovat

Toby napsal(a):
Jakmile chci zapsat do eeprom v programu pomoci fce pro zápis tak mi pak fce pro čtení přečte hodnotu, která je deafaultně nastavená v eeprom, čili špatnou hodnotu.

Přečte to co tam bylo ručně zapsáno nebo 0xFF?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Toby



Založen: Feb 18, 2010
Příspěvky: 25

PříspěvekZaslal: čt únor 18 2010, 17:52    Předmět: re Citovat

přečte co tam bylo defaultně nastaveno takže FF
je mi právě divný, že ta funkce pro čtenífunguje a zápis nefunguje
nemáš možnost tu funkci vyzkoušet?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Andrea



Založen: Sep 07, 2007
Příspěvky: 9340

PříspěvekZaslal: čt únor 18 2010, 17:56    Předmět: Re: re Citovat

Toby napsal(a):
přečte co tam bylo defaultně nastaveno takže FF
je mi právě divný, že ta funkce pro čtenífunguje a zápis nefunguje
nemáš možnost tu funkci vyzkoušet?

Nemám, ale totéž napsané v assembleru fuguje bez problémů. Zkus zapsat na adresu, kam předtím ručně zapíšeš něco jiného než 0xFF a pak to přečti.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Toby



Založen: Feb 18, 2010
Příspěvky: 25

PříspěvekZaslal: čt únor 18 2010, 18:02    Předmět: Citovat

jj to jsem zkoušel viz.

#asm("cli") // zakaz GIE
EEPROM_write(0x0001,0x01); // zapis na pozici 1 hodnotu 1
delay_ms(500); // cekej
EEPROM_read(0x0001); // precti data na pozici 1
#asm("sei") // povol GIE


ale pořád to čte FF
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
AB1



Založen: Nov 23, 2009
Příspěvky: 312

PříspěvekZaslal: čt únor 18 2010, 18:15    Předmět: Citovat

Původní kód by měl fungovat.
Kde a jak jsou definované bity EEWE, EEMWE atd?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Toby



Založen: Feb 18, 2010
Příspěvky: 25

PříspěvekZaslal: čt únor 18 2010, 18:24    Předmět: re Citovat

to mám nadefinováno takto
/* ***** EEPROM *********************** */
/* EEDR - EEPROM Data Register */
#define EEDR0 0 // EEPROM Data Register bit 0
#define EEDR1 1 // EEPROM Data Register bit 1
#define EEDR2 2 // EEPROM Data Register bit 2
#define EEDR3 3 // EEPROM Data Register bit 3
#define EEDR4 4 // EEPROM Data Register bit 4
#define EEDR5 5 // EEPROM Data Register bit 5
#define EEDR6 6 // EEPROM Data Register bit 6
#define EEDR7 7 // EEPROM Data Register bit 7

/* EECR - EEPROM Control Register */
#define EERE 0 // EEPROM Read Enable
#define EEWE 1 // EEPROM Write Enable
#define EEMWE 2 // EEPROM Master Write Enable
#define EERIE 3 // EEPROM Ready Interrupt Enable


přičmež toto nastavení je v h souboru, který volám rovněž s dalšími knihovnami .h
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
AB1



Založen: Nov 23, 2009
Příspěvky: 312

PříspěvekZaslal: čt únor 18 2010, 18:59    Předmět: Citovat

Tento kód v simulátoru chodí.

kód:

#include <mega128.h>

#define EERIE 3
#define EEMWE 2
#define EEWE  1
#define EERE  0

//------------------------------------------------------------------

void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
{
    while(EECR & (1<<EEWE));     
    EEAR = uiAddress;
    EEDR = ucData;
    EECR |= (1<<EEMWE);         
    EECR |= (1<<EEWE);         
}

//------------------------------------------------------------------

void main(void)
{
unsigned char i;
   
    for (i=0;i<20;i++)
    EEPROM_write(i,i);

    while (1)
    {
    }

}


Nemám M128 ale zkoušel jsem v reálu s M88 (po přejmenování některých bitů) a zapisuje dobře.
Kontroloval jsem tak, že jsem v programátoru načetl eeprom.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Andrea



Založen: Sep 07, 2007
Příspěvky: 9340

PříspěvekZaslal: čt únor 18 2010, 19:45    Předmět: Citovat

Tak kouknout, jak to překladač přeložil, jestli to nějak nezoptimalizoval.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Andrea



Založen: Sep 07, 2007
Příspěvky: 9340

PříspěvekZaslal: čt únor 18 2010, 19:54    Předmět: Citovat

Toby napsal(a):
#asm("cli") // zakaz GIE
EEPROM_write(0x0001,0x01); // zapis na pozici 1 hodnotu 1
delay_ms(500); // cekej
EEPROM_read(0x0001); // precti data na pozici 1
#asm("sei") // povol GIE

A jak zjišťuješ, co jsi přečetl, když přečtenou hodnotu nikam neukládáš?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Toby



Založen: Feb 18, 2010
Příspěvky: 25

PříspěvekZaslal: čt únor 18 2010, 20:04    Předmět: re Citovat

tak možná u tebe to funguje, ale u mě ne
ten tvůj program jsem zkopíroval přeložil zapnul programátor a přečetl z paměti eeprom samý FF Sad
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Programování PIC, ATMEL, EEPROM a dalších obvodů Časy uváděny v GMT + 1 hodina
Jdi na stránku 1, 2, 3  Další
Strana 1 z 3

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra.
Nemůžete odpovídat na témata v tomto fóru.
Nemůžete upravovat své příspěvky v tomto fóru.
Nemůžete mazat své příspěvky v tomto fóru.
Nemůžete hlasovat v tomto fóru.
Nemůžete připojovat soubory k příspěvkům
Můžete stahovat a prohlížet přiložené soubory

Powered by phpBB © 2001, 2005 phpBB Group
Forums ©
Nuke - Elektro Bastlirna

Informace na portálu Elektro bastlírny jsou prezentovány za účelem vzdělání čtenářů a rozšíření zájmu o elektroniku. Autoři článků na serveru neberou žádnou zodpovědnost za škody vzniklé těmito zapojeními. Rovněž neberou žádnou odpovědnost za případnou újmu na zdraví vzniklou úrazem elektrickým proudem. Autoři a správci těchto stránek nepřejímají záruku za správnost zveřejněných materiálů. Předkládané informace a zapojení jsou zveřejněny bez ohledu na případné patenty třetích osob. Nároky na odškodnění na základě změn, chyb nebo vynechání jsou zásadně vyloučeny. Všechny registrované nebo jiné obchodní známky zde použité jsou majetkem jejich vlastníků. Uvedením nejsou zpochybněna z toho vyplývající vlastnická práva. Použití konstrukcí v rozporu se zákonem je přísně zakázáno. Vzhledem k tomu, že původ předkládaných materiálů nelze žádným způsobem dohledat, nelze je použít pro komerční účely! Tento nekomerční server nemá z uvedených zapojení či konstrukcí žádný zisk. Nezodpovídáme za pravost předkládaných materiálů třetími osobami a jejich původ. V případě, že zjistíte porušení autorského práva či jiné nesrovnalosti, kontaktujte administrátory na diskuzním fóru EB.


PHP-Nuke Copyright © 2005 by Francisco Burzi. This is free software, and you may redistribute it under the GPL. PHP-Nuke comes with absolutely no warranty, for details, see the license.
Čas potřebný ke zpracování stránky 0.27 sekund