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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.