Not logged in. · Lost password · Register

mr mojo
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++){
            ;
        }
    }
TW
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

  1. /* Funktionsdeklarationen, globale Variablen, etc. */
  2.  
  3. static volatile uint8_t event =0;
  4. void wait(void);
  5. void init(void);
  6.  
  7.  
  8. /* Unterbrechungsbehandlungsfunktion */
  9.  
  10. ISR(INT0_vect){
  11.     event=1;
  12. }
  13.  
  14.  
  15. /* Funktion main */
  16.  
  17. void main(void){
  18.  
  19.     sei();
  20.  
  21.  
  22. /* Initialisierung und lokale Variablen */
  23.  
  24.     uint16_t wert;
  25.     init();
  26.  
  27.  
  28. /* Hauptschleife */
  29.  
  30.     while(1){
  31.  
  32.  
  33. /* Konfigurationsphase */
  34.  
  35.         event=0;
  36.         while(!event){
  37.             for(uint8_t i=0; i<(poti_read()/256); i++){
  38.                 PORTB &= ~(1<<i);
  39.             }
  40.         }
  41.  
  42.  
  43. /* Countdown-Phase */
  44.  
  45.         event=0;
  46.         wert=poti_read();
  47.         for(uint8_t i=wert; i>0; i--){
  48.             wait();
  49.             for(uint8_t l= 0; l<i; i++){
  50.                 PORTB &= ~(1<<l);
  51.             }
  52.             if(event){
  53.                 i=0;
  54.             }
  55.         }
  56.  
  57.  
  58. /* LED-Alarm-Sequenz */
  59.  
  60.         if(event){
  61.             PORTB = 0xaa;
  62.             wait();
  63.             PORTB = 0x55;
  64.             wait();
  65.         }
  66.  
  67.  
  68. /* Schlaf-Phase */
  69.  
  70.         cli();
  71.         sleep.enable();
  72.         while(!event){
  73.             sei();
  74.             sleep.cpu();
  75.             cli();
  76.         }
  77.         sei();
  78.         sleep.disable();
  79.  
  80.  
  81.     }
  82. }
  83. /* Ende Funktion main */
  84.  
  85. /* Initialisierungsfunktion */
  86.  
  87. static void init(void){
  88.     DDRB |= 0xff;
  89.     PORTB |= 0xff;
  90.     DDRD &= ~(1<<2);
  91.     PORTD |= (1<<2);
  92.     GICR |= (1<<INT0);
  93.     MCUCR |= (1<<ISC01);
  94.     MCUCR &= ~(1<<ISC00);
  95. }
  96.  
  97.  
  98. /* Wartefunktion */
  99.  
  100. static void wait(void){
  101.     for(volatile uint16_t i=0; i<60000, i++);
  102. }
This post was edited on 2012-07-24, 19:52 by TW.
morty
SPiC-Meister
(Moderator)
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.
bongo
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???
This post was edited on 2012-07-24, 10:53 by bongo.
TW
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^^
morty
SPiC-Meister
(Moderator)
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.
il66ifix
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
TW
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
  1. for(uint8_t i=0; i<8; i++){
  2.     if( i<(poti_read()/128)){      //die 256 im ursprünglichen Code war auch falsch
  3.         PORTB &= ~(1<<i);
  4.     }else{
  5.         PORTB |= (1<<i);
  6.     }
  7. }
so müsste dieses problem dann behoben sein oder?
This post was edited 3 times, last on 2012-07-24, 19:55 by TW.
morty
SPiC-Meister
(Moderator)
Member since May 2011
331 posts
Quote by TW:
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
  1. for(uint8_t i=0; i<8; i++){
  2.     if( i<(poti_read()/128)){      //die 256 im ursprünglichen Code war auch falsch
  3.         PORTB &= ~(1<<i);
  4.     }else{
  5.         PORTB |= (1<<i);
  6.     }
  7. }
so müsste dieses problem dann behoben sein oder?

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!
TW
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

  1. wert = poti_read()/128;
  2. for(uint8_t i=0; i<8; i++){
  3.     if(i<wert){
  4.         PORTB &= ~(1<<i);
  5.     }else{
  6.         PORTB |= (1<<i);
  7.     }
  8. }

das müsste die oben angesprochenen effekte vermeiden oder?
This post was edited on 2012-07-24, 23:16 by TW.
morty
SPiC-Meister
(Moderator)
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. ;) Ach ja - wir sind in C; nicht Java - es heißt sleep_enable() - in der Klausur würde man da aber wahrscheinlich Gnade walten lassen, sofern es sonst im Groben und Ganzen passt.
morty
SPiC-Meister
(Moderator)
Member since May 2011
331 posts
In reply to post #10
Quote by TW:
  1. wert = poti_read()/128;
  2. for(uint8_t i=0; i<8; i++){
  3.     if(i<wert){
  4.         PORTB &= ~(1<<i);
  5.     }else{
  6.         PORTB |= (1<<i);
  7.     }
  8. }

das müsste die oben angesprochenen effekte vermeiden oder?

EDIT: Ja, sind gelöst - hatte einen Knoten im Hirn
This post was edited on 2012-07-25, 08:33 by morty.
TW
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?
morty
SPiC-Meister
(Moderator)
Member since May 2011
331 posts
Quote by TW:
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?
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.
TW
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)

  1. /* Countdown-Phase */
  2.  
  3.         event=0;
  4.         for(uint8_t i=wert; i>0; i--){
  5.             wait();
  6.             PORTB |= (1<<i);
  7.             if(event){
  8.                 i=0;
  9.             }
  10.         }
  11.         PORTB = 0xff;

das müsste jetzt denk ich funktionieren?
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