C / Mikrocontroller



  • Sonstige Sachen sind nicht, aber hast du zufällig eine Seite wo eine von dir angesprochene Umwandlung mal gezeigt wird?


  • Mod

    Na, wie in der Grundschule: Erste Ziffer sind die Einer, zweite Ziffer sind die Zehner, dritte Ziffer die Hunderter. Bloß sind's im Hexadezimalsystem Einer, 16er, 256er, usw.

    Das heißt, ein bisschen Division und Modulo und du bist fertig.

    http://de.wikipedia.org/wiki/Stellenwertsystem



  • Alles klar, dann mache ich es so wie ich es mir überlegt hatte mit "case ..." zu jeder einzelnen Stelle 😉

    Vielen Dank.


  • Mod

    JumpY schrieb:

    Alles klar, dann mache ich es so wie ich es mir überlegt hatte mit "case ..." zu jeder einzelnen Stelle 😉

    😮 Die Antwort hätte ich nun nicht erwartet.

    Wo kommen denn die Zahlen 1, 10, 100, 1000, usw. her? Da ist ein Zusammenhang mit der Anzahl der Ziffern: 10.

    Der gleiche Zusammenhang gilt in allen anderen Ziffernsystemen, bloß mit unterschiedlicher Zahlen von Ziffern. Bei 16 eben 1, 16, 256, 4096, 65536, usw.

    Denk da unbedingt drüber nach. Zur Not hilft der Link. Wenn dir das bisher tatsächlich noch nicht bekannt war, dann wirst du hinterher die Zahlenwelt mit anderen Augen sehen, das verspreche ich dir.

    Wenn du das verstanden hast, dann kannst du auch ganz ohne Hilfe vom 7.356er ins (1.764 + i*848.23)er System umrechnen, egal wie verrückt dies gerade für dich klingen mag.



  • Nur mal so, wenn es eh ein Arduino wird und du wohl Werte durch die Gegend schicken willst, dann schick doch ints: http://arduino.cc/en/Serial/Print



  • @ GER_Moki , ja es werden Daten so geschickt, jedoch brauche ich für zwischendurch schonmal Testwerte, die ich gerne in Dezimal hätte da ich diese mit bestimmten Listen abgleiche.

    @ SeppJ , normalerweise ist mir der Zusammenhang dieser Zahlen durchaus bekannt. Meine Idee war es, die Zahl Stück für Stück zu verarbeiten. 1. Ziffer * 16^0, 2. * 16^1 usw. Sah dann ungefähr so aus, auch wenn die pow()-Funktion nicht funktioniert und nur absoluten Schwachsinn auswirft. Fand ich für mich vom denken her nicht wirklich schwierig, aber scheinbar gehts ja noch viel einfacher wie du das sagst auch wenn ich damit nicht wirklich etwas anfangen kann.

    for (f=0; f<=15; f++) {
        switch (ausgabe[f]) {
    
          case '0': temp = 0;
          break;
          case '1': temp = 1;
          break;
          case '2': temp = 2;
          break;
          case '3': temp = 3;
          break;
          case '4': temp = 4;
          break;
          case '5': temp = 5;
          break;
          case '6': temp = 6;
          break;
          case '7': temp = 7;
          break;
          case '8': temp = 8; 
          break;
          case '9': temp = 9; 
          break;
          case 'A': temp = 10; 
          break;
          case 'B': temp = 11; 
          break;
          case 'C': temp = 12; 
          break;
          case 'D': temp = 13; 
          break;
          case 'E': temp = 14; 
          break;
          case 'F': temp = 15; 
          break;
    
          default: 
          temp = 99;
    
           }
       value = value + temp*pow(16,15-f);
      }
       Serial.print(value);
    

  • Mod

    JumpY schrieb:

    Meine Idee war es, die Zahl Stück für Stück zu verarbeiten. 1. Ziffer * 16^0, 2. * 16^1 usw. Sah dann ungefähr so aus, auch wenn die pow()-Funktion nicht funktioniert und nur absoluten Schwachsinn auswirft.

    Ich glaube hier liegt das Problem. pow sollte eigentlich keinen Schwachsinn auswerfen. Du benutzt es sicherlich falsch.

    Weiterhin ist dir hoffentlich bekannt, dass '^' in C keine Potenz ist, sondern XOR, oder?

    Aber im Prinzip brauchst du gar nirgends direkt zu potenzieren, ein paar Multiplikationen/Divisionen, immer wieder wiederholt, sind genug.

    Guckste als Anregung:
    https://ideone.com/DcPvEg



  • Ja weiß ich, deshalb habe ich die Funktion dazu doch einen Post über deinem eingefügt wie ich es versucht habe.
    Die von dir geposteten Funktionen habe ich ebenfalls schon durchprobiert, der Mikrocontroller versteht das printf aber nicht, beziehungsweise kann er das nicht ausgeben. Mit anderen Printfunktionen erzeuge ich in der Konstellation nur Fehlermeldungen leider.


  • Mod

    Dann liegt das in deiner Fehlbenutzung der ausgabefunktionen, nicht an der Umrechnung. Das printf ist bei mir doch sogar nur zur Demo drin, kein Teil des Umrechnungscodes. Da musst du natürlich die Funktionen deines Mikrocontrollers nehmen, die ich bei dem Onlinecompiler schließlich nicht benutzen kann. Ich wollte dir nur zeigen (und nur als grober Ansatz! Du siehst an der Ausgabe, dass das noch wesentlich schöner ginge!), wie man das Problem durch Rechnen löst anstatt durch switch. Damit du die Mathematik besser verstehst.



  • Also es lag definitiv an der Fehlbenutzung, weil ich irgendwie jedesmal ein Overload erzeugt habe. Habe mir die ganze Sache nochmal durchgeschaut und bin mitlerweile zu einem sehr zufriedenstellenden Ergebnis gekommen.

    Vielen Dank für eure Hilfe, vermutlich wird man sich nochmal hören 🙂


Anmelden zum Antworten