C Atmel Studio Lauflicht und shift per modi 1 und modi2


Sekiro24

Mitglied
Aufgabe:
Zu Beginn des Programms soll die LED außen rechts leuchten. Nun soll es möglich sein mithilfe eines Drucks des linken Tasters die leuchtende LED um ein Bit nach links zu bewegen. Dazu soll das Ausgaberegister PORTB nach links geshiftet werden. Analog soll ein Druck auf den rechten Taster die leuchtende LED nach rechts bewegen.
Wird die leuchtende LED nach links über den linken Rand(PORTB7) geschoben, so soll die LED ganz rechts wieder aufleuchten (PORTB4) und umgekehrt die LED ganz links wenn über den rechten Rand (PORTB7) geschoben wird.

Erweitern Sie ihren Quellcode so, dass ihr Programm bei Druck auf den mittleren Taster(PINA1)zwischen zwei Modi umschaltet, Im ersten Funktionsmodus soll weiterhin die Funktionsweise wie in der obigen Teilaufgabe angegeben sein und nach dem Umschalten zu einem automatischen Lauflicht wie in Versuchsteil 1 wechseln. Dieses soll die Laufrlichtung bei Druck des linken Tasters(PINA2) nach Links ändern und beim Druck auf den rechten Taster(PINA0) nach rechts. Wird der mittlere Taster(PINA1) erneut betätigt, wechselt das Programm in den ersten Modus.

Problem/Frage:
Ich habe das Programm eigentlich soweit fertig. Jedoch weiss ich nicht, was mit dem letzten Teil gemeint ist.
C:
#include <avr/io.h>

void modi_1()
{
    if(PORTB <= 0b10000000)        //Ist der Ausgabeport kleiner oder gleich 128,
    {                            //wird geguckt, ob der Schalter PA2 aktiv ist.
        if(PINA & (1 << PA2))    //Ist PA 2 aktiv und PORTB ist kleiner oder gleich 128,
        {                        //dann wird PORTB um eine Stelle nach links geshiftet.
            PORTB = PORTB << 1;
        }   
        if(PORTB > 128)            //Wird auch beim letzten shiften nach links der Rand überschritten,
        {                        //kann PORTB aufgrund der 8-Bit Schalterpositionen nicht mehr dargestellt werden
            PORTB = 0b00010000;    //und PORTB wird auf 16 von rechts zurückgesetzt.
        }
    }
    else
    {
        if(PORTB >= 0b00010000)        //Ist sonst der Ausgabeport größer oder gleich 0,
        {                            //wird geguckt, ob der Schalter PA1 aktiv ist.
            if(PINA & (1 << PA1))    //Ist PA1 aktiv und PORTB ist größer oder gleich 0,
            {                        //dann wird PORTB um eine Stelle nach rechts geshiftet.
                PORTB = PORTB >> 1;   
            }
            if(PORTB < 0b00010000)    //Pendant zur oberen if (PORTB > 128) Abfrage
            {
                PORTB = 0b10000000;
            }
        }
    }
}

void modi_2()
{   
    if(PINA & (1 << PA0))
    {
        
    }
    if(!(PINA & (1 << PA0)))        //Abfrage auf PortA, wenn PA0 = 0,
    {                                //wird das Lauflicht, wie im Aufgabenteil 1 ausgeführt
        PORTB = PORTB << 1;           
        if(PORTB == 0b10000000)        //Wird beim Lauflicht die 128 erreicht, wird PORTB auf 8 zurückgesetzt
        {
            PORTB = 0b00001000;
        }
    }           
}

int main(void)
{
    
      DDRA = 0x00;    //Eingang
      DDRB = 0xFF;    //Ausgang
    //uint8_t ausschalten = 0x3C;
      PORTB = 0b00010000;    //Auf Anfangswert setzen
    int taster_modi = 1;
    int taster_links_rechts = 1; //taster_links_rechts
    while (1)
      {
        if(PINA & (1 << PA1))    //Ist der mittlere Schalter auf 1,
        {                        //wird der schalter gekippt und ein anderer Modus ausgewählt.
            if(taster_modi == 1)    //PA1 wechselt mit Druck den Modus sofort.
            {                    //Dabei wird eine Variable taster_modi definiert, der sich den nächsten Modus merkt.
                taster_modi = 2;
            }
            else
            {
                taster_modi = 1;   
            }
        }
        switch (taster_modi)        //Modi Auswahl
        {                        //Ist der Modus auf 1 geschaltet, wird der Modus 2 ausgeführt
            case 1: modi_1(); break;
            case 2: modi_2(); break;
        }
        
      }
      return 0;                    //Rückgabewert ist 0, wird aufgrund von while(1) nie erreicht, da Endlosschleife
}
 

Technipion

Erfahrenes Mitglied
Hey, ist die Frage noch aktuell?

Ich habe das Programm eigentlich soweit fertig. Jedoch weiss ich nicht, was mit dem letzten Teil gemeint ist.
Dieses soll die Laufrlichtung bei Druck des linken Tasters(PINA2) nach Links ändern und beim Druck auf den rechten Taster(PINA0) nach rechts. Wird der mittlere Taster(PINA1) erneut betätigt, wechselt das Programm in den ersten Modus.
Soweit ich das verstehe sollst du zwei Modi implementieren:

1. Modus: Manuelles Lauflicht, wird per PINA2 nach links und mittels PINA0 nach rechts bewegt.
2. Modus: Automatisches Lauflicht, läuft von selbst. Die Laufrichtung kann mit PINA2 auf links→rechts und mit PINA0 auf rechts→links gesetzt werden.

Gruß Technipion
 

Neue Beiträge