Menu Close

Mikroprozessorsysteme (Praktikum 3)

Aufgabe 1:

  • Es soll eine Kolbenhubpumpe, welche über PA1/TIOA3 angesteuert wird, betrieben werden.
  • Die Pumpe benötigt ein symmetrisches Rechtecksignal mit einer Frequenz von ca. 50Hz. Sie könnten eine Zeitschleife programmieren. Hiermit würden Sie aber den Prozessor blockieren (Erinnerung an Termin 2). Besser ist es, Sie initialisieren einen Timer (Timer3) so, dass dieser selbstständig das Signal für die Pumpe erzeugt.
  • Vervollständigen Sie die das gegebene Programm Termin3Aufgabe1.c entsprechend. Ergänzen Sie auch die noch fehlenden Kommentare.
/ Aufgabe 1
// von:
// vom:
//

#include "../h/pmc.h"
#include "../h/tc.h"
#include "../h/pio.h"
#include "../h/aic.h"

// Timer3 initialisieren
void Timer3_init( void )
{
StructTC* timerbase3 = TCB3_BASE; // Basisadressse TC Block 1
StructPIO* piobaseA = PIOA_BASE; // Basisadresse PIO B

timerbase3->TC_CCR = TC_CLKDIS; // Disable Clock
// Initialize the mode of the timer 3
timerbase3->TC_CMR =
TC_ACPC_CLEAR_OUTPUT | //ACPC : Register C clear TIOA
TC_ACPA_SET_OUTPUT | //ACPA : Register A set TIOA
TC_WAVE | //WAVE : Waveform mode
TC_CPCTRG | //CPCTRG : Register C compare trigger enable
TC_CLKS_MCK8; //TCCLKS : MCKI / 8

// Initialize the counter:
timerbase3->TC_RA = 31250; //Flanke hoch
timerbase3->TC_RC = 62500; //Flanke runter

// Start the timer :
timerbase3->TC_CCR = TC_CLKEN ; //Clock enable
timerbase3->TC_CCR = TC_SWTRG ; //Enable Software Trigger
piobaseA->PIO_PER = (1<<PIOTIOA3) ; // PIO A kontrolliert Timer3
piobaseA->PIO_OER = (1<<PIOTIOA3) ; // als Ausgang
piobaseA->PIO_CODR = (1<<PIOTIOA3) ; // einschalten
}

int main(void)
{

StructPMC* pmcbase = PMC_BASE; // Basisadresse des PMC
StructPIO* piobaseA = PIOA_BASE; // Basisadresse PIO A
StructPIO* piobaseB = PIOB_BASE; // Basisadresse PIO B

pmcbase->PMC_PCER = 0x6200; // Peripheral Clocks einschalten für PIOA,PIOB,TC3

// ab hier entsprechend der Aufgabestellung ergänzen
//**************************************************

Timer3_init(); // Timer3 initialisieren

while(1)
{

}

return 0;
}
  • Notizen:

Power Management

  • Man darf nicht vergessen sowohl PIO A, als auch PIO B und den Timer 3 am Peripheral Clock Enable Register einzuschalten, wenn man Timer als auch Tasten verwenden möchte ( bezieht sich auf Aufgabe 2 ) Hierbei ergibt sich folgende binäre Aktivierung: 110001000000000 ( bzw.: 0x6200 ).

Berechnung der Zähler RA und RC:

  • Bei der Berechnung der Werte für die Register RA und RC sind mehrere Lösungen möglich.
  • RA steht hierbei für den Zeitpunkt einer steigenden Flanke und RC steht für den Zeitpunkt der fallenden Flanke und dem Neubeginn des Taktzyklus.
  • Um die Frequenz so präzise wie möglich zu berechnen wird mittels TC_CLKS_MCKX die Taktrate skaliert ( CPU / X ) , damit der Wert des Registers RC nicht bereits vor dem Ende der eigentlichen Taktzeit erreicht wird. ( X steht für 2/8/32/128/1024 → TC_CLKS_MCK8 ). 
  • Würde man die Skalierung mit 2 wählen, so wäre ein Überlauf bereits nach 0,00262144 Sekunden erreicht, wir haben mit 50Hz aber eine Laufzeit von 0,02097152 Sekunden.
  • Je kleiner der Nenner, desto exakter ist der berechnete Wert. Um Rundungsfehler zu vermeiden, sollte die Skalierung so gewählt werden, dass nur ganzzahlige Integer-Werte ( und keine Double-Werte ) verwendet werden.
MCKTakt(Hz)MCK/XPeriodendauerCounter Duration (sec)Überlauf/secFrequenzRegister-Wert
125.000.000250000000,000000040,00262144381,469726650500000
225.000.000125000000,000000080,00524288190,734863350250000
825.000.00031250000,000000320,0209715247,683715825062500
3225.000.0007812500,000001280,0838860811,920928965015625
12825.000.000195312,50,000005120,335544322,980232239503906,25
102425.000.00024414,06250,000040962,684354560,3725290350488,28125

Aufgabe 2

  • Entwickeln Sie eine Funktion, mit der Sie die Tasten SW1 – SW3 der auf dem Board befindlichen Tasten abfragen können.
  • Mit der Taste SW2 soll die Pumpe eingeschaltet und mit der Taste SW1 soll die Pumpe abgeschaltet werden können.
// Lösung zu Termin3
// Aufgabe 1
// von:
// vom:
//

#include "../h/pmc.h"
#include "../h/tc.h"
#include "../h/pio.h"
#include "../h/aic.h"

void taste_irq_handler (void) __attribute__ ((interrupt));

// Interruptserviceroutine für die Tasten SW1 und SW2
void taste_irq_handler (void)
{
StructPIO* piobaseB = PIOB_BASE; // Basisadresse PIO B
StructAIC* aicbase = AIC_BASE; //Basisadresse AIC

// ab hier entsprechend der Aufgabestellung ergänzen
// *************************************************
StructPIO* piobaseA = PIOA_BASE;

// Einschalten
if(!(piobaseB->PIO_PDSR & 0x10)) { // Taste 2 zum einschalten
piobaseA->PIO_PDR = (1PIO_PER = (1PIO_ISR; // Interrupt beenden
}

// Timer3 initialisieren
void Timer3_init( void )
{
StructTC* timerbase3 = TCB3_BASE; // Basisadressse TC Block 1
StructPIO* piobaseA = PIOA_BASE; // Basisadresse PIO B

timerbase3->TC_CCR = TC_CLKDIS; // Disable Clock
// Initialize the mode of the timer 3
timerbase3->TC_CMR =
TC_ACPC_CLEAR_OUTPUT | //ACPC : Register C clear TIOA
TC_ACPA_SET_OUTPUT | //ACPA : Register A set TIOA
TC_WAVE | //WAVE : Waveform mode
TC_CPCTRG | //CPCTRG : Register C compare trigger enable
TC_CLKS_MCK8; //TCCLKS : MCKI / 8

// Initialize the counter:
timerbase3->TC_RA = 31250; //Flanke hoch
timerbase3->TC_RC = 62500; //Flanke runter

// Start the timer :
timerbase3->TC_CCR = TC_CLKEN ; //Clock enable
timerbase3->TC_CCR = TC_SWTRG ; //Enable Software Trigger
piobaseA->PIO_PER = (1AIC_ICCR= 1 << 14; // InterruptPIOB löschen aicbase->AIC_SVR[PIOB_ID] = (unsigned int)taste_irq_handler;
aicbase->AIC_SMR[PIOB_ID] = 0x7; // Priorität
aicbase->AIC_IECR= 1 << 14; // InterruptPIOB einschalten piobaseB->PIO_IER= KEY1|KEY2; // Interrupt innerhalb PIOB erlauben ////

pmcbase->PMC_PCER = 0x6200; // Peripheral Clocks einschalten für PIOA,PIOB,TC3

// ab hier entsprechend der Aufgabestellung ergänzen
//**************************************************

Timer3_init(); // Timer3 initialisieren

while(1)
{

}

return 0;
}
  • Notizen:

Termin 6:

  • Der Quellcode ist 1:1 portierbar auf das finale System im 6. Praktikumstermin. Der Wagensimulator ist eine identische Abbildung des physikalischen Systems, verwendet dabei die gleichen Adressen, Register und bietet die gleichen Funktionalitäten an.

Ausgabe des Signals: 

  • Um das Signal von PIOA ( immer low ) an den WaSim zu übertragen, muss die Herrschaft des Ausgangs an PIOA übergeben werden. (Aus)
  • Damit das Signal des Timers an den WaSim übermittelt wird, muss die Herrschaft des Ausgangs PIOA entzogen werden. ( Ein )
  • Der Ausgang verhält sich hierbei gewissermaßen wie ein 2:1 Multiplexer.

Schreiben Sie einen Kommentar

Ihre E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahren Sie, wie Ihre Kommentardaten verarbeitet werden.