www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PIC18F13K50 I2C


Autor: Diotor (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.
//PIC18F13K50

#include <p18cxxx.h>
#include <i2c.h>  
#include "delays.h"                    
 
#pragma config FOSC = IRC   //OSCCON auf 16MHz
//#pragma OSCCON = 0x07; //16MHz
#pragma config PWRTEN = ON
#pragma config BOREN = OFF
#pragma config WDTEN= OFF  //Watchdog Timer
#pragma config LVP = OFF  //Low Voltage ICSP


#pragma code

  unsigned char adress = 0b1010000; //Adresse 1010000 des EEPROMS
  unsigned char reg =0x00;
  unsigned char value = 0b10011011;
  //unsigned char readvalue = 0x00;


void setBits(void)
{
  //hier aendern auf B4 und B6
  TRISBbits.TRISB4 = 1; //INPUT fuer SDA
  TRISBbits.TRISB6 = 1; //INPUT fuer SCL
}

void writeEEPROM(void) 
{
  IdleI2C();
  StartI2C();
  if (!DataRdyI2C())  
    WriteI2C(0b10100000); //0 anhaengen fuer Schreibmodus
  IdleI2C();
  if (!DataRdyI2C())  
    WriteI2C(reg);  
  IdleI2C();
  if (!DataRdyI2C())
     WriteI2C(value); 
  IdleI2C();
  StopI2C();
}

unsigned char readEEPROM(void)
{
  unsigned char EEPROMvalue = 0x00;
  IdleI2C();
  StartI2C();
  if (!DataRdyI2C())  
    WriteI2C(0b10100000); //0 anhaengen fuer Schreibmodus 
  IdleI2C();
  if (!DataRdyI2C())  
    WriteI2C(reg);  
  IdleI2C();
  StartI2C();  //repeated start
  if (!DataRdyI2C())
     WriteI2C(0b10100001); // 1 anhaengen fuer Lesemodus 
  IdleI2C();
  //if (DataRdyI2C())
     EEPROMvalue = ReadI2C();  
  IdleI2C();
  StopI2C();
  return EEPROMvalue;
}

void led(unsigned char readvalue)
{
  int i=0;
  TRISAbits.TRISA5 = 0; //R4+R5 Outputs
  TRISCbits.TRISC5 = 0;
  LATA=0x00;
  LATC=0x00;
  //immer 2 Bit  
  for (i=0; i<4; i++)
  {
    LATAbits.LATA5 = readvalue >> (2*i);
        Delay10KTCYx(1000);
    LATCbits.LATC5 = readvalue >> (1+2*i);
        Delay10KTCYx(1000);
  }

}

void main(void)
{
  unsigned char EEPROMvalue = 0x00;
  setBits();
  OpenI2C(MASTER, SLEW_OFF);  //Master + 100kHz Mode
  OSCCON = 0b01110110; // 16MHz
  SSPADD = 0x27; //Baudrate: takt/4(sspadd+1) bei FOSC 100
  //SSPCON2 = 0x01; //Controlbits senden beginnen
  writeEEPROM();
  //led(readEEPROM());
  while(1)
  {
    led(readEEPROM());
  }
}   
wäre über Hilfe sehr dankbar


Autor: Helfer (Gast)
Datum:

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

Autor: Diotor (Gast)
Datum:

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

Autor: Lehrmann Michael (ubimbo)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Diotor (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es lassen sich leider auch keine Designs abspeichern.

Autor: Lehrmann Michael (ubimbo)
Datum:

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

Autor: Diotor (Gast)
Datum:

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

Autor: Diotor (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.