MezData-Logo

Zylonenauge Übungen

Zwei Musterfolgen ausgeben

Muster 1Zwei Musterfolgen sollen ausgegeben werden. Die Umschaltung der Muster erfolgt über Taste T0. Im weiteren Verlauf kann die Ausgabegeschwindigkeit mit Taste an T1 verändert werden.

Quellcode Vorgabe [zylon-muster1/zylon-muster1-aufg.h]
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
 
/*
 * Aufgabe 1 muster-Array
 */
unsigned char musterzaehler=1,musternummer=0;
 
#define KEYREADER (~PIND)>>4 // Einlesen, invertieren, maskieren zurecht schieben
unsigned char keyOld = 0;         // alter Tasten-Zustand
unsigned char keyEnter, keyExit;  // gedrueckte und losgelassene Tasten
 
void keyCheck() {                 // Tastaturabfrage mit Flankendedektion
  unsigned char keyTest, tmp;
  keyEnter = 0, keyExit = 0;
  keyTest = KEYREADER;            // Einlesen
  if (keyOld != keyTest) {        // hat sich was getan
    _delay_ms(20);                // Prellen abwarten
    tmp = KEYREADER;              // noch mal Einlesen
    if (tmp == keyTest) {         // ist es stabil?
      keyEnter = (~keyOld) & keyTest; // steigende Flanke !alt und neu
      keyExit = keyOld & (~keyTest);  // fallende Flanke alt und !neu
      keyOld = keyTest;
    }
  }
}
 
void wechsleMuster(){
  /*
   * Aufgabe 2 
   */
}
 
int main(){         // Hauptprogramm 
  DDRB = 0xFF;      // PORTB als Ausgang
  PORTB = 0xE0;     // Leds L3..L0 aktiv
  PORTD = 0x70;     // PullUps an
  while(1){         // Endlosschleife 
    keyCheck();
    if(keyEnter&1){ // Taste gedrueckt?
      musternummer++;
      if(musternummer>=sizeof(muster)/sizeof(muster[0])) musternummer=0;
    }
    wechsleMuster();
    _delay_ms(400);
  } 
  return 0; 
}
 

Erstellen Sie ein Array muster[][] für die zwei Muster.

Das Feld muster beginnt bei Adresse 0x60. Wie sieht die Speicherbelegung für das Feld aus?

Erstellen Sie ein Unterprogramm wechsleMuster(), das bei jedem Aufruf das nächste Muster ausgibt.

Lösung anzeigen..

Erstellen Sie ein Struktogramm für main().

 

Duplizieren Sie das Projekt als zylon-muster2. Der Musterwechsel soll nun mittels Timer0 CTC-Interrupt erfolgen, in dessen ISR wechsleMuster() aufgerufen wird. Modifizieren Sie den Quelltext entsprechend.

Lösung anzeigen..

Was passiert, wenn bei Muster 0011 die Taste gedückt wird, wie sieht der Übergang aus?

Duplizieren Sie das Projekt als zylon-muster3. Die Ausgabegeschwindigkeit soll nun mittels Taste T1 umgeschaltet werden können. Ein Array mit verschiedenen Geschwindigkeitsstufen ist gegeben:

musterAnzeigendauer[]={400,200,100,50}; // Zeiten des Wartens in ms bis naechstes Muster
    

Welchen Datentyp muss das Feld haben?

Die Wartezeiten sollen mit einer eigenem Delay my_delay_ms(unsigned int n) realisiert werden, das einen Tick-Zähler in der ISR verwendet.

Ändern Sie die Einstellungen des Timers für einen Aufruf jede ms. Im Timer wird eine Variable ticks hochgezählt, die in my_delay_ms(..) verwendet wird.

Wie und wo muss ticks definiert werden, Begründen Sie.

Im Hauptprogramm wird bei Druck auf Taste T1 eine Variable anzeigendauerIndex hochgezählt bzw. wieder auf 0 gesetzt.

In der TimerISR wird wechsleMuster() entsprechend des anzeigedauerIndex aufgerufen.

Modifizieren Sie den Quellcode entsprechend.

Lösung anzeigen..