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 Daniel - 24.05.2013 8:51)
Als Antwort auf Re: Performanceprobleme (wahrscheinlich I²C-Bus) von Franz-Peter - 17.05.2013 11:48

> > > > > > > > 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, w
> >                                                                         //elche 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
> > > >
> > > >
> > > > ich bräuchte aber eine Auflösung von einer ms.
> > > > bei 10 ms Interrupt hätte ich ja nur die Einstellmöglichkeit alle 10ms oder sehe ich das falsch?
> > >
> > > Dann nimm Dir einen Timer und erzeuge einen 1ms Interrupt. Ist alles in den Demo Programmen
> > > im "Timer" Ordner.
> >
> > mit Interupts ist aber dann das Problem, dass ich nicht beide Signale zeitgleich steuern kann.
>
> Warum nicht? Du kannst in dem Interrupt im 1ms Takt entscheiden, ob das Signal ein- oder
> ausgeschaltet ist. Du kannst natürlich auch in einem Interrupt beide Signale zeitgleich ein- oder
> ausschalten. Ich bin mir nur nicht sicher, ob der Interpreter bei einem 1ms Takt nicht langsam an
> seine Grenze kommt. Du musst auf jeden Fall die Interruptroutine sehr effizient programmieren.
> Franz-Peter

Der Grund weswegen ich denke, dass es Probleme macht ist, dass ein Interrupt immer das Hauptprgramm anhält und
somit würde es Probleme machen während ein Signal erzeugt wird ein anderes zu erzeugen und zeitgleich auch noch
die Abfrage der Potis machen mit denen ich die Signalzeiten berechnen will. Oder habe ich einen kompletten
Denkfehler mit den Interupts?


    Antwort schreiben


Antworten:

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)