PIC18F13K50 I2C

Gast #2060061
Lesenswert?

Hi,
ich möchte mit dem PIC etwas in mein EEPROM (24C64) schreiben, und 
wieder auslesen.
Ich verwende den internen Oszillator bei 16MHz
Im Anhang die Schaltung. Die LEDs sind zu Debugging Zwecke, kann es mit 
Proteus nicht simulieren, da ich nur die Demo habe.
1
//PIC18F13K50
2

3
#include <p18cxxx.h>
4
#include <i2c.h>  
5
#include "delays.h"                    
6
 
7
#pragma config FOSC = IRC   //OSCCON auf 16MHz
8
//#pragma OSCCON = 0x07; //16MHz
9
#pragma config PWRTEN = ON
10
#pragma config BOREN = OFF
11
#pragma config WDTEN= OFF  //Watchdog Timer
12
#pragma config LVP = OFF  //Low Voltage ICSP
13

14

15
#pragma code
16

17
  unsigned char adress = 0b1010000; //Adresse 1010000 des EEPROMS
18
  unsigned char reg =0x00;
19
  unsigned char value = 0b10011011;
20
  //unsigned char readvalue = 0x00;
21

22

23
void setBits(void)
24
{
25
  //hier aendern auf B4 und B6
26
  TRISBbits.TRISB4 = 1; //INPUT fuer SDA
27
  TRISBbits.TRISB6 = 1; //INPUT fuer SCL
28
}
29

30
void writeEEPROM(void) 
31
{
32
  IdleI2C();
33
  StartI2C();
34
  if (!DataRdyI2C())  
35
    WriteI2C(0b10100000); //0 anhaengen fuer Schreibmodus
36
  IdleI2C();
37
  if (!DataRdyI2C())  
38
    WriteI2C(reg);  
39
  IdleI2C();
40
  if (!DataRdyI2C())
41
     WriteI2C(value); 
42
  IdleI2C();
43
  StopI2C();
44
}
45

46
unsigned char readEEPROM(void)
47
{
48
  unsigned char EEPROMvalue = 0x00;
49
  IdleI2C();
50
  StartI2C();
51
  if (!DataRdyI2C())  
52
    WriteI2C(0b10100000); //0 anhaengen fuer Schreibmodus 
53
  IdleI2C();
54
  if (!DataRdyI2C())  
55
    WriteI2C(reg);  
56
  IdleI2C();
57
  StartI2C();  //repeated start
58
  if (!DataRdyI2C())
59
     WriteI2C(0b10100001); // 1 anhaengen fuer Lesemodus 
60
  IdleI2C();
61
  //if (DataRdyI2C())
62
     EEPROMvalue = ReadI2C();  
63
  IdleI2C();
64
  StopI2C();
65
  return EEPROMvalue;
66
}
67

68
void led(unsigned char readvalue)
69
{
70
  int i=0;
71
  TRISAbits.TRISA5 = 0; //R4+R5 Outputs
72
  TRISCbits.TRISC5 = 0;
73
  LATA=0x00;
74
  LATC=0x00;
75
  //immer 2 Bit  
76
  for (i=0; i<4; i++)
77
  {
78
    LATAbits.LATA5 = readvalue >> (2*i);
79
        Delay10KTCYx(1000);
80
    LATCbits.LATC5 = readvalue >> (1+2*i);
81
        Delay10KTCYx(1000);
82
  }
83

84
}
85

86
void main(void)
87
{
88
  unsigned char EEPROMvalue = 0x00;
89
  setBits();
90
  OpenI2C(MASTER, SLEW_OFF);  //Master + 100kHz Mode
91
  OSCCON = 0b01110110; // 16MHz
92
  SSPADD = 0x27; //Baudrate: takt/4(sspadd+1) bei FOSC 100
93
  //SSPCON2 = 0x01; //Controlbits senden beginnen
94
  writeEEPROM();
95
  //led(readEEPROM());
96
  while(1)
97
  {
98
    led(readEEPROM());
99
  }
100
}   
101
wäre über Hilfe sehr dankbar
Angehängte Dateien:
Gast #2064810
Lesenswert?

Sollte mal jemand dasselbe Problem haben, hier einige Hilfen:
wartet immer bis PIR1bits.SSPIF = 1 ist (while-Schleife) und cleared es 
anschließend.
Achtet darauf, dass die Baudrate stimmt: SSPADD
Beim lesen: Den repeated start richtig machen (mein PIC hat hierfür ein 
Register in SSPCON2 -> RSEN und SEN unterscheiden)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren