Sensor Aktor Modul - Drehzahlberechnung bei versch. Spannungen



  • So, bin jetzt weitergekommen und die Simulation funktioniert auch.
    Es gibt nur noch ein Problem:

    Bei der Eingabe der Spannung, ist die erste Ausgabe 0 . Mit der nächsten Eingabe wird der vorherige Wert genommen. Vermute irgendwo einen Schleifenfehler.

    Kann mir jetzt jemand helfen?

    ----------------------------------
    Beispiel:
    "Geben Sie eine Motorspannung von 0 bis 5V ein:" 3
    Drehzahl: 0
    Motorspannung:0

    "Geben Sie eine Motorspannung von 0 bis 5V ein:" 2
    Drehzahl: 3270 u/min
    Motorspannung:3 Volt

    "Geben Sie eine Motorspannung von 0 bis 5V ein:" 5
    Drehzahl: 2040 u/min
    Motorspannung:2 Volt

    Kann ich den Thread selbst in ein anderes Forum schieben? Falls nicht könnte es ja der Moderator machen.
    Danke schonmal

    //Schalter für das Benutzen des Sensor-Aktor-Modul-Dummys
    //auskommentiert: Zugriff auf reale Hardware
    //nicht auskommentiert: Dummy wird verwendet
    #define _SIMULATION
    //Einbinden der Funktionen für den Zugriff
    //auf das Sensor-Aktor-Modul
    #include "SensorAktor.h"
    
    //zusätzliche (Standard-)Funktionsbibliotheken einbinden
    #include <stdio.h>	
    #include <windows.h>
    
    //Vorschlag für Funktionsprototypen
    int low,high,highn,gesamtzaehler,zaehler,motorspannunga;
    double msve,msva;
    bool status;
    
    //Motorspannung schreiben
    
    void Schreiben()
    {
    	WriteCommand(0); //status false
    	status=ReadStatus();      // Statusbit abfragen
    
    	while (status==false)
    	{	printf ("Geben Sie eine Motorspannung von 0 bis 5V ein:");
    	//msve=0.0;
    	scanf_s("%lf",&msve);  //motorspannung in volt
    	WriteCommand(3);	//Statusbit Spannung setzen
    	status=ReadStatus();
    	}
    	msva=(msve/5)*255;
    	int daten= (int) msva;		//Gleitkommazahlwert in integer wert umformen
    	WritePortB(daten); // schreibt die Daten an Port B
    
    }
    //Motordrehzahl auslesen
    
    void Lesen()
    {	
    	//Messzeit abwarten
    	Sleep(1000);
    
    	WriteCommand(0); //status false
    	status=ReadStatus();      // Statusbit abfragen
    
    	while (status==false)
    	{
    		WriteCommand(7); //Zähler löschen
    		status=ReadStatus();      // Statusbit abfragen
    	}
    
    	//Messzeit abwarten
    	Sleep(1000);
    
    	//Zähler Low lesen
    
    	WriteCommand(0); //status auf false setzen
    	status=ReadStatus();      // Statusbit abfragen
    
    	while (status==false)
    	{
    		WriteCommand(8); //Zähler low auslesen
    		status=ReadStatus();      // Statusbit abfragen
    	}
    
    	low = ReadPortA(); // liest die Daten für low von Port A
    
    	//Zähler high lesen
    
    	WriteCommand(0); //status false
    	status=ReadStatus();      // Statusbit abfragen
    
    	while (status==false)
    	{
    		WriteCommand(9); //Zähler High lesen
    		status=ReadStatus();      // Statusbit abfragen
    	}
    
    	high  = ReadPortA();
    
    	//Zählerzahl berechnen
    	highn=high*256;
    
    	zaehler=low+highn;
    	gesamtzaehler=(zaehler*60)/4;	//Umdrehungszahl (U/min)= (zaehler mal 60 sekunden)/4 Schlitze pro Umdrehung)
    	printf ("\Drehzal:%d u/min \n\n\n",gesamtzaehler);
    
    	//Motorspannung auslesen
    	WriteCommand(0); //status false
    	status=ReadStatus();      // Statusbit abfragen
    
    	while (status==false)
    	{
    		WriteCommand(4); //Sollwert Motor Spannung lesen 
    		status=ReadStatus();      // Statusbit abfragen
    	}
    	//Auslesen aus Port A
    	motorspannunga  = ReadPortA();
    	motorspannunga=(motorspannunga*5)/255;
    	printf ("\Motorspannung:%d V\n\n\n",motorspannunga);
    
    }
    
    //Hauptprogramm
    
    void main (void)
    {
    	IsPCI6503Available();
    	msve=0.01;
    	status==false;
    	//Eigenes Programm
    	while (msve!=0.0)
    	{
    		//Motorspannung schreiben
    		Schreiben();
    		Lesen();
    
    	}
    	// Schleife verlassen, Motordrehzahl runterfahren
    	WriteCommand(0); //status false
    	status=ReadStatus();      // Statusbit abfragen
    
    	while (status==false)
    	{
    		WriteCommand(3); //Kommando Motor Spannung schreiben 
    		status=ReadStatus();      // Statusbit abfragen
    	}
    	msva=(msve/5)*255;
    	int daten= (int) msva;		//Gleitkommazahlwert in integer wert umformen
    	WritePortB(daten);			// schreibt die Daten an Port B
    
    }
    


  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) in das Forum C (C89 und C99) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


  • Mod

    Rück mal vernünftig ein. Du überschreibst erst die vorherigen Antworten und wertest dann nur die letzte Antwort aus.



  • SeppJ schrieb:

    Rück mal vernünftig ein. Du überschreibst erst die vorherigen Antworten und wertest dann nur die letzte Antwort aus.

    Habs jetzt hoffentlich richtig eingerückt.

    In welcher Zeile ist denn der Fehler? Kann mit der Antwort irgendwie nicht wirklich was anfangen 😞


  • Mod

    Bei näherer Betrachtung sieht es nur falsch aus, erklärt aber deinen Fehler nicht. Um deinen Fehler zu klären, müsste man den relevanten Code kennen. Hierzu empfehle ich den dritten Link in meiner Signatur.



  • Naja,
    hab den Fehler jetzt selber gefunden...

    Weiß nicht, bin von anderen Foren irgendwie mit mehr Hilfsbereitschaft verwöhnt.
    Ich helfe nebenbei auch gerne und oft wo ich kann, mein Wissen bezieht sich halt mehr auf die Elektronik.

    In dem Fall finde ich sollte man halt doch die Aufgabenstellung und meine Implementierung komplett kennen, soviel Text isses ja nicht und da das Anfängeraufgaben sind sollten sie ja in so einem Forum ohne Probleme verstanden werden...
    Grade bei solchen Fehlern hilft es oft wenns ein anderer mal überfliegt, wenn man selber stundenlang auf den Code gesehen hat..

    Dafür ist es doch da, dass man Hilfe von Leuten bekommt die auf dem Gebiet grade besser sind und Hilfe gibt wenn man selbst mehr Ahnung hat.

    Naja, trotzdem Danke..

    void main (void)
    {
    	IsPCI6503Available();
    	msve=0.01;
    	status==false;
    	//Eigenes Programm
    	while (msve!=0.0)
    	{
    		//Motorspannung schreiben
    
    		Lesen();
    	Schreiben();
    
    	// Schleife verlassen, Motordrehzahl runterfahren
    	WriteCommand(0); //status false
    	status=ReadStatus();      // Statusbit abfragen
    
    	while (status==false)
    	{
    		WriteCommand(3); //Kommando Motor Spannung schreiben 
    		status=ReadStatus();      // Statusbit abfragen
    	}
    	msva=(msve/5)*255;
    	int daten= (int) msva;		//Gleitkommazahlwert in integer wert umformen
    	WritePortB(daten);			// schreibt die Daten an Port B
    
    }  // Diese Klammer war falsch gesetzt hat den Block nicht mit eingeschlossen 
    
    }
    

  • Mod

    da_miez schrieb:

    Weiß nicht, bin von anderen Foren irgendwie mit mehr Hilfsbereitschaft verwöhnt.
    Ich helfe nebenbei auch gerne und oft wo ich kann, mein Wissen bezieht sich halt mehr auf die Elektronik.

    Lol, wut?

    Du liest die mit wichtig markierten Threads nicht, du schreibst im komplett falschen Forum, du zeigst den relevanten Code nicht, du stellst keine klare Frage. Du hast echt Glück, dass ich geantwortet habe und nicht eines der Forenmitglieder mit noch direkterer Sprache und findest das schon unhöflich?

    Wenn dir jemand einen Berg Elektroschrott vor die Füße schmeißt und sagt "Mach mal!", wie reagierst du dann?



  • Entschuldig, aber diese Klammer war immer da.
    Ich hab da aber noch eine Frage zu Zeile 32:

    da_miez schrieb:

    }  // Diese Klammer war falsch gesetzt hat den Block nicht mit eingeschlossen 
    
    }  // Zeile 32: Und Wozu gehört diese Klammer  :confused:
    


  • Ja, seh ich ein. War wohl etwas genervt, weil ich den ganzen Tag an so nem dämlichen Tippfehler dransaß 🙄 huch



  • Darum ist eine saubere Einrückung wichtig.
    Und die (meisten) IDEs und Editoren zeigen dir auch die Klammerpaare an.



  • Ich nehme an der Beitragsersteller programmiert mit Visual C++ von M$.

    Wenn das so ist, ich hab z.Z. kein M$ - C oder C++ Compiler am Start, wird das als C-Quelltext von Microsoft akzeptiert? Oder muss das, ich bin mir nicht ganz sicher wie viel C99 Microsoft zufällig beherrscht, unter Microsoft als C++ compiliert werden?
    Andere Compiler dürften Probleme mit Besonderheiten von Microsoft-C in dem Quelltext haben.

    Das ist halt die Frage im realen C oder C++. Nur pur theoretisch den Standard oder auch die Besonderheiten grosser Compiler-Anbieter?

    Eh jetzt jemand hektisch noch mal verschiebt. Wenn ihr das konsequent machen wollt, müsst ihr mehrere 100 Beiträge dann hier im Forum verschieben 😃
    Es gab Tage hier im Forum, an denen fast die Hälfte der Beiträge in C oder C++ falsch gelandet sind und das manchmal trotz mehrfacher Verschiebe-Aktionen.

    Wie schon angedeutet, wie perfekt wollt ihr das durchziehen 😕

    Nehmt es leicht 😉

    MfG f.-th.



  • f.-th. schrieb:

    Wenn das so ist, ich hab z.Z. kein M$ - C oder C++ Compiler am Start,

    Wen interessiert das?



  • Auch wenn die Deadline des Threadstarters schon verstrichen ist - hier mal meine aufgeräumte Lösung seines Problems:

    #define _SIMULATION
    #include "SensorAktor.h"
    #include <stdio.h>   
    #include <windows.h>
    
    unsigned char Lesen(unsigned char kommando){
    	WriteCommand(0);
    	while (ReadStatus()==true);
    	WriteCommand(kommando);
    	while (ReadStatus()==false);
    	return ReadPortA();
    }
    
    void Schreiben(unsigned char kommando, unsigned char daten){
    	WriteCommand(0);
    	while (ReadStatus()==true);
    	WritePortB(daten);
    	WriteCommand(kommando);
    	while (ReadStatus()==false);
    }
    
    void main (void){
    double x,drehzahl,spannung;
    IsPCI6503Available();
    
    do{
    		do{
    			printf("Geben Sie eine Motorspannung zwischen 0 und 5 Volt ein: ");
    			scanf("%lf",&x);
    			if (x<0 || x>5)printf("\n Bitte geben Sie einen gueltigen Wert ein!\n");
    		} while (x<0 || x>5);
    	if (x==0){Schreiben(3,0);break;}
    
    	Schreiben(3,x*51);														  //Spannung setzen *255/5
    	Lesen(7);																   //Reset
    	Sleep(1000);
    	printf ("Drehzahl: %.2f U/min \n",drehzahl=(Lesen(8)+(Lesen(9)<<8))*15);	//(Low+High[LeftShift8])*60Sek/4 Schlitze
    	printf ("Motorspannung: %.2f V\n",spannung=(double)Lesen(4)/51);			//Spannung lesen /255*5
    }while(x!=0.0);
    }
    

    Läuft so - und ist auch näher an der Aufgabenstellung was die Verwendung von Lesen() und Schreiben() anbelangt. 🙂



  • aGe schrieb:

    Läuft so -

    Typischer naiver Anfängerglaube.

    - true/false ist C++, nicht C; wennschon, dann TRUE/FALSE aus windows.h
    - unsinnige Definition von x als double
    - unsinnige Gleichheitsvergleiche von double Variablen
    - sinnfreies break bei if()
    - void main() Anfängerschrott
    - oberhässliche Einrückung (ist das überhaupt eine Einrückung?)



  • true - false
    siehe: stdbool.h

    Quelle: Committee Draft N1570



  • Wutz schrieb:

    aGe schrieb:

    Läuft so -

    Typischer naiver Anfängerglaube.

    - true/false ist C++, nicht C; wennschon, dann TRUE/FALSE aus windows.h
    - unsinnige Definition von x als double
    - unsinnige Gleichheitsvergleiche von double Variablen
    - sinnfreies break bei if()
    - void main() Anfängerschrott
    - oberhässliche Einrückung (ist das überhaupt eine Einrückung?)

    Läuft != beste Lösung der Welt...
    Läuft == es funktioniert im Rahmen der Aufgabenstellung.

    - Über die Einordnung von C/C++ wurde hier im Thread schon diskutiert. Der Threadstarter betonte dabei, dass der Vorlesungsstoff und das Fach bei ihm eigentlich C++ Programmierung heißt. Es war deshalb auch ursprünglich im passenden Forenteil...

    - X ist laut Aufgabenstellung ein beliebiger Wert zwischen 0 und 5, wobei Kommawerte eindeutig zugelassen sind.
    - Die Gleichheitsvergleiche entstehen auch aus der Aufgabenstellung - so soll die Abfrage wiederholt werden wenn ein ungültiger Wert (außerhalb von 0 bis 5V) eingegeben wird.
    - Break ebenfalls laut Aufgabenstellung, da das Programm enden soll, sobald eine Spannung von 0 eingegeben wird.
    - void main () mag Anfängerschrott sein - sollte wohl aber bei einer Anfängervorlesung zu dem Thema nicht gänzlich unangebracht sein...
    - oberhässlich? hm... Ästhetik war nicht Teil der Aufgabenstellung und liegt sicher im Auge des Betrachters... dass der Threadstarter in seiner Lösung 2x mehr Zeilen gebraucht hat, würde ich persönlich auch nicht "oberschön" finden.


Anmelden zum Antworten