질문게시판 > avr i2c eeprom 코드관련해서요

인기검색어 > 아두이노 센서 ATMEGA128

최신글 질문게시판 동영상강좌 가입하기

▼ BASIC4MCU 후원업체 신제품 정보 ▼

▲ BASIC4MCU 후원업체 신제품 정보 ▲

BASIC4MCU > 질문게시판

avr i2c eeprom 코드관련해서요

페이지 정보

작성자 남이 작성일19-03-14 22:09 조회26회 댓글1건

본문

키트님이 작성하신 코드를 atmel studio7 변경해서 프로테우스에 적용을 시켜보았습니다

저 그런데 제가 이해를 잘못하는건지 프로테우스 결선이 틀린건지

코드값을 쓰고 다시 그코드값을 읽어 오는거 같은데 읽히질 않아서

왜그런지 알고 싶어서 글을 작성합니다

 

#include <avr/io.h>
#include <util/delay.h>
#include <stdio.h>
//
#define  WP_hi  (PORTD |=0x04)//PORTD.2=1
#define  WP_lo  (PORTD &=0xfb)//PORTD.2=0
//
#define  SDA_hi (DDRD &=0xfe)//DDRD.1=0
#define  SDA_lo (DDRD |=0x02)//DDRD.1=1
//
#define  SCL_hi (DDRD &=0xfe)//DDRD.0=0
#define  SCL_lo (DDRD |=0x01)//DDRD.0=1
//
#define  ACK_data  0
#define  NACK_data 1
//
char str[50];
//
void TX0_CH(char ch)   { while(!(UCSR0A&0x20)); UDR0=ch; } // 송신 1바이트
void TX0_STR(char *str){ while(*str)TX0_CH(*str++);      } // 송신 문자열
//
void eeprom_clock(){ _delay_us(1); SCL_hi; _delay_us(1); SCL_lo; }
//
void eeprom_start(){
 _delay_us(1); SDA_hi; SCL_hi; _delay_us(1); SDA_lo; _delay_us(1); SCL_lo;
}
//
void eeprom_stop(){
 SDA_lo; _delay_us(1); SCL_hi; _delay_us(1); SDA_hi; _delay_us(1);
}
//
void eeprom_nack(){
 SDA_hi; eeprom_clock();
}
//
void eeprom_ack(){
 SDA_lo; eeprom_clock();
}
//
void eeprom_write(char d){
 char i;
 for(i=0;i<8;i++){
  if(d&(0x80>>i))SDA_hi; else SDA_lo;
  eeprom_clock();
 }
 eeprom_nack();
}
//
char eeprom_read(char ack){
 char i,d=0;
 SDA_hi;
 for(i=0;i<8;i++){
  eeprom_clock();
    if(((PIND&0x02)==d)| 0x80>>i) ;//if(PIND.1)d|=0x80>>i;
 }
 //
 if(ack==ACK_data)eeprom_ack();
 else             eeprom_nack();
 //
 return d;
}
//
void Wr_randum(int add,char data){ // add = 0x00 ~ 0x7FFF
 WP_lo;
 eeprom_start();
 eeprom_write(0xA0); // Device Address
 eeprom_write(add>>8);
 eeprom_write(add&0xFF);
 eeprom_write(data);
 eeprom_stop();
 delay_ms(5);
 WP_hi;
}
//
char Rd_randum(int add){ // add = 0x00 ~ 0x7FFF
 char ch;
 WP_lo;
 eeprom_start();
 eeprom_write(0xA0);
 eeprom_write(add>>8);
 eeprom_write(add&0xFF);
 eeprom_start();
 eeprom_write(0xA1);
 ch=eeprom_read(NACK_data);
 eeprom_stop();
 WP_hi;
 return ch;
}
//
char wr_buf[64]; // 64byte
//
void Wr_Page(int add,char *str){ // add = 0x00 ~ 0x7FFF
 unsigned int i;
 WP_lo;
 eeprom_start();
 eeprom_write(0xA0); // Device Address
 eeprom_write(add>>8);
 eeprom_write(add&0xFF);
 for(i=0;i<64;i++){ eeprom_write(*str++); }
 eeprom_stop();
 _delay_ms(5);
 WP_hi;
}
//
char rd_buf[16][16]; // 256byte
//
void Rd_Sequential(int add,unsigned int cnt){ // add = 0x00 ~ 0x7FFF
 unsigned int i;
 WP_lo;
 eeprom_start();
 eeprom_write(0xA0);
 eeprom_write(add>>8);
 eeprom_write(add&0xFF);
 eeprom_start();
 eeprom_write(0xA1);
 for(i=0;i<(cnt-1);i++){
  rd_buf[0][i]=eeprom_read(ACK_data);
 }
 rd_buf[0][i]=eeprom_read(NACK_data);
 //
 eeprom_stop();
 WP_hi;
}
//
void main(void){
 unsigned int i,k;
 //
 PORTB |=0x04 ; // PORTD.2=1;
 DDRD |=0x04 ; //  DDRD.2=1; //wp

 UCSR0B=8;   UBRR0L=103; // 115200 @16MHz 송신
 //
 sprintf(str,"\r\npage write\r\n"); TX0_STR(str);
 for(i=0;i<64;i++)wr_buf[i]=i;     Wr_Page(  0,wr_buf);
 for(i=0;i<4;i++){
  for(k=0;k<16;k++){ sprintf(str,"%02x ",wr_buf[i*16+k]); TX0_STR(str); }
  sprintf(str,"\r\n"); TX0_STR(str);
 }
 for(i=0;i<64;i++)wr_buf[i]=(i+64)&0xFF;  Wr_Page( 64,wr_buf);
 for(i=0;i<4;i++){
  for(k=0;k<16;k++){ sprintf(str,"%02x ",wr_buf[i*16+k]); TX0_STR(str); }
  sprintf(str,"\r\n"); TX0_STR(str);
 }
 for(i=0;i<64;i++)wr_buf[i]=(i+128)&0xFF; Wr_Page(128,wr_buf);
 for(i=0;i<4;i++){
  for(k=0;k<16;k++){ sprintf(str,"%02x ",wr_buf[i*16+k]); TX0_STR(str); }
  sprintf(str,"\r\n"); TX0_STR(str);
 }
 for(i=0;i<64;i++)wr_buf[i]=(i+192)&0xFF; Wr_Page(192,wr_buf);
 for(i=0;i<4;i++){
  for(k=0;k<16;k++){ sprintf(str,"%02x ",wr_buf[i*16+k]); TX0_STR(str); }
  sprintf(str,"\r\n"); TX0_STR(str);
 }
 //
 sprintf(str,"\r\nSequential read\r\n"); TX0_STR(str);
 Rd_Sequential(0,256);
 for(i=0;i<16;i++){
  for(k=0;k<16;k++){ sprintf(str,"%02x ",rd_buf[i][k]); TX0_STR(str); }
  sprintf(str,"\r\n"); TX0_STR(str);
 }
 while(1){}
}

 

 

  • BASIC4MCU 작성글 SNS에 공유하기
  • 페이스북으로 보내기
  • 트위터로 보내기
  • 구글플러스로 보내기
  • 카카오톡으로 보내기

댓글 : 1

조회수 : 26

master님의 댓글

master 작성일

A0~A2 핀을 GND에 연결해주시고요
시뮬레이션이 되도라도 실제로 동작하지 않는 경우가 많습니다.
시뮬레이션이 아닌 실제로 회로를 구성해서 구동하시는 것이 좋습니다.

게시물 검색

BASIC4MCU > 질문게시판 목록

제목 날짜
공지 MCU, AVR, 아두이노 등 전자공학에 관련된 질문은… 스태프  19-01-15
공지 사이트 이용 안내 댓글[5] master  17-10-29
질문 아두이노 주기원격조절관련 질문드려요 양양 새글 19-03-22
답변 답변 : 아두이노 주기원격조절관련 질문드려요 master 새글 10:20
질문 아두이노 카메라 캡처 댓글[1] 아두이노배우기 새글 19-03-22
질문 아두이노 DC전원 2배 키우는 방법 댓글[2] 첨부파일4004 새글 19-03-22
질문 아두이노 우노 모터 관련 질문 2 댓글[1] 첨부파일가든 새글 19-03-21
질문 아두이노 LCD 질문입니다 댓글[2] Winavr  19-03-21
질문 아두이노메가 -> 아두이노우노 통신 질문입니다! 첨부파일궈니  19-03-20
답변 답변 : 아두이노메가 -> 아두이노우노 통신 질문입니다… master  19-03-21
질문 아두이노 우노 모터 관련 질문 가든  19-03-20
답변 답변 : 아두이노 우노 모터 관련 질문 master  19-03-21
질문 DC 전압을 2배로 키울 수 있는 회로가 있나요? 4004  19-03-20
답변 답변 : DC 전압을 2배로 키울 수 있는 회로가 있나… master  19-03-21
답변 답변 : 답변 : DC 전압을 2배로 키울 수 있는 회… 댓글[1] 4004 새글 19-03-22
답변 답변 : 답변 : 답변 : DC 전압을 2배로 키울 수… 댓글[1] master 새글 19-03-22
질문 stm32칩 공부 관련 질문 댓글[4] wiopf1  19-03-19
질문 AVR STUDIO 4.19 & AVRISP MKII … 댓글[1] 오박사  19-03-18
질문 예제 코드 구합니다 댓글[1] 첨부파일오박사  19-03-18
질문 마스터님! 고생하십니다! 인터럽트 질문좀 드리겠습니다. 닷모드  19-03-18
답변 답변 : 마스터님! 고생하십니다! 인터럽트 질문좀 드리… master  19-03-19
질문 시리얼 통신 키보드 질문드립니다. 댓글[1] 이이제이  19-03-18
질문 스텝모터 제어 역방향 회전시 힘이 약하게 돌아가는 현상 궁금합니다  19-03-16
답변 답변 : 스텝모터 제어 역방향 회전시 힘이 약하게 돌아… 댓글[2] master  19-03-16
질문 아두이노시리얼 0xff가 available 사용해도 계… yangty01  19-03-16
답변 답변 : 아두이노시리얼 0xff가 available 사… master  19-03-16
질문 atmega128 Switch를 이용한 FND제어 질문 master  19-03-16
질문 아두이노 시리얼통신 질문합니다. 댓글[3] 이이제이  19-03-16
질문 ATmega128에 대해서... 댓글[2] YDyd  19-03-15
질문 프로세싱 RFID 태그시 색변화.. 댓글[1] ksyh2030  19-03-14
게시물 검색


Privacy Policy
MCU BASIC ⓒ 2017
PC버전