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
|