Member since Jul 2013
10 posts
|
![]()
Subject: Klausur März 2012 Aufgabe 2a
Hi,
könnte da mal jemand drüber schauen, ob das so passt? Ich bin mir beim Ausrechnen der Warteintervalle nicht so ganz sicher, ob man das so machen darf (automatisches Runden...) genauso wie beim Setzen der Register in der Initialisierung wär super ![]()
|
Member since May 2013
67 posts
|
![]()
Ich schreibe die Aufgabe später selber mal und gebe dann meine Senf dazu!
|
Member since May 2013
67 posts
|
![]()
In reply to post #1
Es kann sein, dass deine 'auszeit' nicht stimmt. Ich berechne die ein wenig anders. Zuerst berechne ich quasi '512 - leuchtzeit' und multipliziere das mit LOOPS_PER_US. Sieht eigentlich ganz gut aus. Ist wie bei mir.
Ja, ehm. Hier habe ich ein paar Problemchen mit der Aufgabenstellung. Also wenn ich das richtig verstanden habe, gibt es 8 LEDs. Wir beginnen mit der 1. auf Stufe 1. Ist auf Stufe 0 geschaltet worden (also aus), wird die 2. LED aktiviert, sobald man wieder den Taster0 drückt. Ist man bei der 8. angelagt, springt man wieder auf die 1. LED. Bitte korrigiert mich, falls ich das falsch verstehe. Wendet man den Aufgabentext aber so auf deine ISR an, dann stimmt das noch nicht so ganz. Ich vermisse auch den Sprung von der 8. wieder zurück auf die 1. LED. Edit: Eine Frage: Bei dir sind init() und wait() als static deklariert. Ist das denn notwendig? Wenn ja, warum? Anbei mal mein Code. Ist bis auf die ISR fast identisch:
|
Member since May 2011
331 posts
|
![]()
static: Nein ist nicht zwingend notwendig. Sollte aber bei allen Funktionen hingeschrieben werden, die nicht von einem anderen Modul benötigt werden (vermeidet ggf Probleme mit doppelt benannten Funktionen/Variablen und erlaubt dem Compiler mehr zu optimieren). Aber vor die globalen variablen sollte man auch ein static schreiben. Da sie in einem Interrupt verwendet werden umso mehr!
musli: So wie du die wait implementiert hast entspricht es nicht der Aufgabenstellung. -> Am besten immer erst die Funktionen implementieren, dann passiert das nicht. ingnör: Schau die mal die Berechnung in Zeile 34 an - da ist noch ein Fehler drin. |
Member since May 2013
67 posts
|
![]()
In reply to post #3
Aus
morty, du hast Adleraugen. ![]() |
Member since May 2011
331 posts
|
![]() Jahrelange Übung. Ist aber immer noch falsch. ![]() |
Member since Oct 2012
31 posts
|
![]()
In reply to post #3
Aber bei position = (position + 1) % 8; wird doch immer 1 als Ergebnis rauskommen, da man am Ende durch 8 teilt. Den Schritt verstehe ich nicht. Du wilst ja damit von der 8. LED wieder zur 1. springen, aber geht das wirklich einfach ohne if/else-Schleife ? |
Member since May 2013
67 posts
|
![]()
In reply to post #5
Verdammte Axt! Und wie wäre es damit?
Edit: Sorry, habe deinen Beitrag erst jetzt gelesen. Warum sollte bei der Modulo-Rechnung immer 1 rauskommen? Die spuckt in dem Fall Zahlen zwischen 0 und 7 aus. Edit2: Ach jetzt check ich, was du meinst. Ja, so wie es gerade da steht ist das ziemlicher Quatsch! Ich schaue mir das später nochmal in Ruhe an. Ist jetzt auch schon ein paar Tage her! |
Member since May 2013
67 posts
|
![]()
In reply to post #7
So, das war natürlich Blödsinn. Ohne Abfrage kommt man nicht weit. Ich denke, so sollte es funktionieren:
|
Member since Oct 2012
31 posts
|
![]()
So kompliziert
![]() |
Member since Jan 2013
7 posts
|
![]()
Subject: weiter Lösungsvorschlag
/* Funktionsdeklarationen, globale Variablen, etc. */
static void init(void); static void wait(uint16_t us); static volatile uint8_t stufe = 0; static volatile uint8_t position = 0; /* Funktion main */ void main(void){ /* Initialisierung und lokale Variablen */ init(); /* Hauptschleife */ while(1){ /* Schlafen */ cli(); while(!stufe){ sei(); sleep_enable(); sleep_cpu(); sleep_disable(); cli(); } /* LED ansteuern */ while(stufe){ sei(); PORTA |= (1 << position); wait(stufe/10*512); PORTA = 0xff; wait(512*(1-stufe/10)); cli(); } sei(); } } /* Ende Funktion main */ /* Initialisierungsfunktion */ static void init(void){ DDRA |= 0xff; PORTA |= 0xff; DDRD &= ~((1 << PD2)|(1 << PD3)); PORTD |= (1 << PD2)|(1 << PD3); MCUCR |= (1 << ISC01)|(1 << ISC11); MCUCR &= ~((1 << ISC00)|(1 << ISC10)); GICR |= (1 << INT0)|(1 << INT1); sei(); } /* Wartefunktion */ static void wait(uint16_t){ volatile uint16_t i = 0; while(i < us * LOOPS_PER_US){ i++; } } /* Unterbrechungsbehandlung */ ISR(INT0_vect){ if((stufe <= 0)|(stufe >= 10)) { stufe = 1; position = (position++)%8; } else { stufe++; } ] ISR(INT1_vect){ if(stufe > 0) { stufe--; } } |
Powered by the Unclassified NewsBoard software, 20110527-dev,
© 2003-8 by Yves Goergen