Imparare a scrivere una eeprom partendo da 0

  • lo_sty
  • Autore della discussione
  • Giovane Utente
  • Giovane Utente
Di più
9 Anni 9 Mesi fa #11 da lo_sty
Risposta da lo_sty al topic Imparare a scrivere una eeprom partendo da 0
Mi dite se c'è qualcosa di sbagliato ?

file.h
Code:
//#include xxxxxxxx.h #define TRIS_CLK TRISCbits.TRISC6 #define TRIS_DAT TRISCbits.TRISC7 #define PORT_CLK TRISCbits.RC6 #define PORT_DAT TRISCbits.RC7 #define LAT_CLK PORT_CLK #define LAT_DAT PORT_DAT #define I2C_ACK 0x01 #define I2C_NAK 0x00 #define DLY_BUS 50 void Delay_I2C(unsigned long param) ; void Start_I2C(void) ; void Send_byte_I2C(unsigned char param) ; unsigned char Receive_byte_I2C(unsigned char param) ; void Stop_I2C(void) ;

file.c
Code:
// I2C fatto a mano per PIC32 #include <p18f4550.h> #include "New_I2C.h" //----------------------------------------------------------------------------------------------- // SEQUENZA DI DELAY //----------------------------------------------------------------------------------------------- void Delay_I2C(unsigned long param) { unsigned long timer; timer = param; while (timer != 0) { timer--; //ClrWdt(); //NOP(); } } //----------------------------------------------------------------------------------------------- // SEQUENZA DI START //----------------------------------------------------------------------------------------------- void Start_I2C(void) { TRIS_DAT = 1 ; TRIS_CLK = 1 ; Delay_I2C(DLY_BUS); TRIS_DAT = 0; Delay_I2C(DLY_BUS); TRIS_CLK = 0; Delay_I2C(DLY_BUS); } //----------------------------------------------------------------------------------------------- // SEQUENZA DI TRASMISSIONE BYTE //----------------------------------------------------------------------------------------------- void Send_byte_I2C(unsigned char param) { unsigned char park_dato; unsigned char i; unsigned char result; park_dato = param; for (i = 0; i < 8 ; i++) { TRIS_CLK = 0 ; if ((park_dato & 0x80) == 0x80) { TRIS_DAT = 1; } else { TRIS_DAT = 0; } Delay_I2C(DLY_BUS); TRIS_CLK = 1; Delay_I2C(DLY_BUS); park_dato = park_dato<<1; } TRIS_DAT = 1; Delay_I2C(DLY_BUS); TRIS_CLK = 1; Delay_I2C(DLY_BUS); if (PORT_DAT == 1){ Reset(); } TRIS_CLK = 0; Delay_I2C(DLY_BUS); return result; } //----------------------------------------------------------------------------------------------- // SEQUENZA DI RICEZIONE BYTE //----------------------------------------------------------------------------------------------- unsigned char Receive_byte_I2C(unsigned char param) { unsigned char i; unsigned char park_dato = 0; TRIS_DAT = 1; for (i = 0 ; i < 8 ; i++) { Delay_I2C(DLY_BUS); TRIS_CLK = 1; park_dato = park_dato<<1; if (PORT_LDAT == 1) park_dato++; Delay_I2C(DLY_BUS); TRIS_CLK = 0; } if (param == I2C_ACK) TRIS_DAT = 0; Delay_I2C(DLY_BUS); TRIS_CLK = 1;; Delay_I2C(DLY_BUS); TRIS_DAT = 1; TRIS_CLK = 0; Delay_I2C(DLY_BUS); return park_dato; } //----------------------------------------------------------------------------------------------- // SEQUENZA DI STOP //----------------------------------------------------------------------------------------------- void Stop_I2C(void) { TRIS_DAT = 0; Delay_I2C(DLY_BUS); TRIS_CLK = 1; Delay_I2C(DLY_BUS); TRIS_DAT = 1; Delay_I2C(DLY_BUS); }

Programma
Code:
#include <stdio.h> #include <stdlib.h> #include <p18f4550.h> #include "New_I2C.h" /* * Inizializzo il PIC18f4550 */ #pragma config FOSC = HS // Alta frequenza #pragma config WDT = OFF // Watchdog abilitato #pragma config LVP = OFF // Programmazione low power disabilitata #pragma config PBADEN = OFF // Ingressi analogici disabilitati #define LED1 LATDbits.LATD0 // led start #define LED2 LATDbits.LATD1 // led stop #define BtnStart PORTBbits.RB5 // avvio programma /* * Dichiaro le funzioni della libreria */ void Delay_I2C(unsigned long param) ; void Start_I2C(void) ; void Send_byte_I2C(unsigned char param) ; unsigned char Receive_byte_I2C(unsigned char param) ; void Stop_I2C(void) ; /* * Inizio il programma */ void main (void) { // Inizializzo le porte del pic // LATA = 0x00 ; TRISA = 0xFF ; LATB = 0x00 ; TRISB = 0b11111111 ; LATC = 0x00 ; TRISC = 0b00111111; LATD = 0x00 ; TRISD = 0b11111100 ; LATE = 0x00 ; TRISE = 0xFF ; LED1 = 0 ; LED2 = 0 ; while (1) { // Programma // if (BtnStart == 0) { // Premo il pulsante Delay_I2C (100000) ; // Aspetto 300 millisecondi if (BtnStart == 0) { // Se il pulsante è ancora premuto LED1 = 1 ; // Accendo il LED1 Delay_I2C (100000) ; // Aspetto 300 millisecondi Start_I2C ; // Invio lo start Send_byte_I2C(0xA0) ; // Invio l'indirizzo della Eeprom con il bit di scrittura Send_byte_I2C(0x00) ; // Invio l'indirizzo del blocco di memoria Send_byte_I2C(0xAA) ; // Invio il valore da scrivere nel blocco Stop_I2C ; // Invio lo stop Delay_I2C (30000) ; // Aspetto 300 millisecondi LED1 = 0 ; // Spendo il LED1 LED2 = 1 ; // Accendo il LED2 Delay_I2C (100000) ; // Aspetto 1 secondo LED2 = 0 ; // Spengo il LED2 } } } }

Uso MPlabX con C18

Si prega Accesso o Crea un account a partecipare alla conversazione.

  • lo_sty
  • Autore della discussione
  • Giovane Utente
  • Giovane Utente
Di più
9 Anni 9 Mesi fa #12 da lo_sty
Risposta da lo_sty al topic Imparare a scrivere una eeprom partendo da 0
Mi sono fatto prestare un oscilloscopio ed ho usato la Delay_I2C impostata a 0 per accendere e spegnere un pin .
L'oscilloscopio mi mostra una bella onda quadra di 33Khz . Questo mi fa capire che la delay che uso non va bene e dovrò utilizzare il Timer0 con gli interrupt

Si prega Accesso o Crea un account a partecipare alla conversazione.

  • Mauro Laurenti
  • Moderatore
  • Moderatore
Di più
9 Anni 9 Mesi fa #13 da Mauro Laurenti
Risposta da Mauro Laurenti al topic Imparare a scrivere una eeprom partendo da 0
Una nota.
Il clock viene impostato dal master e lo slave si adegua visto che usa il clock fornito dal master.

Rimanendo nelle specifiche del bus, se invece di impostare 100KHz hai 33KHz, il tutto deve ancora funzionare.
Se non funziona il problema non lo devi ricercare nella frequenza sbagliata bensì altrove.

Se hai un oscilloscopio prova ad inviare in maniera continua dei dati e verifica che siano effettivamente trasmessi.
Poi collega il tuo slave device e verifica che effettivamente risponda.

Saluti,

Mauro

Si prega Accesso o Crea un account a partecipare alla conversazione.

Moderatori: Mauro LaurentiStefAMatteo Garia

Registrati al sito

Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.

Registrati al sito LaurTec.

Forum - Ultimi messaggi