c für µC



  • ^Hallo,

    hab ein Problem bei der folgenden Aufgabe:

    Zur Anzeige der aktuellen Zeit, wird erwartet dass die aktuelle Stunde durch Aufleuchten der entsprechenden LED am äußeren LED-Kreis leuchtet.

    Die 16 Portleitungen des µC sind folgendermaßen mit den LED verbunden:

    LED 0 Bit0
    LED 1 Bit1
    ...
    LED 15 Bit15

    LED0-3 sind für die Minutenanzeige(innerer LED-Kreis der Uhr wenn man so will)
    LED4-LED15 bilden den äußeren LED-KREIS beginnend mit LED 4 in der 12 Uhr Stellung im Uhrzeigersinn.

    Der Port des µC kann durch die vordefinierte globale Variable "PORTA" des Typs unsigned short (16bit) angesprochen werden.

    Die Zahl der Stunden ist über die globale Variable "stunden" vom Typ unsigned char gegebeben und zwar im bereich [0,23].

    Aufgabe: Schreiben sie Programmcode, welcher das benötigte Bitmuster um die Studen-LEDS wie gefordert in der Variable A1 ablegt.

    Für 0Uhr bis 11 Uhr hätte ich das folgendermaßen gemacht:

    A1=(PORTA&0x0000)|(0x0010<<stunde);

    Aber was ist nun wenn der variablen stunde der wert 12 oder höher übergeben wird? Verstehe nicht wie ich das schreiben soll das die Uhr auch Nachmittags funktioniert.

    Schon mal Danke für die Hilfe!

    mfg mb5



  • Wie rechnest du (im Kopf) denn eine Angabe wie fünf Uhr Nachmittags in das 24-Stunden-Format um?



  • Denke da an sowas
    s=stunde;//0-24
    if(s>12) s-=12;//0-12
    b=~0>>(16-s)<<4;//bits für die stundenleds setzen



  • volkard schrieb:

    Denke da an sowas
    s=stunde;//0-24
    if(s>12) s-=12;//0-12
    b=~0>>(16-s)<<4;//bits für die stundenleds setzen

    Das funktioniert nicht. ~0 ist ein signed integer mit dem Wert -1, das kannst Du soviel rechts rücken wie Du magst.

    Wenn schon, dann so

    b=(unsigned short)(~0)>>(16-s)<<4;
    

    Außerdem lässt Du damit alle LEDs von der 0 Uhr Position bis zur aktuellen Zeit aufleuchten. Ob das so gewollt ist? Schöner sähe es aber aus. Aber das steht nicht zur Diskussion.

    mfg Martin



  • mb5 schrieb:

    A1=(PORTA&0x0000)|(0x0010<<stunde);

    Wozu (PORTA&0x0000)? Das ist immer 0 wenn PORTA ein short ist.

    Also besser

    A1=0x0010<<stunde;
    

    Und um Dein 12 Uhr problem zu lösen, machst Du es entweder so

    A1=0x0010<<(stunde%12);
    

    Oder so wie Volkard es vorgeschlagen hat.

    Volkard schrieb:

    if(s>12) s-=12;//0-12

    mfg Martin



  • danke für die antworten, hat mir sehr geholfen !



  • Hallo hätte noch eine frage,

    mein lehrer hat uns heute ne weitere Teilaufgabe gegeben.

    Jetzt sollen die inneren LEDs entsprechend der minuten gesetzt werden als LED0-LED3.

    Man bekommt wieder eine variable minuten vom Typ unsigned char übergeben im Bereich [0,59].

    LED 0 soll leuchten im Bereich[0,14]
    LED 1 soll leuchten im Beriech[15,29]
    LED2 soll leuchten im Bereich [30,44]
    LED3 soll leuchten im Bereich [45,59]

    Leider bin ich trotz überlegen nicht draufgekommen wie ich in c die variable minuten in diese intervalle unterteile.

    hoffe ihr könnt mir da nen kleinen denkanstoß geben!

    mfg mb5


  • Mod

    Indem du den Wert durch 15 teilst? Bekommst du 0 als Ergebnis, bist du in Bereich 0, usw.


Anmelden zum Antworten