Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum

Re: Performanceprobleme (wahrscheinlich I²C-Bus) Kategorie: Programmierung C (von PeterS - 15.05.2013 14:48)
Als Antwort auf Re: Performanceprobleme (wahrscheinlich I²C-Bus) von Daniel - 15.05.2013 14:04

> > > Hallo zusammen.
> > > Ich hab da nen Problem:
> > >
> > > Ich programmiere mit dem CControl Pro Mega 32 eine Steuerung, welche zwei Rechtecksignale erzeugt.
> > > Die Rechtecksignale sind mit 4 Potis einstelbar, welche ich über I²C Bus eingebunden habe.
> > > Einstelbar ist mit den Potis: Frequenz beider Signale, Highphasendauer von Signal 1 und 2
> > > sowie die Phasenverscheibung der beiden Signale zueinander.
> > > Des weiteren lasse ich mir die Werte auf einem Display (ebenfalls I²C Bus) anzeigen.
> > > Einstelbar sind die Zeiten von 10ms - 500ms in 1 ms schritten.
> > > Das Funktioniert alles soweit auch ganz gut jedoch wenn ich die Werte mit 200KHz Abtaste um zu
> > > schauen wie stark die zeiten schwanken sehe ich, dass es immer wieder Sprünge von 10ms gibt.
> > > Das heisst, ich habe anstatt 50ms High Phase ab und zu eine 60ms High Phase wobei der Wert
> > > ansonsten bei 49,5-50,5ms schwankt (was super ist)
> > >
> > >
> > > Zum Programm:
> > >
> > > Ich habe 4 Threats am laufen:
> > > Threat 1:
> > > Abholen der Potiwerte über I²C, umrechnung in ms und anschliessen ausgabe auf dem Display.
> > > Threat 2:
> > > Erzeugen des Rechtecksignals 1 sowie starten von Threat 3
> > > Threat 3:
> > > Phasenverschiebungsdauer abwarten und Starten des Threat 4
> > > Threat 4:
> > > Erzeugen des Rechtecksignals 2
> > >
> > >
> > > Erkenntnisse aus der Fehlersuche:
> > > Ich habe den Potiwerten feste zahlen vorgegeben und die Abfrage gestoppt.
> > > bei der anschliessenden auswertung des Signale waren keine Sprünge mehr zu sehen.
> > >
> > >
> > > Programmausschnitt der Auskommentiert wurde:
> > >  for(k=1;k<7;k++)                                        //6 ist Anzahl der Kanäle die gelesen werden sollen
> > >     {
> > >
> > >         I2C_Disable();
> > >         for(l=0;l<3;l++)                                    //dreimaliges abholen des gleichen Eingangs um den
> > >                                                             //Medianwert zu bestimmen, welcher ausreisser wluckt
> > >         {
> > >           I2C_Start();                                      //starten des I²C Buses
> > >           I2C_Write(I2C_AdresseW);                          //schreiben der Adresse zum Schreiben
> > >           I2C_Write(DAT[k]);                                //Senden der Daten um den Eingang abzuholen
> > >           I2C_Start();                                      //erneutes starten des I²C Buses für erneute anfrage
> > >           I2C_Write(I2C_AdresseR);                          //schreiben der Adresse zum Lesen
> > >           MSB= I2C_Read_ACK();                              //Lesen des MSB
> > >           LSB= I2C_Read_NACK();                             //Lesen des LSB
> > >           I2C_Stop();                                       //Stoppen des I²C Buses
> > >           MSB=MSB*0x100;                                    //erhöhung des MSB damit er mit LSB verrechnet werden
> > >                                                             //kann(0x00AA *0x100 ergibt 0xAA00)
> > >           MSBLSB=(MSB+LSB);                                 //verknüpfung des MSB mit dem LSB
> > >
> > >
> > >           Mittelwertbildung[l]=MSBLSB;
> > >
> > >
> > >         }
> > >         sortieren();                                        //öffnen der Sortierfunktion, welche die Daten nach gröÃ?e
> > >                                                             //(=> Median = der Mittlere Wert)
> > >
> > >
> > > Frage:
> > > hat jemand eine Idee wo diese Ausreisser herkommen können?
> >
> > Die Threads arbeiten mit Zeitscheiben von 10ms. Um ein Ausgangssignal zu erzeugen,
> > würde ich die Timer vorschlagen. Siehe dort Frequenzerzeugung.
> >
> > Gruss Peter
>
> wie meinst du das mit Timer?
> ich weiss dass es ne funktion gibt die Ein Rechtecksignal erzeugen soll jedoch nicht in der von mir gewünschten auflösung.
>

Hmm, Timer 0 hat nur 8-Bit, der kann nur maximal ein 39ms Signal erzeugen. Alternativ nimm
den 10ms Interrupt und erzeuge die Signale in der Interrupt Routine. Sieh mal in die
LCD_2 Demo, dort wird der 10ms Interrupt genutzt (INT_TIM2COMP).

Gruss Peter


    Antwort schreiben


Antworten:

Re: Performanceprobleme (wahrscheinlich I²C-Bus) (von Daniel - 15.05.2013 15:39)
    Re: Performanceprobleme (wahrscheinlich I²C-Bus) (von PeterS - 15.05.2013 18:01)
        Re: Performanceprobleme (wahrscheinlich I²C-Bus) (von Daniel - 16.05.2013 15:38)
            Re: Performanceprobleme (wahrscheinlich I²C-Bus) (von Franz-Peter - 17.05.2013 11:48)
                Re: Performanceprobleme (wahrscheinlich I²C-Bus) (von Daniel - 24.05.2013 8:51)
                    Re: Performanceprobleme (wahrscheinlich I²C-Bus) (von Torsten - 24.05.2013 19:08)
                       Re: Performanceprobleme (wahrscheinlich I²C-Bus) (von Franz-Peter - 25.05.2013 17:07)
                          Re: Performanceprobleme (wahrscheinlich I²C-Bus) (von Daniel - 11.06.2013 10:28)
                             Re: Performanceprobleme (wahrscheinlich I²C-Bus) (von Torsten - 15.06.2013 6:12)