Virtueller Port



  • Guten Tag Community,

    zur Zeit arbeite ich an AVR-Controllern (Amega 8).
    Ich versuche zwei Ports, die jeweils 8 bit haben, wobei 2 bit intern genutzt werden, also nur 6 zur Verfügung stehen, in einem virtuellen Port zusammenzufügen. Am Ende will ich einen virtuellen Port mit 10 bit, wobei 6 von D und 4 Bit von C genutzt werden sollen. Ich möchte gerne die Datenregister DDRD und DDRC zusammenfügen. Die ersten beiden Bit bei dem D Register können nicht genutzt werden und die letzten beiden bei C. Mein Versuch sieht bisher so aus:
    `

    #define PORTV uint16_t

    PORTV portv;

    void setbits()

    {

    int i;
    
    for(i = 0; i < 6; i++)
    
    {
    
    	portv |= ((1 << readb(PORTD, i)) << 8);
    
    }
    
    for(i = 0; i < 4; i++)
    
    {
    
    	portv |= (1 << readb(PORTC, i));
    
    }
    

    }

    `
    readb ist eine Funktion, um ein bit an einer bestimmten Stelle auszulesen. Was ich hier versuche, ist die Werte der einzelnen Ports auf die linke und rechte Hälfte der 16 bit variable zu setzen.
    Wenn z.B. PORTD den Wert 0b00110011 und PORTC den Wert 0b10101100 hat, soll daraus in der 16 Bit Variable 0b00110011 10100000 werden. Die recht Hälfte ist nicht genau identisch mit PORTC, da ja nur 4 Bit genutzt werden sollen.
    Das Problem ist, ich weiß nicht ob das so günstig ist, wie ich es bisher habe, außerdem ist es sehr unhandlich. Immerhin müsste ich vorher immer erst die originalen Ports ändern und dann den virtuellen setzen. Aber eine Benutzung wird dann sinnlos, da ich z.B. auch gerne den Shift-Operator für den virtuellen Port nutzen würde und dann müsste z.B. eine 1 von der einen Hälfte auf die andere springen.
    Hat vielleicht jemand einen Vorschlag oder ein bisschen Code für eine Veranschaulichung?
    Ich wäre über Hilfe erfreut.

    Mfg



  • #define PORTV uint16_t
    PORTV portv;
    
    void setbits()
    {
    	int i;
    	for(i = 0; i < 6; i++)
    	{
    		portv |= ((1 << readb(PORTD, i)) << 8);
    	}
    	for(i = 0; i < 4; i++)
    	{
    		portv |= (1 << readb(PORTC, i));
    	}
    }
    

    Tut mir Leid, ich habe mich bei den Code Tags verklickt.


Anmelden zum Antworten