Forum: Digitale Signalverarbeitung / DSP / Machine Learning dspic33fj256


von Gast (gast) (Gast)


Lesenswert?

Hallo zusammen,

also beim compelieren von einem Programm, das ich von hier runtergeladen 
habe für einen I2C-Bus, kriege ich folgende Fehlermeldung: "ICDWarn0046: 
Because clock switching is enabled, MPLAB ICD 2 requires the user to 
cycle target power after a program operation."

kann mir jemand bitte sagen was das ist.

Noch eine blöde Frage: wenn ich den dsPIC33 selber programmmieren will, 
womit soll ich anfangen? und gibt es Hilfsblätter dafür?
Danke im Voraus

von Franko P. (sgssn)


Lesenswert?

Hallo

Da es sich "nur" um eine Warnung handelt, wird dein Programm trotzdem 
laufen.
Wenn du dir das datenblatt anschaust und nach dem Begriff "clock 
switching" suchst, wirst du die Kapitel 6.1 "Clock Source Selection at 
reset" und 9.2 "Clock switching Operation" finden. Dort gibt es auch 
einen Verweis auf Kapitel 22.1 "Configuration Bits". Wenn ich das 
richtig interpretiere, was da steht, könntes du im Betrieb den Takt 
wechslen oder umschalten. Wenn du das nich willst, musst du bei den 
Configurationsbits das Clock Switching auf disable stellen. dann ist 
wohl diese fehlermeldung weg.

Die dsPIC's sind schon etwas anspruchsvoll. Sind ja aufgrund ihrer 
Ausstattung mit DSP-Fähigkeit z.B. für FFT's und Filter geeignet.
Also wie wärs mit nem Audiofilter oder einer Frequnzanalyse ?
Du kannst ja mal mit ner Analog-Digital-Wanlung anfangen.

Applikationen findest du auf der Seite von Microchip:
www.microchip.com

gerhard

von Gast (gast) (Gast)


Lesenswert?

vielen Dank Gerhard,

ich kann zwar mit C programmieren, aber ich habe wenig erfahrung mit dem 
µC. Kannst du mir bitte sagen die vorgehensweise aussieht. Ich möchte 
das Programm selber schreiben. Oder besser gesagt den dsPIC verstehen
Danke

von Franko P. (sgssn)


Lesenswert?

Hallo
C Programmierkenntnisse sind schon mal nicht schlecht.

Bei Microchip gibts (oder gabs zumindest mal) die Programmierumgebung 
kostenlos. 1. MPLAB und 2. C-Kompiler als Studentenversion. Aber das 
weisst/hast du vermutlich schon.

Ein bisschen selber rantasten bleibt dir nicht erspart. Hoer gibts das 
Datenblatt:
http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en024677
Reinlesen ist sinnvoll.

Und hier gibts Code-Beispiele:
http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1408

Vielleicht hilft dir das weiter.

Gruß
Gerhard

von Gast (gast) (Gast)


Lesenswert?

Super.
Danke.
ich habe zwei programme runtergelagen die heissen:
1. "CE119_I2C_EEPROM_14aug09"
2. "CE145_I2C_Slave_120309"

und ich habe eine kleine Tem.sensorplatine und möchte die Daten mit I2C 
lesen.
welche von den Beiden soll ich nehmen.

Gruß

von Franko P. (sgssn)


Lesenswert?

Hallo
ich würde jetzt mal die erste nehemen, da dein uC kein Slave ist. das 
EEPROM wird zwar gelesen und geschrieben und du willst nur lesen (nehm 
ich mal an), also könnte das besser passen.

Gruß
Gerhard

von Gast (gast) (Gast)


Lesenswert?

ich kann das Programm Zwar Conpelieren und debugen aber ich kriege kein 
Clk in die beiden I2C Ports. nue in OSC2 so sieht das main aus:
#if defined(_dsPIC33F_)
#include "p33Fxxxx.h"
#elif defined(_PIC24H_)
#include "p24Hxxxx.h"
#endif

#include "I2CSlaveDrv.h"  //Include file for I2C1 Driver

// Confiuration Register Settings
// Internal FRC Oscillator
_FOSCSEL(FNOSC_FRC);    // FRC Oscillator
_FOSC(FCKSM_CSECMD & OSCIOFNC_OFF  & POSCMD_NONE);
                // Clock Switching is enabled and Fail Safe Clock 
Monitor is disabled
                // OSC2 Pin Function: OSC2 is Clock Output
                // Primary Oscillator Mode: Disabled


_FWDT(FWDTEN_OFF);              // Watchdog Timer Enabled/disabled by 
user software


//Begin the Main Fucntion

int main(void)
{
  unsigned int i;
  // Configure Oscillator to operate the device at 40Mhz
  // Fosc= Fin*M/(N1*N2), Fcy=Fosc/2
  // Fosc= 7.37*43/(2*2)=80Mhz for 7.37 input clock
  PLLFBD=41;          // M=43
  CLKDIVbits.PLLPOST=0;    // N1=2
  CLKDIVbits.PLLPRE=0;    // N2=2
  OSCTUN=0;          // Tune FRC oscillator, if FRC is used

  // Disable Watch Dog Timer
  RCONbits.SWDTEN=0;

  // Clock switch to incorporate PLL
  __builtin_write_OSCCONH(0x01);    // Initiate Clock Switch to
                    // FRC with PLL (NOSC=0b001)
  __builtin_write_OSCCONL(0x01);    // Start clock switching
  while (OSCCONbits.COSC != 0b001);  // Wait for Clock switch to occur

  // Wait for PLL to lock
  while(OSCCONbits.LOCK!=1);
  //Now PLL is ready
  for(i = 0;i<256;i++)
  {
    RAMBuffer[i] = i;  //Initlize RAMBuffer with some value
              //in case MasterI2C device wants to read
              //before it writes to it.
  }
  i2c1_init();
  while(1)
  {
    //Do your application task
  }
}

von Franko P. (sgssn)


Lesenswert?

Hallo
ich habe mich noch nicht mit I2C beschäftigt. Bei SPI ist es so, dass 
der Takt nur erzeugt wird, wenn daten übertragen werden.
In deinem Code werden keine Daten übertragen, evtl fehlt deswegen auch 
der Takt.

Hier ist ein Link auf die ausführliche Beschreibung des I2C-Busses der 
dsPIC33 Familie:

http://ww1.microchip.com/downloads/en/DeviceDoc/70195C.pdf

Vielleicht hilft dir das weiter.

Gruß
Gerhard

von Gast (gast) (Gast)


Lesenswert?

es gibt auch


#if defined(_dsPIC33F_)
#include "p33Fxxxx.h"
#elif defined(_PIC24H_)
#include "p24Hxxxx.h"
#endif

#include "I2CSlaveDrv.h"

unsigned char RAMBuffer[256];  //RAM area which will work as EEPROM for 
Master I2C device
unsigned char *RAMPtr;      //Pointer to RAM memory locations
struct FlagType Flag;

/*****************************************************************
    Init I2C1 Bus
*****************************************************************/
void i2c1_init(void)
{
  #if !defined(USE_I2C_Clock_Stretch)
    I2C1CON = 0x8000;  //Enable I2C1 module
  #else
    I2C1CON = 0x9040;  //Enable I2C1 module, enable clock stretching
  #endif


  I2C1ADD = 0x50;      // 7-bit I2C slave address must be initialised 
here.

  IFS1=0;
  RAMPtr = &RAMBuffer[0];  //set the RAM pointer and points to beginning 
of RAMBuffer
  Flag.AddrFlag = 0;  //Initlize AddFlag
  Flag.DataFlag = 0;  //Initlize DataFlag
  _SI2C1IE = 1;
}

/*
Function Name: SI2C1Interrupt
Description : This is the ISR for I2C1 Slave interrupt.
Arguments   : None
*/
void __attribute__((interrupt,no_auto_psv)) _SI2C1Interrupt(void)
{
  unsigned char Temp;  //used for dummy read

  if((I2C1STATbits.R_W == 0)&&(I2C1STATbits.D_A == 0))  //Address 
matched
    {
      Temp = I2C1RCV;    //dummy read
      Flag.AddrFlag = 1;  //next byte will be address
    }
  else if((I2C1STATbits.R_W == 0)&&(I2C1STATbits.D_A == 1))  //check for 
data
    {
      if(Flag.AddrFlag)
      {
        Flag.AddrFlag = 0;
        Flag.DataFlag = 1;  //next byte is data
        RAMPtr = RAMPtr + I2C1RCV;
        #if defined(USE_I2C_Clock_Stretch)
          I2C1CONbits.SCLREL = 1;  //Release SCL1 line
        #endif
      }
      else if(Flag.DataFlag)
      {
        *RAMPtr = (unsigned char)I2C1RCV;// store data into RAM
        Flag.AddrFlag = 0;//end of tx
        Flag.DataFlag = 0;
        RAMPtr = &RAMBuffer[0];  //reset the RAM pointer
        #if defined(USE_I2C_Clock_Stretch)
          I2C1CONbits.SCLREL = 1;  //Release SCL1 line
        #endif
      }
    }
  else if((I2C1STATbits.R_W == 1)&&(I2C1STATbits.D_A == 0))
  {
    Temp = I2C1RCV;
    I2C1TRN = *RAMPtr;  //Read data from RAM & send data to I2C master 
device
    I2C1CONbits.SCLREL = 1;  //Release SCL1 line
    while(I2C1STATbits.TBF);//Wait till all
    RAMPtr = &RAMBuffer[0];  //reset the RAM pointer
  }
  _SI2C1IF = 0;  //clear I2C1 Slave interrupt flag
}

von Gast (gast) (Gast)


Lesenswert?

ich glaube hier ist meinen dsPIC33 als Slave definiert worden und nicht 
als master

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.