Member since Nov 2011
3 posts
|
![]()
Subject: Programmieraufgabe August 2011
Hi, hat sich sonst noch jemand an der aufgabe versucht? könnte man die aufgabe so lösen?
/* Funktionsdeklarationen, globale Variablen, etc. */
static void wait(void); static void init(void); static volatile uint8_t event=0; /* Unterbrechungsbehandlungsfunktion */ ISR(INT0_vect){ event++; } /* Funktion main */ void main(void){ /* Initialisierung und lokale Variablen */ init(); uint8_t anfangswert=0xff; /* Hauptschleife */ while(1){ /* Konfigurationsphase */ cli(); while(event!=1){ anfangswert= (poti_read()/127)+1; for(uint8_t i=0;i<anfangswert;i++){ PORTB &= ~(1<<i); } PORTB=255; } sei(); /* Countdown-Phase */ cli(); while(event!=2){ for(uint8_t i=0;i<anfangswert;i++){ PORTB &= ~(1<<i); wait(); anfangswert--; } } event=0; /* LED-Alarm-Sequenz */ if(anfangswert==0){ PORTB = 0x55; wait(); PORTB = 0xAA; wait(); } sei(); /* Schlaf-Phase */ cli(); while(!event){ sleep_enable; sei(); sleep_cpu(); cli(); } sei(); /* Ende Funktion main */ } /* Initialisierungsfunktion */ static void init(void){ DDRB=255; PORTB=255; DDRD &= ~(1<<PD2); PORTD |= (1<<PD2); GICR |= (1<<INT0); MCUCR |= (1<<ISCO1); MCUCR &= ~(1<<ISC00); } /* Wartefunktion */ static void wait(void){ for(volatile uint16_t i=0;i<=60000;i++){ ; } } |
Member since Jul 2012
9 posts
|
![]()
Hab die gleiche Aufgabe bearbeitet, würde auch gerne wissen was alles falsch ist :P
Klausur „Grundlagen der systemnahen Programmierung in C“ (GSPiC) August 2011
|
Member since May 2011
331 posts
|
![]()
Schaut doch einfach mal die Lösung des Anderen an und schaut ob ihr Fehler findet.
Der Code lässt sich übrigens deutlich besser lesen, wenn ihr [code=c] //der Code [/code] schreibt. Und bitte den Code nicht ändern, sobald Kommentare geschrieben werden - die machen sonst keinen Sinn mehr, wenn der Fehler beseitigt wurde. |
Member since Oct 2011
4 posts
|
![]()
TW warum bestimmst du den Anfangswert und passt ihn an und liest erneut erneut den Port aus und verwendest den unangepassten Wert für den Countdown???
|
Member since Jul 2012
9 posts
|
![]()
naja in der konfigphase ruf ich jedes mal für die for-schleife den aktuellen wert ab und lass ihn dann anzeigen, sobald dann gedrückt wird schreib ich den aktuellen stand in die variable wert und verwende den dann weiter. so ist es zumindest gedacht^^
|
Member since May 2011
331 posts
|
![]()
TW: Überleg mal was passiert wenn du das Potti hin und her drehst und welche LEDs dann an bzw aus gehen.
|
Member since May 2011
109 posts
|
![]()
Ich glaub, mr mojo hat vor /* Ende Funktion main */ die Klammer der while(1)-Schleife vergessen zu schließen. Die Einrückungen sind da etwas unklar
|
Member since Jul 2012
9 posts
|
![]()
oh da würden denke ich gar keine leds mehr ausgehen, da ich immer nur die die nötige anzahl anmache, die anderen aber nicht mehr aus
|
Member since May 2011
331 posts
|
![]()
Hier gibt es zwei Sachen zu bemängeln: * Es ist möglich Muster zu bilden: 00101111 * Die Anzeige wird ziemlich flimmern. Warum wird schnell klar, wenn du einfach mal davon ausgehst, dass der Prozessor sehr langsam getaktet ist. Wenn er schnell getaktet ist, ist zwar ersteres unwahrscheinlicher, aber flimmern wird es immer noch. Kleiner Tipp: Variablen kosten nix! |
Member since Jul 2012
9 posts
|
![]()
also doch vorher den wert in eine variable einlesen und diesen wert anstatt der funktion in der if-abfrage verwenden
hatte nicht an die muster und flimmern gedacht und dachte die variable wäre dann sinnlos
das müsste die oben angesprochenen effekte vermeiden oder? |
Member since May 2011
331 posts
|
![]()
Eine weitere Variable schadet nie. Im Zweifelsfall wird sie vom Compiler weg optimiert.
Wenn du deinen Code weiter anschaust, wirst du auch feststellen, dass die Wartezeit nicht der Gewählten Zeit entsprechen muss. Ein paar Probleme mit der LED gibt es weiter unten im Code noch und schlafen wird sich der Controller bei dir auch nicht. ![]() |
Member since May 2011
331 posts
|
![]()
In reply to post #10
EDIT: Ja, sind gelöst - hatte einen Knoten im Hirn |
Member since Jul 2012
9 posts
|
![]()
In der countdown-phase muss es l++ anstatt i++ heißen, da hatte ich mich wohl vertippt.
Aber inwiefern gibt es probleme mit einer led? und warum stimmt die wartezeit nicht? |
Member since May 2011
331 posts
|
![]() LED: Die Zeilen 47-55 kann man unterschiedlich lösen. Entweder du schaltest die LEDs nur aus (Dann funktioniert der Code wie er ist nicht) oder du machst die gleiche Schleife rein, wie beim konfigurieren; die ist dann aber eigentlich zu aufwendig. Wartezeit: das eine wert=.... muss noch weg. Aber wahrscheinlich hattest Du das mit deiner Lösung der Konfig-Phase impliziert. |
Member since Jul 2012
9 posts
|
![]()
ja das mit dem wert hatte ich mir dann schon weggedacht :P und in countdown vergesse ich wieder da auschalten, wenn ich das richtig sehe
habe jetzt auch noch eingefügt, dass am ende von countdown auch wenn abgebrochen wurde alle aus sind, das fehlte denke ich noch (auch wenns in der aufgabe soweit ich das verstanden hab nicht verlangt wird)
das müsste jetzt denk ich funktionieren? |
Powered by the Unclassified NewsBoard software, 20110527-dev,
© 2003-8 by Yves Goergen