Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Digitaler Kompass

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
08.02.2008, 15:29 Uhr
~moscito
Gast


Hallo bin neu hier und hoffe das mir jemand bei einem Problem helfen kann.
Wir sollen für die Schule einen Digitalen Kompass programmieren, also Schaltung auf bauen mit einem Hallsensor, das Signal verstärken mittels Operationsverstärker. Das ganze geht dann auf den AD Wandler (vom C167) und dann soll das Programm ausgeführt werden.
Zum Schluss soll halt auf dem Display des C167 agezeigt werden z.B. 12 °Grad Nord-Nordöstlich. Und dann soll noch ne Platine angestuert werden auf der sich LEDs befinden wo dann halt die LEDs leuchten.
Ich hab jetzt die Aufgabe das ganze mal Testweise in C++ zu programmieren. Hab da auch schon angefangen damit, jetzt hab ich nur das Problem das es irgendwie nicht gehen will. Der führt zwar alles aus und ich hab auch mal Einzelschritt durchlaufen lassen aber bei der umrechnung in sinus usw klappt was nicht. Weiß jemand vll von euch wie man sowas umrechnen kann, weil ich habe mit sinus kosinus usw nicht viel zu tun gehabt außer mal ne Dreiecksseite zu bestimmen und mich verwirrt das ganze auch immer mehr je länger ich darüber nachdenke.

Hier mal der Code:


C++:
#include <iostream>
#include <math.h>
using namespace std;


void main()
{
    
    
    int eingabe;
    cout<<"Digitaler Kompass"<<endl;
    cout<<"================="<<endl;
    cout<<"1. Kompass simulieren"<<endl;
    cout<<"2. Beenden"<<endl;
    cout<<"\nBitte waehlen:\t";
    cin>>eingabe;
    

    switch (eingabe)
    {
    
        case 1:

        float eingabe1, eingabe2, ausgangswert1, ausgangswert2, gradzahl, umwandeln1, umwandeln2;
        cout<<"Bitte ein Wert zwischen 0 V und 5 V eingeben:"; //Das sind die Werte die sich später der AD Wandler holt
        cin>>eingabe1; //wären z.B. die Daten von der Cosinus Kurve
        cout<<"Bitte ein Wert zwischen 0 V und 5 V eingeben:";
        cin>>eingabe2; //wären z.B. die Daten von der Sinus Kurve
        ausgangswert1=5/eingabe1*1023; //So würde es aussehen wenn der AD Wandler im C167 den Strom in einen Wert umwandelt
        ausgangswert2=5/eingabe2*1023; //Hier genauso

        // Hier kommt der Wert vom AD Wandler ins Programm

        umwandeln1=(5*1023)/ausgangswert1;     //Hier wandelt das Programm die Daten vom AD Wandler wie zurück
        umwandeln2=(5*1023)/ausgangswert2;      //Hier das selbe mit dem zweiten Wert
        
        
        if ((umwandeln1>=2.5) && (umwandeln2<2.5))
        gradzahl=acos(umwandeln1);
        else
        if ((umwandeln1>=2.5) && (umwandeln2>=2.5))
        gradzahl=asin(umwandeln2)+3.1415/2;
        else
        if ((umwandeln1<2.5) && (umwandeln2>=2.5))
        gradzahl=-acos(umwandeln1)+3.1415;
        else
        if ((umwandeln1<2.5) && (umwandeln2>=2.5))
        gradzahl=-asin(umwandeln2)+3*3.1415/2;


        // Hier kommt die Abfrage

        if ((gradzahl>348.75)&&(gradzahl<=11.25))
        cout<<"Sie befinden sich "<<gradzahl<<" Grad im Norden."<<endl;
        else
        if ((gradzahl>11.25)&&(gradzahl<=33.75))
        cout<<"Sie befinden sich "<<gradzahl<<" Grad Nord-Nordoestlich."<<endl;
        else
        if ((gradzahl>33.75)&&(gradzahl<=56.25))
        cout<<"Sie befinden sich "<<gradzahl<<" Grad Nordoestlich."<<endl;
        else
        if ((gradzahl>56.25)&&(gradzahl<=78.75))
        cout<<"Sie befinden sich "<<gradzahl<<" Grad Ost-Nordoestlich."<<endl;
        else
        if ((gradzahl>78.75)&&(gradzahl<=101.25))
        cout<<"Sie befinden sich "<<gradzahl<<" Grad im Osten."<<endl;
        else
        if ((gradzahl>101.25)&&(gradzahl<=123.75))
        cout<<"Sie befinden sich "<<gradzahl<<" Grad Ost-Suedoestlich."<<endl;
        else
        if ((gradzahl>123.75)&&(gradzahl<=146.25))
        cout<<"Sie befinden sich "<<gradzahl<<" Grad Suedoestlich."<<endl;
        else
        if ((gradzahl>146.25)&&(gradzahl<=168.75))
        cout<<"Sie befinden sich "<<gradzahl<<" Grad Sued-Suedoestlich."<<endl;
        else
        if ((gradzahl>168.75)&&(gradzahl<=191.25))
        cout<<"Sie befinden sich "<<gradzahl<<" Grad im Sueden."<<endl;
        else
        if ((gradzahl>191.25)&&(gradzahl<=213.75))
        cout<<"Sie befinden sich "<<gradzahl<<" Grad Sued-Suedwest."<<endl;
        else
        if ((gradzahl>213.75)&&(gradzahl<=236.25))
        cout<<"Sie befinden sich "<<gradzahl<<" Grad Suedwestlich."<<endl;
        else
        if ((gradzahl>236.25)&&(gradzahl<=258.75))
        cout<<"Sie befinden sich "<<gradzahl<<" Grad West-Suedwestlich."<<endl;
        else
        if ((gradzahl>258.75)&&(gradzahl<=281.25))
        cout<<"Sie befinden sich "<<gradzahl<<" Grad im Westen."<<endl;
        else
        if ((gradzahl>281.25)&&(gradzahl<=303.75))
        cout<<"Sie befinden sich "<<gradzahl<<" Grad West-Nordwestlich."<<endl;
        else
        if ((gradzahl>303.75)&&(gradzahl<=326.25))
        cout<<"Sie befinden sich "<<gradzahl<<" Grad Nordwestlich."<<endl;
        else
        if ((gradzahl>326.25)&&(gradzahl<=348.75))
        cout<<"Sie befinden sich "<<gradzahl<<" Grad Nord-Nordwestlich."<<endl;
        break;


        case 2:

        return;

    }
}



Über eine Antwort wär ich seh dankbar


mfg

Dieser Post wurde am 08.02.2008 um 15:32 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
08.02.2008, 22:04 Uhr
RedEagle



Die Argumente der sin/cos/... Funktionen müssen in bogenmaß angegeben werden.
--
MFG RedEagle
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
08.02.2008, 22:38 Uhr
~moscito
Gast


habs mal ins bogenmaß gemacht geht trotzdem nicht:

if ((umwandeln1>=2.5) && (umwandeln2<2.5))
gradzahl=acos(umwandeln1)*180/3.1415;
else
if ((umwandeln1>=2.5) && (umwandeln2>=2.5))
gradzahl=asin(umwandeln2)*180/3.1415;
else
if ((umwandeln1<2.5) && (umwandeln2>=2.5))
gradzahl=acos(umwandeln1)*180/3.1415;
else
if ((umwandeln1<2.5) && (umwandeln2>=2.5))
gradzahl=asin(umwandeln2)*180/3.1415;

geht irgendwie trotzdem nicht. Ich glaub ich benutz hier flasche formeln weiß jemand die richtige? Das ganze läuft über eine Sinus und Cosinus Kurve ab. Jetzt holt sich der AD Wandler dann die beiden Werte (von der Sinus und Kosinus Kurve usw.) und übergibt sie dann dem Programm.

Hat jemand vll sowas schonmal gemacht?

mfg
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
08.02.2008, 23:15 Uhr
~moscito
Gast


Hier noch ein Link zu dem Datenblatt vll Hilft das etwas:

www1.pewatron.ch/all_pdf/kompasssensor1041100432.pdf
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
09.02.2008, 01:16 Uhr
Hans
Library Walker
(Operator)


Hi,

Du musst die Umwandlung mit in die Klammer nehmen, also:

C++:
gradzahl=acos(umwandeln1*180/3.1415);


Nicht so:

C++:
gradzahl=acos(umwandeln1)*180/3.1415; // Fehler!



oder vorher umwandeln:

C++:
umwandeln1=umwandeln1*180./3.1415;
gradzahl=acos(umwandeln1);



Übrigens ist es Empfehlenswert, den Wert von pi einmal als Konstante (oder Variable) festzulegen, und danach nur noch den Namen zu benutzen. Die Standardmethode dazu ist die hier:

C++:
#define pi 3.1415926535897392
...
gradzahl=acos(umwandeln1*180./pi);



Eine andere Variante ist diese:

C++:
double pi=4.*atan(1.);



Die hat den Vorteil, das man pi immer so genau hat, wie es der Rechner her gibt. Ach ja, in der math.h sollten eigentlich auch Konstanten für pi definiert sein.

Dann würde mich noch die genaue Bezeichnung von dem Controller interessieren. Ist das ein PIC oder ein 8051-Nachbau oder was für einer ist das?

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
09.02.2008, 14:07 Uhr
~moscito
Gast


Hallo Hans,

danke für die Tips. Habe es jetzt mal so umgewandelt wie du mir gesagt hast. Wenn ich es nun wieder im Einzelschrittmodus durchlaufen lasse, erhält die Variable gradzahl wieder einen negativen Wert. Hier mal der Link zum Bild:

http://img256.imageshack.us/my.php?image=programmierenkn6.jpg

Habe ich die Formel die oben im Datenblatt stehen falsch verstanden, weil eigentlich sollte ja immer ein Wert zwischen 0 und 360 rauskommen, und dieser Wert wird dann weiterverarbeitet um somit auszugeben in welcher Himmelsrichtung man sich befindet.

Also der Microcontroller ist der C167 von Siemens. Ich soll den später mit Microvison in C programmieren. Die Bezeichung 80 entfiel da es keine Anlehnung mehr an Intel gab. Es ist ein 16 Bit Microcontroller der einen größeren Adressraum hat und zusätzlich noch Pehipherie on Chip hat, also das Display z.B.

gruß
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
09.02.2008, 18:31 Uhr
ao

(Operator)


Moment mal, das sind die arcus-Funktionen, die Umkehrungen von Sinus und Cosinus.

Die füttert man nicht mit Bogenmaß, sondern mit etwas zwischen -1 und 1, und kriegt den zugehörigen Winkel in Bogenmaß raus. Den dann noch mit 180/pi malnehmen, um Grad zu erhalten.

Ach ja, wenn der C167 in C programmiert wird, solltest du cin und cout schnellstens vergessen.

Was war denn der Grund, einen C167 zu nehmen? Der ist doch relativ teuer, soweit ich weiß, und hat einen Haufen Pins, das heißt SMD und schwer zu löten. Zwei Magnetfeldsensoren auswerten und ein bisschen rechnen, das schafft doch jeder ATmega für zwei oder drei Euro.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
09.02.2008, 21:50 Uhr
Hans
Library Walker
(Operator)


Hi,

Zitat von ao:
Moment mal, das sind die arcus-Funktionen, die Umkehrungen von Sinus und Cosinus.

Die füttert man nicht mit Bogenmaß, sondern mit etwas zwischen -1 und 1, und kriegt den zugehörigen Winkel in Bogenmaß raus.

Das hätte mir eigentlich auch auffallen sollen...


Zitat von ao:
Was war denn der Grund, einen C167 zu nehmen? Der ist doch relativ teuer, soweit ich weiß, und hat einen Haufen Pins, das heißt SMD und schwer zu löten.

Da bin ich jetzt doch mal neugierig geworden, und hab mal nach dem Datenblatt gesucht, und einen Schreck bekommen: ein 144 Pin P-MQFE (Plastic Metric Quad Flat Package) Gehäuse; Pin-Abstand 0,35 mm. Ach ja, das Datenblatt ist dieses hier.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
09.02.2008, 23:52 Uhr
~moscito
Gast


Danke für eure Tipps ich werde es mal umschreiben und mich dann wieder melden.
Der Grund wieso ich C167 nehmen muss ist, weil wir in der Schule mit dem arbeiten und den dann verwenden sollen, finde es auch unnötig der ist auch viel zu groß usw. So ne Atmega wär viel besser aber müssen es halt mit dem C167 machen.
Das Programm umschreiben in C mach ich dann später ist jetzt nur mal für die Zwischenpräsentation gedacht die jetzt bald stattfindet. Und in C++ sieht es ein bisschen übersichtlicher aus.

gruß
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
10.02.2008, 02:46 Uhr
Hans
Library Walker
(Operator)


Hi,
was ist das für 'ne Schule? - Berufschule? Für alles andere halte ich die Handhabung des Chips für zu schwierig. Es sei denn, der Chip selber befindet sich auf einer fertig gelöteten Experimentierkarte, wo man nur noch Kabel anklemmen bzw. aufstecken muss...

Was das Umschreiben angeht: ich würde es besser sofort machen. Die Übersicht lässt sich auch in C gut herstellen, wenn man es von Anfang an sauber plant. Und in dem Code, den Du auch hier geposted hast, ist ja bisher nur iostream durch stdio zu ersetzen, und entsprechend cout durch printf bzw. cin durch scanf oder gets. Also kein grösseres Problem. (Wie man Eingaben mit Kombinationen aus gets und sscanf sicher gestalten kann, steht hier im Forum schon an anderer Stelle beschrieben.)

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: