Not logged in. · Lost password · Register

ingonör
Member since May 2013
67 posts
Subject: Klausur 2013-03
Hi,

habe mich mal an der Aufgabe versucht.
Irgendwie ist mein Code ziemlich lang geworden und ich habe das Gefühl, dass ich ziemlich kompliziert denkend an die Sache rangegangen bin.
Mag das vielleicht mal jemand überprüfen?

Liebe Grüße
ingonör

  1. #include <avr/io.h>
  2. #include <avr/interrupt.h>
  3. #include <avr/sleep.h>
  4. #include <stdint.h>
  5.  
  6. #define LOOPS_PER_MS 200
  7. #define RUNTER 1
  8. #define HOCH 2
  9.  
  10. uint16_t adc_read(void);
  11. /* Funktionsdeklarationen, globale Variablen, etc. */
  12. void init(void);
  13. void wait(uint16_t);
  14. volatile int8_t schalter;
  15.  
  16. /* Unterbrechungsbehandlungsfunktion */
  17. INT0_vect(INT0) {
  18.     schalter = 1;   
  19. }
  20. /* Funktion main */
  21. void main(void) {
  22.     int8_t kipp = RUNTER;
  23.     /* Initialisierung */
  24.     init();
  25.     /* Hauptschleife */
  26.     while(1) {
  27.         /* warten auf Schalterbewegung */
  28.         cli();
  29.         while(schalter == 0) {
  30.             sei();
  31.             sleep_cpu();
  32.             cli()
  33.         }
  34.         sei();
  35.         schalter = 0;
  36.         kipp = (kipp == RUNTER) ? RAUF : RUNTER;       
  37.        
  38.         /* Motor anschalten, Bewegung ueberwachen */       
  39.         if(kipp == RAUF) {
  40.             PORTA = ((1 << 1) |(1 << 2));
  41.             PORTD = ((1 << 3) | (1 << 5));
  42.         else
  43.             PORTA = (1 << 2);
  44.             PORTD = ((1 << 3) | (1 << 4));
  45.         uint16_t sensor;
  46.         while(1) {
  47.        
  48.             cli();
  49.             if (kipp == RUNTER && schalter == 1) {
  50.                 kipp == RAUF;
  51.                 PORTA = ((1 << 1) |(1 << 2));
  52.                 PORTD = ((1 << 3) | (1 << 5));
  53.                 schalter = 0;
  54.             } else if(kipp == RAUF && schalter == 1) {
  55.                 kipp == RUNTER;
  56.                 PORTA = (1 << 2);
  57.                 PORTD = ((1 << 3) | (1 << 5));
  58.                 schalter = 0;
  59.             }
  60.             sei();
  61.            
  62.             sensor = adc_read();
  63.             sensor = sensor / 128 + 1;
  64.             PORTC = 0x0;
  65.             PORTC = (1 << sensor);
  66.             wait(100);
  67.            
  68.             if (kipp == RAUF && sensor == 8)
  69.                 break;
  70.             else if(kipp == RUNTER && sensor == 1)
  71.                 break;
  72.         }
  73.     /* Motor ausschalten */
  74.         PORTA &= 0x01;
  75.  
  76. /* Ende main */
  77.     }
  78. }
  79. /* Initialisierungsfunktion */
  80. void init(void) {
  81.     sleep_enable();
  82.     sei();
  83.    
  84.     DDRC = 0x7f;
  85.     PORTC = 0x7f;
  86.    
  87.     DDRA = 0x3; 
  88.     PORTA = 0x00;
  89.    
  90.     PORTD = ((1 << PD2) | (1 << PD3));
  91.     DDRD = (1 << PD2);
  92.            
  93.     GICR = (1 << INT0);
  94.     //Interrupt bei steigender Flanke
  95.     MCUCR = ((1 << ISC01) | (1 << ISC00))
  96. }
  97.  
  98. /* Wartefunktion */
  99. void wait(uint16_t ms) {
  100.     volatile uint16_t i = ms * LOOPS_PER_MS;
  101.     while(i--)
  102.         ;
  103. }
killermiller
Member since May 2011
41 posts
Hi,
die Idee is grundsätzlich gut, aber ein paar Sachen gibts zu kritisieren:
Zeile 17: schau dir nochmal an, wie man eine Interruptbehandlungsfunktion (Interrupt Service Routine, ISR) anlegt.
Du liest nie einen tatsächlichen Wert für "kipp" vom Schalter ein. In deinem Fall fährt das Tor immer bis ganz nach oben/unten und wartet dann wieder. Die Richtung sollte aber (auch während der Bewegung) änderbar sein). Frag das "PIN"-Register des entsprechenden Ports an der passenden Stelle ab.
In Zeile 49 bzw. 54 ist "schalter" bei dir immer 0, da du es in Zeile 35 auf diesen Wert setzt. Außer jemand drückt zwischen den beiden Zeilen grade den Schalter, aber das ist wohl ein Spezialfall...
Zeile 63: warum +1?
Zeile 64: warum setzt du das Register erst auf 0, wenn du des danach eh überschreibst?
Zeile 68/70: vorsicht, oben ist 0, unten 1023 (hat mich auch ziemlich verwirrt)
Zeile 70: wann wechselt dein "sensor" auf den Wert 1? nicht erst beim adc-wert 0.
Zeile 74: fehlt da ne Tilde ~ ?
Zeile 84/85: warum setzt die Register so? Warum nicht alle auf Ausgang, alle mit Vcc?
Zeile 87-93: vorsicht, du überschreibst die gesamten Register, egal, was vorher an den anderen Positionen stand. Das ist nicht gut...
Zeile 95: Ich glaub, in der Angabe steht, dass der Taster gegen Masse verbindet, also fallende Flanke.

Der Rest sieht auf den ersten Blick ganz gut aus :)
ingonör
Member since May 2013
67 posts
Uff, dann erst mal vielen Dank für die gründliche Korrektur!!! Ich gehe Schritt für Schritt darauf ein.

Quote by killermiller:
Du liest nie einen tatsächlichen Wert für "kipp" vom Schalter ein. In deinem Fall fährt das Tor immer bis ganz nach oben/unten und wartet dann wieder. Die Richtung sollte aber (auch während der Bewegung) änderbar sein). Frag das "PIN"-Register des entsprechenden Ports an der passenden Stelle ab.
Ist das in meinem Fall nicht egal, ob kipp aus PORTD abgefragt wird? Ich gehe Initial ja davon aus, dass der Kippschalter auf "RUNTER" steht (s. Aufgabenstellung). Und in der zweiten while Schleife (nun ab Zeile 46) prüfe ich ja, ob einerseits der Kippschalter betätigt worden ist und in welche Richtung das Tor vorher fahren sollte (durch Abfragen von 'kipp'). Damit müsste es doch möglich sein, während des Betriebs die Richtung umkehren zu können oder nicht?

Quote by killermiller:
In Zeile 49 bzw. 54 ist "schalter" bei dir immer 0, da du es in Zeile 35 auf diesen Wert setzt. Außer jemand drückt zwischen den beiden Zeilen grade den Schalter, aber das ist wohl ein Spezialfall...
Das müsste doch auch wieder OK sein. Er wurde betätigt und jetzt geht es los. Innerhalb der zweiten while-Schleife kann der Benutzer dafür sorgen, dass sich die Richtung umkehrt.

Quote by killermiller:
Zeile 63: warum +1?
Um Zahlen zw. 1 und 8 zu erzeugen. Und um die erste LED zu aktivieren, gilt doch
PORTC = (1 << 1);
oder nicht?

Quote by killermiller:
Zeile 70: wann wechselt dein "sensor" auf den Wert 1? nicht erst beim adc-wert 0.
Habe jetzt die Position der Abfrage verändert und prüfe nun, ob 'sensor == 1023'. Das sollte passen oder?

Quote by killermiller:
Zeile 74: fehlt da ne Tilde ~ ?
Eigentlich nicht, denn ich will ja Pin 1 auf 0 setzen, aber Pin 0 auf dem Wert lassen, auf dem er vorher war.

Quote by killermiller:
Zeile 84/85: warum setzt die Register so? Warum nicht alle auf Ausgang, alle mit Vcc?
Was ist daran jetzt falsch? Habe ich in der Übung auch so gemacht. Alles auf Ausgang und, da Active Low, sollte überall erst mal eine 1 stehen.

Quote by killermiller:
Zeile 87-93: vorsicht, du überschreibst die gesamten Register, egal, was vorher an den anderen Positionen stand. Das ist nicht gut...
Ok, habe es nun geändert. Aber eigentlich kann mir das in der Klausur doch egal sein oder nicht? Ich soll ja von keinem Initialen Zustand der Hardware-Register ausgesehen.

Quote by killermiller:
Zeile 95: Ich glaub, in der Angabe steht, dass der Taster gegen Masse verbindet, also fallende Flanke.
Danke! Total übersehen!!!

Jo, wie sieht es denn jetzt allgemein aus?

  1. #include <avr/io.h>
  2. #include <avr/interrupt.h>
  3. #include <avr/sleep.h>
  4. #include <stdint.h>
  5.  
  6. #define LOOPS_PER_MS 200
  7. #define RUNTER 1
  8. #define HOCH 2
  9.  
  10. uint16_t adc_read(void);
  11. /* Funktionsdeklarationen, globale Variablen, etc. */
  12. void init(void);
  13. void wait(uint16_t);
  14. volatile int8_t schalter;
  15.  
  16. /* Unterbrechungsbehandlungsfunktion */
  17. ISR (INT0_vect) {
  18.     schalter = 1;   
  19. }
  20. /* Funktion main */
  21. void main(void) {
  22.     int8_t kipp = RUNTER;
  23.     /* Initialisierung */
  24.     init();
  25.     /* Hauptschleife */
  26.     while(1) {
  27.         /* warten auf Schalterbewegung */
  28.         cli();
  29.         while(schalter == 0) {
  30.             sei();
  31.             sleep_cpu();
  32.             cli()
  33.         }
  34.         sei();
  35.         schalter = 0;
  36.         kipp = (kipp == RUNTER) ? RAUF : RUNTER;       
  37.        
  38.         /* Motor anschalten, Bewegung ueberwachen */       
  39.         if(kipp == RAUF) {
  40.             PORTA = ((1 << PD0) |(1 << PD1));
  41.             PORTD = ((1 << PD2) | (1 << PD4));
  42.         else
  43.             PORTA = (1 << PD1);
  44.             PORTD = ((1 << PD2) | (1 << PD3));
  45.         uint16_t sensor;
  46.         while(1) {     
  47.             cli();
  48.             if (kipp == RUNTER && schalter == 1) {
  49.                 kipp == RAUF;
  50.                 PORTA = ((1 << PD0) |(1 << PD1));
  51.                 PORTD = ((1 << PD2) | (1 << PD4));
  52.                 schalter = 0;
  53.             } else if(kipp == RAUF && schalter == 1) {
  54.                 kipp == RUNTER;
  55.                 PORTA = (1 << PD1);
  56.                 PORTD = ((1 << PD2) | (1 << PD4));
  57.                 schalter = 0;
  58.             }
  59.             sei();
  60.            
  61.             sensor = adc_read();
  62.            
  63.             if (kipp == RAUF && sensor == 0)
  64.                 break;
  65.             else if(kipp == RUNTER && sensor == 1023)
  66.                 break;
  67.                
  68.             sensor = sensor / 128 + 1;
  69.            
  70.             PORTC = (1 << sensor);
  71.             wait(100);     
  72.         }
  73.     /* Motor ausschalten */ //Das sollte so passen
  74.         PORTA &= 0x01;
  75.  
  76. /* Ende main */
  77.     }
  78. }
  79. /* Initialisierungsfunktion */
  80. void init(void) {
  81.     sleep_enable();
  82.     sei();
  83.    
  84.     DDRC = 0x7f;
  85.     PORTC = 0x7f;
  86.    
  87.     DDRA |= 0x3;
  88.     PORTA |= 0x00;
  89.    
  90.     PORTD |= ((1 << PD2) | (1 << PD3));
  91.     DDRD |= (1 << PD2);
  92.            
  93.     GICR |= (1 << INT0);
  94.     //Interrupt bei fallender Flanke
  95.     MCUCR = (1 << ISC01);   
  96. }
  97.  
  98. /* Wartefunktion */
  99. void wait(uint16_t ms) {
  100.     volatile uint16_t i = ms * LOOPS_PER_MS;
  101.     while(i--)
  102.         ;
  103. }
killermiller
Member since May 2011
41 posts
Quote by ingonör:
Uff, dann erst mal vielen Dank für die gründliche Korrektur!!! Ich gehe Schritt für Schritt darauf ein.

Quote by killermiller:
Du liest nie einen tatsächlichen Wert für "kipp" vom Schalter ein. In deinem Fall fährt das Tor immer bis ganz nach oben/unten und wartet dann wieder. Die Richtung sollte aber (auch während der Bewegung) änderbar sein). Frag das "PIN"-Register des entsprechenden Ports an der passenden Stelle ab.
Ist das in meinem Fall nicht egal, ob kipp aus PORTD abgefragt wird? Ich gehe Initial ja davon aus, dass der Kippschalter auf "RUNTER" steht (s. Aufgabenstellung). Und in der zweiten while Schleife (nun ab Zeile 46) prüfe ich ja, ob einerseits der Kippschalter betätigt worden ist und in welche Richtung das Tor vorher fahren sollte (durch Abfragen von 'kipp'). Damit müsste es doch möglich sein, während des Betriebs die Richtung umkehren zu können oder nicht?
Zum einen steht der aktuelle Wert nicht in PORTD, sondern in PIND und zum anderen könnte es ja auch passieren, dass jemand zwei mal hintereinander auf die "runter"-taste des Schalters drückt. Bei dir würde sich trotzdem die Richtung ändern, oder?
Genauso am Anfang. Wenn das Tor bereits unten ist und jemand nochmal auf "runter" drückt, läuft das Tor trotzdem nach oben los.
Quote by ingonör:
Quote by killermiller:
In Zeile 49 bzw. 54 ist "schalter" bei dir immer 0, da du es in Zeile 35 auf diesen Wert setzt. Außer jemand drückt zwischen den beiden Zeilen grade den Schalter, aber das ist wohl ein Spezialfall...
Das müsste doch auch wieder OK sein. Er wurde betätigt und jetzt geht es los. Innerhalb der zweiten while-Schleife kann der Benutzer dafür sorgen, dass sich die Richtung umkehrt.
Ah, ja, wenn mans so sieht, ist das okay:)
Quote by ingonör:
Quote by killermiller:
Zeile 63: warum +1?
Um Zahlen zw. 1 und 8 zu erzeugen. Und um die erste LED zu aktivieren, gilt doch
PORTC = (1 << 1);
oder nicht?
um die erste LED zu aktivieren ja. Die Sprache C fängt aber bei 0 zum zählen an. Also ist die "unterste" LED die nullte LED. D.h. dein Wertebereich geht von (1<<0) bis (1<<7).
Mal dir das am besten mal auf Papier auf, dann siehst du sofort, was passiert, wenn du eine 1 um null shiftest und was passiert, wenn du sie in einer 8-bit-variable um 8 shiftest.
Quote by ingonör:
Quote by killermiller:
Zeile 70: wann wechselt dein "sensor" auf den Wert 1? nicht erst beim adc-wert 0.
Habe jetzt die Position der Abfrage verändert und prüfe nun, ob 'sensor == 1023'. Das sollte passen oder?
jop, besser:)
Quote by ingonör:
Quote by killermiller:
Zeile 74: fehlt da ne Tilde ~ ?
Eigentlich nicht, denn ich will ja Pin 1 auf 0 setzen, aber Pin 0 auf dem Wert lassen, auf dem er vorher war.
ah, ich dachte, du willst pin1 auf 0 setzen.
So wie du das aktuell machst, setzt du aber die restlichen bits (2-7)  auch auf null. und auch hier weißt du nicht, was dranhängt, ist also nicht gut...die könnten irgendwas angeschlossen haben, von dem du nicht willst, dass es auf Masse gelegt wird. Also Register, an denen du nicht die komplette Pinbelegung kennst immer so bearbeiten, dass die unbekannten Pins nicht verändert werden. Bits auf 0 setzen immer mit &=~(1<<n), auf 1 immer mit |=(1<<n), wechseln immer mit ^=(1<<n), wenn du nur das n-te Bit verändern willst.
Quote by ingonör:
Quote by killermiller:
Zeile 84/85: warum setzt die Register so? Warum nicht alle auf Ausgang, alle mit Vcc?
Was ist daran jetzt falsch? Habe ich in der Übung auch so gemacht. Alles auf Ausgang und, da Active Low, sollte überall erst mal eine 1 stehen.
hm..ich hätt mir das bitmuster anschaun sollen, dass 0x7f liefert, dann wäre meine Antwort gleich deutlicher ausgefallen.
Pins 0 bis 7 sind 8 Pins. Du setzt aber nur die ersten sieben davon auf 1 (Pin 0 bis Pin6). Das richtige Bitmuster für acht Einsen wäre 0xff. Der Rest passt dann.
Hier ist das Überschreiben des gesamten Registers okay, da du weißt, wie das komplette Register belegt ist.
Quote by ingonör:
Quote by killermiller:
Zeile 87-93: vorsicht, du überschreibst die gesamten Register, egal, was vorher an den anderen Positionen stand. Das ist nicht gut...
Ok, habe es nun geändert. Aber eigentlich kann mir das in der Klausur doch egal sein oder nicht? Ich soll ja von keinem Initialen Zustand der Hardware-Register ausgesehen.
Nein, kann dir nicht egal sein. "kein initialer Zustand" heißt nur, dass du nicht weißt, welcher Wert vorher in dem Registert drin war. Vielleicht hat den jemand vorher aus guten Gründen auf 1 gesetzt (z.B. im Startup-Code) und will nicht, dass du das jetzt überschreibst. Beispiel: Vielleicht hängt einfach nur eine active-high "Betriebsbereit"-LED dran, die beim einschalten des µC angeht und dann ausgehen würde, sobald du ne 0 an die Stelle schreibst..
Quote by ingonör:
Quote by killermiller:
Zeile 95: Ich glaub, in der Angabe steht, dass der Taster gegen Masse verbindet, also fallende Flanke.
Danke! Total übersehen!!!
ja, Angabe gründlich lesen, bringt viele Punkte;)
Jetzt hast du aber das ISC00 vergessen. Hier greift der Satz  "kein initialer Zustand", d.h. du weißt nicht, ob vorher an der Stelle eine 0 stand, also musst du diese auch noch explizit reinschreiben.
Quote by ingonör:
[...]

Was mir grad noch einfällt: Die LEDs solltest du am Schluss wieder ausschalten :)
ingonör
Member since May 2013
67 posts
Quote by killermiller:
Zum einen steht der aktuelle Wert nicht in PORTD, sondern in PIND und zum anderen könnte es ja auch passieren, dass jemand zwei mal hintereinander auf die "runter"-taste des Schalters drückt. Bei dir würde sich trotzdem die Richtung ändern, oder?
Genauso am Anfang. Wenn das Tor bereits unten ist und jemand nochmal auf "runter" drückt, läuft das Tor trotzdem nach oben los.
Wie kann man denn bei einem Kippschalter zwei mal auf "runter" drücken? Der kennt doch nur rauf ODER runter. Ich könnte ihn höchstens mal ganz schnell auf rauf verschieben und dann gleich wieder auf runter. Aber das wird ja so gesehen bei mir abgefangen. Ist ja kein Taster, sondern ein Kippschalter. Laut Angabe.

Quote by killermiller:
um die erste LED zu aktivieren ja. Die Sprache C fängt aber bei 0 zum zählen an. Also ist die "unterste" LED die nullte LED. D.h. dein Wertebereich geht von (1<<0) bis (1<<7).
Mal dir das am besten mal auf Papier auf, dann siehst du sofort, was passiert, wenn du eine 1 um null shiftest und was passiert, wenn du sie in einer 8-bit-variable um 8 shiftest.
Ok, also '+1' rausgeschmissen.

Quote by killermiller:
ah, ich dachte, du willst pin1 auf 0 setzen.
So wie du das aktuell machst, setzt du aber die restlichen bits (2-7)  auch auf null. und auch hier weißt du nicht, was dranhängt, ist also nicht gut...die könnten irgendwas angeschlossen haben, von dem du nicht willst, dass es auf Masse gelegt wird. Also Register, an denen du nicht die komplette Pinbelegung kennst immer so bearbeiten, dass die unbekannten Pins nicht verändert werden. Bits auf 0 setzen immer mit &=~(1<<n), auf 1 immer mit |=(1<<n), wechseln immer mit ^=(1<<n), wenn du nur das n-te Bit verändern willst.
Toll, danke für die gute Zusammenfassung! Schalte den Motor nun über ^= aus.

Quote by killermiller:
hm..ich hätt mir das bitmuster anschaun sollen, dass 0x7f liefert, dann wäre meine Antwort gleich deutlicher ausgefallen.
Pins 0 bis 7 sind 8 Pins. Du setzt aber nur die ersten sieben davon auf 1 (Pin 0 bis Pin6). Das richtige Bitmuster für acht Einsen wäre 0xff. Der Rest passt dann.
Hier ist das Überschreiben des gesamten Registers okay, da du weißt, wie das komplette Register belegt ist.

Upps, verzählt. Natürlich 0xff!

Quote by killermiller:
ja, Angabe gründlich lesen, bringt viele Punkte;)
Jetzt hast du aber das ISC00 vergessen. Hier greift der Satz  "kein initialer Zustand", d.h. du weißt nicht, ob vorher an der Stelle eine 0 stand, also musst du diese auch noch explizit reinschreiben.

Korrigiert!

Quote by killermiller:
Was mir grad noch einfällt: Die LEDs solltest du am Schluss wieder ausschalten :)

Natürlich! ;)

Puh, also in der Klausur hätte ich das ja mal echt verkackt! :D
morty
SPiC-Meister
(Moderator)
Member since May 2011
331 posts
Quote by ingonör:
Quote by killermiller:
Zum einen steht der aktuelle Wert nicht in PORTD, sondern in PIND und zum anderen könnte es ja auch passieren, dass jemand zwei mal hintereinander auf die "runter"-taste des Schalters drückt. Bei dir würde sich trotzdem die Richtung ändern, oder?
Genauso am Anfang. Wenn das Tor bereits unten ist und jemand nochmal auf "runter" drückt, läuft das Tor trotzdem nach oben los.
Wie kann man denn bei einem Kippschalter zwei mal auf "runter" drücken? Der kennt doch nur rauf ODER runter. Ich könnte ihn höchstens mal ganz schnell auf rauf verschieben und dann gleich wieder auf runter. Aber das wird ja so gesehen bei mir abgefangen. Ist ja kein Taster, sondern ein Kippschalter. Laut Angabe.
Hmm, es war wohl ein Kipptaster gemeint (Für Informatiker ist das alles das gleiche ;) )  - und mir fällt das schon auch nicht mehr auf. :(
ingonör
Member since May 2013
67 posts
Quote by morty:
Hmm, es war wohl ein Kipptaster gemeint (Für Informatiker ist das alles das gleiche ;) )

Oha, das wäre aber echt ein Problem, wenn da Kippschalter steht und ein Taster gemeint ist. Wenn ich Maschinenelemente berechne, steht da auch nicht: "Berechnen Sie den Bolzen auf Dauerfestigkeit!" und am Ende war aber eine Schraube gemeint. Na ja, irgendwie fand ich die gate Aufgabe nicht so dolle. In der Klausur hätte es mich da ganz schön zerlegt. Hoffe der safe (s. anderer Thread) ist mir nun besser gelungen.
killermiller
Member since May 2011
41 posts
Quote by ingonör:
Quote by morty:
Hmm, es war wohl ein Kipptaster gemeint (Für Informatiker ist das alles das gleiche ;) )

Oha, das wäre aber echt ein Problem, wenn da Kippschalter steht und ein Taster gemeint ist. Wenn ich Maschinenelemente berechne, steht da auch nicht: "Berechnen Sie den Bolzen auf Dauerfestigkeit!" und am Ende war aber eine Schraube gemeint. Na ja, irgendwie fand ich die gate Aufgabe nicht so dolle. In der Klausur hätte es mich da ganz schön zerlegt. Hoffe der safe (s. anderer Thread) ist mir nun besser gelungen.
Joar, die Aufgabe war nicht so optimal gestellt...
morty
SPiC-Meister
(Moderator)
Member since May 2011
331 posts
ingnör: Da sind einige Aufgaben dabei die nicht sehr gut gestellt sind. Das ist halt nicht unproblematisch wenn Informatiker versuchen für nicht-Informatiker anschauliche Aufgabenstellungen zu entwerfen. In sofern hinkt ja auch dein Vergleich mit ME ein wenig. Aber ich glaube irgendwelche Akademischen aufgaben wäre auch nicht besser.... Aber im Zweifel für den Angeklagten - Mit der Begründung, dass da Schalter steht und dieser ja nur zwei Zustände haben kann, hättest du wohl deine Punkte bekommen.
ingonör
Member since May 2013
67 posts
Quote by morty:
Aber im Zweifel für den Angeklagten - Mit der Begründung, dass da Schalter steht und dieser ja nur zwei Zustände haben kann, hättest du wohl deine Punkte bekommen.

Hurra!   :-D
FanFan
FSI EEI & FSI Mechatronik
(Moderator)
Member since Oct 2010
76 posts
In reply to post #3
Was macht eigewntlich folgende Zeile?

Ist das eine if-Abfrage inklusive Veränderung des Status von kipp?

Quote by ingonör on 2013-07-18, 07:45:
  1. kipp = (kipp == RUNTER) ? RAUF : RUNTER;

Muss mann eigentlich gegebene Makros benutzen?

Ich habe zu spät gesehen, dass es hier "HOCH" und "RUNTER" gibt.
Ich habe immer PORTD an den Stellen 3 und 4 ausgelesen um an den Zustand des Schalters zu kommen.
Wofür waren die also gedacht?
ingonör
Member since May 2013
67 posts
Quote by FanFan:
Ist das eine if-Abfrage inklusive Veränderung des Status von kipp?

Sozusagen, ja! Es handelt sich hier bei um einen bedingten Ausdruck.
FanFan
FSI EEI & FSI Mechatronik
(Moderator)
Member since Oct 2010
76 posts
Also in Langform:
  1. if(kipp==RUNTER){
  2.     kipp = RAUF;
  3. }else{
  4.     kipp = RUNTER;
  5. }
ingonör
Member since May 2013
67 posts
Exakt!
Close Smaller – Larger + Reply to this post:
Verification code: VeriCode Please enter the word from the image into the text field below. (Type the letters only, lower case is okay.)
Smileys: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O :troll:
Special characters:
Go to forum
Powered by the Unclassified NewsBoard software, 20110527-dev, © 2003-8 by Yves Goergen