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
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
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
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
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ß
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
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 } }
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
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 }
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.