MezData-Logo

FAQ zu AVR µController

Zwei Musterfolgen ausgeben

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

 

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

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

Entwickeln und implementieren Sie den restlichen Quelltext. Das C-Projekt bekommt den Namen muster_ueb1 und wird später erweitert.

Lösung anzeigen..

Duplizieren Sie das C-Projekt muster_ueb1 und nennen es muster_ueb2. Der Musterwechsel soll nun mittels Timer0 OverFlowInterrupt erfolgen. Modifizieren Sie den Quelltext entsprechend.

Lösung anzeigen..

Duplizieren Sie das C-Projekt muster_ueb1 und nennen es muster_ueb3. Die Ausgabegeschwindigkeit soll nun mittels Taste an PD1 umgeschaltet werden können. Ein Array mit verschiedenen Geschwindigkeitsstufen ist gegeben:

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

Die Wartezeiten sollen mit _delay_ms() realisiert werden, jedoch "explodiert" der Quellcode wenn _delay_ms() mit einer Variablen statt einer Konstanten aufgerufen wird. Deshalb verwenden Sie ein Unterprogramm my_delay_ms(unsigned int n) mit dem Aufruf von _delay_ms(1) in einer Schleife.

Lösung anzeigen..

Duplizieren Sie das c-Projekt muster_ueb2 und nennen es muster_ueb4. Die Ausgabegeschwindigkeit soll nun mittels Taste an PD1 umgeschaltet werden können. Ein Array mit verschiedenen Geschwindigkeitsstufen ist gegeben:

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

Der Vorstellwert in der ISR kann variiert werden, ermitteln Sie die Zeiten für die Extremwerte und ersinnen Sie eine Lösung.

Lösung anzeigen..

Alarmanlage mit Telefonimpulswahl (Alarmanruf)

Aufgabe ähnlich zu Abi 06/07A2. Mit einem ATtiny2313 @ 1MHz soll eine Alarmanlage mit Telefonruffunktion realisiert werden. Im Alarmfall wird durch PB1 und PB0 mit Impulswahl eine Telefonnummer angerufen. Das C-Projekt bekommt den Namen alarmanlage1.

Impulswahlverfahren: Ein Impuls besteht aus 50ms high und 50ms low. Für die Ziffern 1..9 werden 1..9 Impulse ausgegeben. Die Ziffer 0 ist mit 10 Impulsen codiert. Zwischen den Impulsfolgen der Ziffern wird eine 200ms Pause eingelegt.

Die Alarmanlage hat 7 Eingänge PD0..PD6 mit eingeschalteten PullUps und Tastern gegen GND. Der Alarm wird durch Betätigen eines der Taster ausgelöst. Die Prellzeit der Taster beträgt 5ms. Im Alarmfall geht PB0 auf GND (Gabelkontakt, Telefon wird abgehoben) und 200ms später wird mit PB1 die Notrufnummer gewählt, dann stoppt das Programm. Die Alarmanlage lässt sich nur durch Aus- und wieder Einschalten zurück setzen.

Ist ein Entprellen der Alarmeingänge notwendig, Begründung?

Erstellen Sie ein Unterprogramm impulse(n:GZ), das eine Anzahl von n Impulsen ausgibt. Verwenden Sie die _delay_ms() Funktion.

Erstellen Sie ein Unterprogramm ziffer(n:GZ), das eine Ziffer n wählt

Die Notrufnummer wird in einem Array nummer[]={0,7,9,1,5,5,5,3,2} gespeichert.

Entwickeln Sie das Hauptprogramm.

Ein Timer soll alle 50ms einen Interrupt auslösen. Erstellen Sie die Initialisierung und die ISR.

Vergleichen Sie die Taktgenerierung durch eine Warteschleife mit der Realisierung durch einen Timer. Gehen Sie hierbei besonders auf folgende Punkte ein: Prozessorbelastung und Genauigkeit.

Duplizieren Sie das C-Projekt alarmanlage1 und nennen es alarmanlage2. Modifizieren Sie den Quellcode so, dass auf durch Verwendung des Timerinterrupts auf _delay_ms() verzichtet werden kann.

Wie kann die Nummer die die Alarmanlage anruft geändert werden, beschreiben Sie geeignete Verfahren.

Sekundentimer mit binärer BCD-Ausgabe

Mit einem ATtiny2313 @ 1Mhz (STK200) soll an PORTB mit neg. Logik eine zweistellige Sekundenanzeige mit BCD-Zahlen gebaut werden. PB7..4 geben die Zehner und PB3..0 die Einer in BCD aus. Ein Array sekunden[]={0,0} merkt sich die Zehner und Einer.

Erstellen Sie ein Unterprogramm ausgeben() für die Ausgabe der sekunden.

Erstellen Sie ein Unterprogramm incs(), das die Sekunden erhöht.

Der Timer wird mittels Taster an PD0 gestartet und gestoppt. Der Taster an PD1 setzt den Timer zurück. Das Unterprogramm incs() wird in einer ISR aufgerufen. Erstellen Sie das Hauptprogramm und die ISR. Zwecks Entprellen kann keycheck.inc verwendet werden.

Uhr mit 7-Segment LED-Anzeige

Aufgabenfragment. Siehe Gemultiplexte Siebensegment Anzeige. Ein Feld für die Ausgabe ausgabespeicher[]={0,0,0,0}

Erstellen Sie Umcodierungsarray ziffer_7seg[]={} zur Ausgabe auf die Anzeige, Codierung in HEX-Darstellung!

Erstellen Sie ein Unterprogramm ausgabe(), dass die bei jedem Aufruf eine Ziffer aus ausgabespeicher[] ausgibt, nach jedem Aufruf wird eine Stelle vorgerückt.

Führende Nullen bei der Ausgabe sollen unterdrückt werden, modifizieren Sie das UP

Die Ausgabe soll 400 mal pro Sekunde mittels Interrupt aufgerufen werden erstellen Sie Initialisierung und ISR

In der ISR sollen die Sekunden gezählt werden und jede Sekunde ein UP sekunde() aufgerufen werden.

Erstellen Sie UP sekunde(), dass die Minuten bei Ausgabenspeicher erhöht.

Erstellen Sie HP mit den notwendigen Initialisierungen

Entwickeln Sie ein Verfahren mit dem die Uhr mittels Taster an PD2..PD0 gestellt werden kann, skizzieren Sie mittels PAP.