Forum: Mikrocontroller und Digitale Elektronik PIC18F13K50 I2C


von Diotor (Gast)


Angehängte Dateien:

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

von Helfer (Gast)


Lesenswert?

Und? Geht oder geht nicht? Hast du den Code für die *I2C Funktionen 
selbst geschrieben oder übernommen (wo)?

von Diotor (Gast)


Lesenswert?

Es funktioniert nach dem Schreiben der Adresse nicht mehr. Das EEPROM 
schickt vermutlich kein Acknowledge.
Die I2C Funktionen sind vom C18 Compiler.

von Lehrmann M. (ubimbo)


Lesenswert?

Diotor schrieb:
> Die LEDs sind zu Debugging Zwecke, kann es mit
> Proteus nicht simulieren, da ich nur die Demo habe.

Servus,

schick mal alles was man für die Simulation in Proteus braucht + 
kompiliertes hex ... dann jag ich dir das mal kurz durch Proteus ...
kruszi2@web.de

Gruß

von Diotor (Gast)


Lesenswert?

Es lassen sich leider auch keine Designs abspeichern.

von Lehrmann M. (ubimbo)


Lesenswert?

Hmm, dann kompilier mir zumindest mal die Sourcefiles ... dann bastle 
ich das gerade selber hin ...

von Diotor (Gast)


Lesenswert?

Noch etwas zum verständnis:
Braucht nur der PIC Sourcefiles oder auch das EEPROM (für das Senden des 
ACK)

von Diotor (Gast)


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)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.