MCU Register ansteuern mit C/C++ ??



  • Hallo ich würde gerne ein Microcontroller ansteuern und zwar erst einfach einen port mit 8 Pins ( 8 bit). Ich bin mir nur nicht sicher wie das geht ohne die avr io.h bibliothek und ich bin mir nicht sicher ob ich das überhaupt benutzen kann. Es ist ein exotischer MCU, er heißt 89LPC932 und hat nur einen 8bit port. Ich müsste den jetzt irgendwie per C/C++ ansteuern. Ich bin mir nicht sicher aber man erhält doch im Datenblatt eine adresse für das 8bit register oder nicht ?

    Wie kann ich diesem dann die bits zuweisen bzw. diese als ein oder ausgang angeben ?? ( Das zuweisen selber mit bitoperationen ist mir schon klar aber wie das geht weiß ich leidern icht )

    Wäre sehr hilfreich danke



  • Das hängt vom µC ab. Evtl gibt es auch speziell Befehle dafür. Die kennt dann aber auch der C-Compiler (wenn es einen gibt) für diesen µC.

    Da bleibt dir wohl nur RTFM.

    Wenn ich das gerade richtig interpretiert habe, ist der 89LPC932 eine Art 8051.
    Dafür findest du auf alle Fälle Beispiele.



  • Wie geht das denn in Assembler. Die Leute aus der Firma benutzen assembler für die Programmierung und ich muss das jetzt in C/C++ ausprobieren. Aber kann man nicht einfach ein programm draufladen welcher einfach nur die bits eines registers manipuliert ?? Geht das nicht so einfach ?



  • Du brauchst einen C oder C++ Compiler für diesen µC.
    In dem Manual dazu steht dann auch drin wie die Hardware angesprochen wird.
    Hier in diesem Unterforum geht es vor allem um das standardisierte C++, daher wirst du hier kaum genauere Angaben bekommen.

    Wie dieses Programm dann auf den µC kommt, ist noch eine ganz andere Sache.



  • Ja klar den compiler haben die ich meine nur wie ich diese register anspreche wenn ich die adresse habe davon.
    Da wird wohl kaum ein C beispiel stehen wie ich durch die adresse des rgisters die pins an und aus schalten kann Ich will nur wissen wie ich die werte einer Adresse verändern kann ( iwie sowas: *((volatile uinst32_t 😉 0x00112233) = 0x00000001; ) Sowas hab ich mal gesehen aber wie sieht das für den MCU aus ? ich will einfach nur den wert des registers veränder, dadurch ändere ich ja auch die werte am pin



  • Eine Möglichkeit ist das Register "irgendwie so" in C++ über nen Zeiger anzusprechen:

    static volatile uint8_t* const FooRegisterAddress = (volatile uint8_t*) 0x12345678; // Die Adresse laut Datenblatt
    
    #define READ_WRITE_BARRIER() CompilerspezifischesZeugs
    
    void WriteFooRegister(uint8_t value)
    {
        READ_WRITE_BARRIER();
        *FooRegisterAddress = value;
        READ_WRITE_BARRIER();
    }
    
    uint8_t ReadFooRegister()
    {
        uint8_t value;
        READ_WRITE_BARRIER();
        value = *FooRegisterAddress;
        READ_WRITE_BARRIER();
        return value;
    }
    

    Eine andere wäre das Register über inline Assembler anzusprechen. Das ist aber wieder Compiler-spezifisch:

    void WriteFooRegister(uint8_t value)
    {
        __asm mov byte ptr [0x12345678], value;
    }
    
    // ...
    

    Je nach Compiler brauchst du auch hier wieder spezielle Barriers bzw. musst der Funktion spezielle Attribute verpassen damit der Compiler nicht anfängt zu optimieren. Bei MSVC ist es nicht nötig, bei GCC z.B. aber schon.

    Und was soll das Verwirrspiel mit Youbama <-> Bob Wolfskin? Hast du ne gespaltene Persönlichkeit?


Anmelden zum Antworten