/* * Oving4.c * * Created: 08.02.2012 08:38:11 * Author: ketile * Hensikt: Lag et program i C som bruker EE_READY (EERE) * interruptet til å skrive til lokasjonene 0x01 - 0x10 * i eeprom. */ #include <avr/io.h> #include <avr/interrupt.h> // Deklarer funksjoner void EEput (uint16_t address, uint8_t data); uint8_t EEget (uint16_t address); // Deklarer variabler uint8_t data = 0; int main(void) { while(1) { // Lagre til eeprom for (uint8_t i=1; i<=16; i++){ data++; EEput(i, data); } // Les fra eeprom for (uint16_t i=1; i<=16; i++){ EEget (i); } } } // Funksjon for å lagre til EEPROM void EEput (uint16_t address, uint8_t data){ /* Vent til nåværende skriving er ferdig */ while(EECR & (1<<EEPE)); /* Send verdier til adresse- og dataregister */ EEAR = address; EEDR = data; /* Skriv logisk 1 EEMPE */ EECR |= (1<<EEMPE); /* Start eeprom write by setting EEPE */ // NB! Dersom det tar mer enn 4 klokkesykluser // mellom disse operasjonene vil den feile. // Bruk optimalisering høyere enn 0 i kompilatoren // for å unngå dette. EECR |= (1<<EEPE); } // Funksjon for å lese fra EEPROM uint8_t EEget (uint16_t address){ /* Vent til nåværende skriving er ferdig */ while(EECR & (1<<EEPE)); /* Bestem adresseregister */ EEAR = address; /* Les fra eeprom ved å skrive til EERE */ EECR |= (1<<EERE); /* Returner data fra adresseregisteret */ return EEDR; }
while(EECR & (1<<EEPE)); 000000AF NOP No operation while(EECR & (1<<EEPE)); 000000B0 LDI R24,0x3F Load immediate 000000B1 LDI R25,0x00 Load immediate 000000B2 MOVW R30,R24 Copy register pair 000000B3 LDD R24,Z+0 Load indirect with displacement 000000B4 MOV R24,R24 Copy register 000000B5 LDI R25,0x00 Load immediate 000000B6 ANDI R24,0x02 Logical AND with immediate 000000B7 ANDI R25,0x00 Logical AND with immediate 000000B8 SBIW R24,0x00 Subtract immediate from word 000000B9 BRNE PC-0x09 Branch if not equal EEAR = address; 000000BA LDI R24,0x41 Load immediate 000000BB LDI R25,0x00 Load immediate 000000BC LDD R18,Y+2 Load indirect with displacement 000000BD LDD R19,Y+3 Load indirect with displacement 000000BE MOVW R30,R24 Copy register pair 000000BF STD Z+1,R19 Store indirect with displacement 000000C0 STD Z+0,R18 Store indirect with displacement EEDR = data; 000000C1 LDI R24,0x40 Load immediate 000000C2 LDI R25,0x00 Load immediate 000000C3 LDD R18,Y+1 Load indirect with displacement 000000C4 MOVW R30,R24 Copy register pair 000000C5 STD Z+0,R18 Store indirect with displacement EECR |= (1<<EEMPE); 000000C6 LDI R24,0x3F Load immediate 000000C7 LDI R25,0x00 Load immediate 000000C8 LDI R18,0x3F Load immediate 000000C9 LDI R19,0x00 Load immediate 000000CA MOVW R30,R18 Copy register pair 000000CB LDD R18,Z+0 Load indirect with displacement 000000CC ORI R18,0x04 Logical OR with immediate 000000CD MOVW R30,R24 Copy register pair 000000CE STD Z+0,R18 Store indirect with displacement EECR |= (1<<EEPE); 000000CF LDI R24,0x3F Load immediate 000000D0 LDI R25,0x00 Load immediate 000000D1 LDI R18,0x3F Load immediate 000000D2 LDI R19,0x00 Load immediate 000000D3 MOVW R30,R18 Copy register pair 000000D4 LDD R18,Z+0 Load indirect with displacement 000000D5 ORI R18,0x02 Logical OR with immediate 000000D6 MOVW R30,R24 Copy register pair 000000D7 STD Z+0,R18 Store indirect with displacement
while(EECR & (1<<EEPE)); 00000088 SBIC 0x1F,1 Skip if bit in I/O register cleared 00000089 RJMP PC-0x0001 Relative jump EEAR = address; 0000008A OUT 0x22,R25 Out to I/O location 0000008B OUT 0x21,R24 Out to I/O location EEDR = data; 0000008C OUT 0x20,R1 Out to I/O location EECR |= (1<<EEMPE); 0000008D SBI 0x1F,2 Set bit in I/O register EECR |= (1<<EEPE); 0000008E SBI 0x1F,1 Set bit in I/O register