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.
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
}