Vai al contenuto
PLC Forum


Pic16f876 E Eeprom - piccolo problema...


deebae

Messaggi consigliati

Ciao ragazzi, ho montato questo circuito su una breadboard:

cirORb.JPG

il programma del PIC è il seguente (lo scopo è quello di scrivere dei valori su una eeprom esterna 24LC32A):

#include "pic1687x.h"

#include "macro.h"

#include "delay.c"

#include "exteprom.c"

#include "i2c.c"

void main() {

BYTE idDevice1;

BYTE data1;

WORD address1;

ADCON0 = 0x00; // Disabilita A/D convertitore

ADCON1 = 0x07; // Configura PortA come digitale

PORTA = 0x00; // Reset ogni linea

PORTB = 0x00; // Reset ogni linea

PORTC = 0x00; // Reset ogni linea

TRISA = 0x00; // Tutte le porte definite come output

TRISB = 0x00; // Tutte le porte definite come output

TRISC = 0x00; // Tutte le porte definite come output

PORTB = 0b00000001; //lampeggio i led per prova

DelayMs(250);

PORTB = 0b00000000;

DelayMs(250);

PORTB = 0b00000001;

DelayMs(250);

PORTB = 0b00000000;

DelayMs(250);

DelayMs(250);

I2cInitMaster(); // Init I2c in modalità master

idDevice1 = 0x00; // Identificativo del device1

address1 = 0x00AA; // Indirizzo della cella eeprom utilizzato

data1 = 0x60; // Valore da scrivere nella eeprom

PORTB = 0x00; // Reset led

DelaySec(1);

ExtEpromWrite(idDevice1, address1, data1); // Scrive dato

ExtEpromWrite(idDevice1, 0x0001, 0x11); // Scrive dato

ExtEpromWrite(idDevice1, 0x0002, 0x12); // Scrive dato

ExtEpromWrite(idDevice1, 0x0003, 0x13); // Scrive dato

ExtEpromWrite(idDevice1, 0x00B2, 0x22); // Scrive dato

ExtEpromWrite(idDevice1, 0x00A0, 0x64); // Scrive dato

ExtEpromWrite(idDevice1, 0x00A1, 0x65); // Scrive dato

ExtEpromWrite(idDevice1, 0x00A0, 0x64); // Scrive dato

ExtEpromWrite(idDevice1, 0x00A2, 0x66); // Scrive dato

//lampeggio il led alla RB0, fine programma

TRISB = 0;

DelayMs(250);

PORTB = 0b11111111;

DelayMs(250);

PORTB = 0b00000000;

DelayMs(250);

PORTB = 0b11111111;

DelayMs(250);

PORTB = 0b00000000;

DelayMs(250);

PORTB = 0b11111111;

DelayMs(250);

PORTB = 0b00000000;

DelayMs(250);

PORTB = 0b11111111;

DelayMs(250);

PORTB = 0b00000000;

DelayMs(250);

PORTB = 0b11111111;

DelayMs(250);

PORTB = 0b00000000;

DelayMs(250);

PORTB = 0b00000001;

DelayMs(250);

PORTB = 0b00000000;

Link al commento
Condividi su altri siti


DIMENTICAVO: per programmarlo uso ic-prog con queste impostazioni di fuses (di default)

WDT V

PWRT

BODEN V

LVP V

CPD

WRT V

DEBUGGER

e compilo con PICCLITE.

Link al commento
Condividi su altri siti

infatti, pensavo anch'io fosse un problema di WatchDog, ma ho provato a disibilitarlo ma nulla! Ho provato anche con il BrownOutReset che riguarda l'alimentazione (se scende oltre a una certa sogna resetta il pic se non sbaglio) ma non cambia proprio niente. La cosa che mi stupisce è che il programma funziona solo a volte (solo a volte arriva al lampeggio di fine programma) con la eeprom collegata correttamente, se invece scollego (run-time) la linea SDA o SCL il programma arriva sempre alla fine senza mai riavviarsi prima. Non capisco....

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...