Nicht angemeldet. · Kennwort vergessen · Registrieren

mr mojo
Mitglied seit 11/2011
3 Beiträge
Betreff: 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
Mitglied seit 07/2012
9 Beiträge
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. }
Dieser Beitrag wurde am 24.07.2012, 20:52 von TW verändert.
morty
SPiC-Meister
(Moderator)
Mitglied seit 05/2011
331 Beiträge
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
Mitglied seit 10/2011
4 Beiträge
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???
Dieser Beitrag wurde am 24.07.2012, 11:53 von bongo verändert.
TW
Mitglied seit 07/2012
9 Beiträge
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)
Mitglied seit 05/2011
331 Beiträge
TW: Überleg mal was passiert wenn du das Potti hin und her drehst und welche LEDs dann an bzw aus gehen.
il66ifix
Mitglied seit 05/2011
110 Beiträge
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
Mitglied seit 07/2012
9 Beiträge
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?
Dieser Beitrag wurde 3 mal verändert, zuletzt am 24.07.2012, 20:55 von TW.
morty
SPiC-Meister
(Moderator)
Mitglied seit 05/2011
331 Beiträge
Zitat von 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
Mitglied seit 07/2012
9 Beiträge
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?
Dieser Beitrag wurde am 25.07.2012, 00:16 von TW verändert.
morty
SPiC-Meister
(Moderator)
Mitglied seit 05/2011
331 Beiträge
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)
Mitglied seit 05/2011
331 Beiträge
Antwort auf Beitrag #10
Zitat von 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
Dieser Beitrag wurde am 25.07.2012, 09:33 von morty verändert.
TW
Mitglied seit 07/2012
9 Beiträge
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)
Mitglied seit 05/2011
331 Beiträge
Zitat von 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
Mitglied seit 07/2012
9 Beiträge
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?
Schließen Kleiner – Größer + Auf diesen Beitrag antworten:
Prüfcode: VeriCode Gib bitte das Wort aus dem Bild ins folgende Textfeld ein. (Nur die Buchstaben eingeben, Kleinschreibung ist in Ordnung.)
Smileys: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O :troll:
Weitere Zeichen:
Gehe zu Forum
Powered by the Unclassified NewsBoard software, 20110527-dev, © 2003-8 by Yves Goergen