6.3. rauta eeprom-ohjelmointia

6

Click here to load reader

Upload: digindom

Post on 08-Apr-2015

175 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: 6.3. rauta EEPROM-Ohjelmointia

1

6.3. AVR_rauta. EEPROM-muisti 09.12.2007 pva

“Experience is what causes people to make new mistakes instead of old ones... “

- Unknown Sisältö Yleistä EEPROM-rekisterit Protoilu-ohje EEPROMmista ja Fuse-biteistä Yleistä EEPROM-muisti, Electrical Erasible Programmable ROM, on muistia, jossa tieto säilyy sähkökatkosten yli ja silti siihen voidaan kirjoittaa kesken ohjelman ajon yksi tai useampi datatavu (toisin kuin flash-muistiin). EEPROMmiin tallennetaan tietoja, joita muutetaan harvoin ja joiden halutaan säilyvän siellä sähkökatkoksen yli. Se on siis eräänlainen ”iki-data-muisti”. avr-gcc-kääntimestä löytyy valmiita funktioita EEPROM-muistin käyttöön. Ne on määritetty eeprom.h-tiedostossa. EEPROM-muistin käytöstä on tiedettävä: ”The Chip Erase will erase the Flash and EEPROM(1) memories plus Lock bits. The Lock bits are not reset until the program memory has been completely erased. The Fuse bits are not changed. A Chip Erase must be performed before the Flash and/or the EEPROM are reprogrammed”. Eli ATmega32 dokumentti kertoo, että siirrettäessä koodia flash-muistiin, ensin erasoidaan = tyhjennetään flash-muistin lisäksi samantien myös EEPROM-muisti. Tämä merkitsee ”iki-data”-muistin tietojen häviämistä, ellei sitä estetä EESAVE-lukkobitillä. Käytöstä on tiedettävä myös se, että EEPROMin käyttö ei ole yhtä yksinkertaista kuin SRAM-muistin. Se selviää tämän dokumentin harjoituksesta.

Page 2: 6.3. rauta EEPROM-Ohjelmointia

2

AVR ATmega32, EEPROM, Electrical Erasible Programmable ROM 25.04.2006 www.microsalo.com

EEAR, EEPROM Address Register Bitti H/L 15/7 14/6 13/5 12/4 11/3 10/2 9/1 8/0 Nimi - - - - - - EEAR9 EEAR8 Nimi EEAR7 EEAR6 EEAR5 EEAR4 EEAR3 EEAR2 EEAR1 EEAR0 1024 Bytes erillinen muistiavaruus, 10 bittiä. Ylimmät bitit luetaan aina nollaksi. Initial-arvo on määrittelemätön. Oikea osoite määritettävä ennen käyttöönottoa.

EEDR, EEPROM Data Register Bitti 7 6 5 4 3 2 1 0 Nimi MSB LSB Sisältää EEPROM-muistiin kirjoitettavan datan. Kirjoitetaan osoitteeseen, joka on EEAR-rekisterissä. Luettaessa EEPROM-muistia data talletetaan tänne.

EECR, EEPROM Control Register Bitti 7 6 5 4 3 2 1 0 Nimi - - - - EERIE EEMWE EEWE EERE

Voidaan kirjoittaa ja erasoida vähintään 100 000 kertaa.

Bitti Nimi Merkitys Toiminto 3 EERIE EEPROM Ready Interrupt Enable 1: enables EEPROM Ready Interrupt.

0: disables. Keskeytys nollaa EEWEn.

2 EEMWE EEPROM Master Write Enable 1: setting EEWE within 4 clock cycles will write data to the EEPROM. Jos asetettu “1” softalla, HW clears to bit after 4 clk. 0: EEWE will have no effect

1 EEWE EEPROM Write Enable 1: EEWE is the write strobe to the EEPROM EEMWE bit must be written to one before a logical one is written to EEWE.

0 EERE EEPROM Read Enable

1: is the read strobe to the EEPROM Pollaa EEWEä ennen lukemista, ei voi lukea ennen kuin on ”lupa”.

Page 3: 6.3. rauta EEPROM-Ohjelmointia

3

Protoilu-ohje EEPROMmista ja Fuse-biteistä 29.11.06 muutettu toimimaan PV-M32-kortilla Toimii Atmega32 1. The Chip Erase will erase the Flash and EEPROM(1) memories plus Lock bits. The Lock bits are not reset until the program memory has been completely erased. The Fuse bits are not changed. A Chip Erase must be performed before the Flash and/or the EEPROM are reprogrammed. Note: 1. The EEPRPOM memory is preserved during chip erase if the EESAVE Fuse is programmed. EEPROM-muistin sisältö tuhotaan samalla kun flash-muisti erasoidaan (ohjelmoidaan), ellei sitä ole EESAVE-bitillä estetty. 2. Tutustu koodiin ”eep_write.c”. Käännä ja siirrä AVR:n flash-muistiin ja aja se. 3. Tutustu koodiin ”eep_read.c”. Käännä ja siirrä AVR:n flash-muistiin ja aja se.

- huomaat, että tulostaa toiselle riville ”sutturaa” - tämä siksi, että ohjelmoitaessa EEPROM-muisti on nollattu, eli kirjoitettu

täyteen ’1’ 4. tee kohta 2. uudelleen 5. Avaa ohjelmointiohjelma JTAG ICE. Valitse Fuses-välilehti. Paina Read-nappia. Seuraavan kuvan mukainen ikkuna aukeaa.

Page 4: 6.3. rauta EEPROM-Ohjelmointia

4

Varmistu että ”Preserve EEPROM memory through the Chip Erase cycle” on ohjelmoimatta, eli se on kruksaamatta, mikä tarkoittaa erasoinnin jäljiltä se on 1. Muutetaan ko. eli EEPROM-fuse-bitti nollaksi, eli ohjelmoidaan se. Joka merkitsee, että flash-muistia ohjelmoitaessa EEPROM-muisti jätetään entiselleen (sitä ei erasoida).

Kruksaa EEPROM-fuse-bitti. Paina Program-nappia. OLE HUOLELLINEN, muihin bitteihin ei saa koskea! Tarkista, Read, että homma onnistui. 6. Tee kohta 3 uudelleen. Nyt tulostaa ”HELLO AVR” lcd-näytölle, jos kaikki on mennyt kuten piti.

Page 5: 6.3. rauta EEPROM-Ohjelmointia

5

Käytettävät koodit /**************************************************************** Project : eep_write.c, Hardware: PV-M32 (4 MHz) + PV-LCD1602 Software: WinAVR 20060421 Date : 29.11.2006 Author : pva Comments: kirjoittaa EEPROM-muistiin ****************************************************************/ #include <avr/io.h> #include <avr/eeprom.h> #include "lcd_tat.h" #define ROW 0 #define PLACE 0 // prototyypit void Write_to_eeprom(void); int main(void) { LCD_init(1, 0, 0); LCD_writeString("WR_to_EEPROM"); Write_to_eeprom(); LCD_setCursorXY(PLACE, ROW+1); LCD_writeString("Valmis!"); return 0; } void Write_to_eeprom(void) { uint8_t i; uint8_t EEPROM_addr = 0x00; uint8_t jono[12] = "HELLO WORLD!"; //talletetaan EEPROMmiin for(i=0; i<12; i++) eeprom_write_byte(EEPROM_addr + i, jono[i]); } /*************************************************************** Project : eep_read.c Hardware: PV-M32 (4 MHz) + PV-LCD1602 Software: WinAVR 20060421 Date : 29.11.2006 Author : pva Comments: lukee EEPROMmia ja tulostaa ==>lcd ****************************************************************/ #include <avr/io.h> #include <avr/eeprom.h> #include <util/delay.h> #include "lcd_tat.h" #define ROW 0 #define PLACE 0 // prototyypit void Lue_eeprom(void); void wait(uint16_t time); // globaali muuttuja

Page 6: 6.3. rauta EEPROM-Ohjelmointia

6

uint8_t EEPROM_addr = 0x00; int main(void) { LCD_init(1, 0, 0); while(1) { LCD_setCursorXY(PLACE, ROW ); LCD_writeString("From EEPROM"); Lue_eeprom(); wait(1000); LCD_clear(); wait(500); } } void Lue_eeprom(void) { uint8_t i; LCD_setCursorXY(PLACE, ROW+1); for(i=0; i<12;i++) { wait(100); LCD_writeChar(eeprom_read_byte(EEPROM_addr + i)); // luetaan merkit yksitellen EEPROMmista // ja tulostetaan ->LCD } } // *** Primitive wait() *** void wait(uint16_t time) { uint16_t i; for(i=0;i<2000;i++) _delay_loop_2(time); }