Not logged in. · Lost password · Register

yv21ipim
Member since Jan 2013
7 posts
Subject: Klausur Juli 2009
Hier ein möglicher Lösungsvorschlag; kann jemand mal drüberschaun? wäre nett ;)

Schreiben Sie ein AVR-Mikrokontroller-Programm zur Kontrolle eines Wassertanks mit
einem Fassungsvermögen von 60000 Litern. Der Zufluss wird über ein Ventil geregelt, welches sich im entsperrten Zustand bei eintreffendem Wasser automatisch öffnet und bei versiegendem Wasser wieder schließt. Öffnen (fallende Flanke) und Schließen (steigende
Flanke) des Ventils werden dem Mikrokontroller hierbei über eine Interruptleitung signalisiert. Beim Erreichen eines vollen Tanks sperrt die Steuerung das Zuflussventil. Die Wasserentnahme erfolgt durch eine externe Steuerung, welche an einer Interruptleitung jeweils nach
jedem entnommenen Liter eine fallende Flanke generiert.
Das Programm soll im Einzelnen wie folgt funktionieren:
– Zu Beginn ist der Tank leer und es fließt kein Wasser (Ventil geschlossen).
– Die main-Funktion ruft zunächst die Funktion void init(); auf, welche die Initialisierung der I/O-Ports und Interruptquellen durchführt. Hierbei dürfen keine
Annahmen über den initialen Zustand der Register gemacht werden.
– Die Steuerung soll den Prozessor in den Standardstromsparmodus versetzen, wenn
gerade nichts zu tun ist.
– Während eines Zuflusses überwacht die Steuerung die in den Tank strömende Wassermenge. Hierzu können Sie eine Schleife verwenden und vereinfachend annehmen, dass zu jedem Schleifendurchlauf ein Liter Wasser in den Tank strömt
(unabhängig vom Inhalt der Schleife). Beim Erreichen der maximalen Tankfüllung
sperrt die Steuerung das Ventil (Ausgangspegel: 0=entsperrt, 1=gesperrt).
– Eine Wasserentnahme ist jederzeit möglich und entsprechende Signale sollen so
zuverlässig wie möglich verarbeitet werden. Sobald wieder Platz im Tank frei ist
wird das Ventil wieder entsperrt.
Information über die Hardware
Ventilsignal: PORTD, Pin 2
- externe Interruptquelle 0, ISR-Vektor-Makro: INT0_vect
- Aktivierung der Interruptquelle erfolgt durch Setzen des INT0-Bits im Register GICR
Ventilsperre: PORTD, Pin 0
- Pin als Ausgang konfigurieren: entsprechendes Bit in DDRD-Reg. auf 1
Entnahmesignal: PORTD, Pin 3
- externe Interruptquelle 1, ISR-Vektor-Makro: INT1_vect
- Aktivierung der Interruptquelle erfolgt durch Setzen des INT1-Bits im Register GICR
Externe Interruptquelle 0 bzw. 1 konfigurieren:
- Pin als Eingang konfigurieren: entsprechendes Bit in DDRD-Reg. auf 0
- angeschlossenes Gerät verbindet den Pin mit Masse, es muss der interne
 Pullup-Widerstand verwendet werden (entspr. Bit in PORTD-Reg. auf 1 setzen).
- Konfiguration der externen Interruptquellen (Bits in Register MCUCR)

/* Funktionsdeklaration, globale Variablen, etc. */
static void init(void);
static volatile entnahme = 0;
static volatile event = 0;
static volatile ventilzustand = 0;
/* Unterbrechungsbehandlungsfunktion */
ISR(INT1_vect){
    entnahme =1;
}
ISR(INT0_vect){
    event = 1;
    ventilzustand = !((PIND && (1<<2));
}

/* Funktion main */
void main (void){
/* Initialisierung */
    init();
    uint16_t tankstand = 0;
    while(1){
/* Warten auf Ereignis */
        cli();
        while(!(event|entnahme)){
            sleep_enable();
            sei();
            sleep_cpu();
            sleep_disable();
            cli();
        }
        sei();
/* Zufluss überwachen */
        while(ventilzustand|entnahme) {
            cli();
            if(ventilstand) {
                sei();
                tankstand++;
            }
            cli();
            if(entnahme){
                sei();
                tankstand--;
            }
            sei();
            if(tankstand >= 60000u) break;
            event = 0;
            entnahme = 0;
        }
        if(tankstand >= 60000u){
            PORTD |= (1<<0);
        }
    }
}
/* Ende der Funktion main */
/* Funktion init*/
static void init(void) {
    DDRD |= 1;
    DDRD &= ~((1<<2)|(1<<3));
    PORTD |= 0x7;
   
    MCUCR |=  (1<<ISC00)|(1<<ISC11);
    MCUCR &= ~((1<<ISC01)|(1<<ISC10));
    GICR |= (1<<INT0)|(1<<INT1);
    sei();
}
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