Kommentar: Einfügen von HTML im Kommentar: Link einfügen: <a href="LINKURL" target="_blank">LINKTITEL</a> Bild einfügen: <img src="BILDURL"> Text formatieren: <b>fetter Text</b> <i>kursiver Text</i> <u>unterstrichener Text</u> Kombinationen sind auch möglich z.B.: <b><i>fetter & kursiver Text</i></b> C Quellcode formatieren: <code>Quellcode</code> BASIC Quellcode formatieren: <basic>Quellcode</basic> (Innerhalb eines Quellcodeabschnitts ist kein html möglich.) Wichtig: Bitte mache Zeilenumbrüche, bevor Du am rechten Rand des Eingabefeldes ankommst ! -> I > > > > > > > > > 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?