summaryrefslogtreecommitdiffstats
path: root/Bachelor/Mikroprozessorsysteme2/mi2/Termin3/Termin3Aufgabe2.c
blob: 9fe2783b1cb897e1cc9a6448ede26b331e36fa21 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
// L�sung zu Termin3

// Aufgabe 1



// vom: 04.11.2003

//



#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

  StructPIO* piobaseA   = PIOA_BASE;		// Basisadresse PIO A

  StructAIC* aicbase  = AIC_BASE;		// Basisadresse Advanced Interrupt Controller



// ab hier entsprechend der Aufgabestellung erg�nzen

//**************************************************



	if (!(piobaseB->PIO_PDSR & KEY1))		// falls Schalter 1 gedr�ckt

		piobaseA->PIO_PDR = (1<<PIOTIOA3);	// Timer herrscht �ber Bit (Tacktsignal)

	if (!(piobaseB->PIO_PDSR & KEY2))		// falls Schalter 2 gedr�ckt

		piobaseA->PIO_PER = (1<<PIOTIOA3);	// PIOA herrscht �ber (0 Signal)



	aicbase->AIC_EOICR = piobaseB->PIO_ISR;	// AIC End of Interrupt Command Register = PIOB Interrupt Status Register

}



// 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_MCK1024;           //TCCLKS  : MCKI / 1024



  // Initialize the counter:

  timerbase3->TC_RA = 2440;	// Wert 300 in Register RA: wenn Wert erreicht Steigende Flanke

  timerbase3->TC_RC = 4880;	// Wert 600 in Register RC: wenn Wert erreicht Fallende Flanke



  // Start the timer :

  timerbase3->TC_CCR = TC_CLKEN ;	// Timer Clock enabled

  timerbase3->TC_CCR = TC_SWTRG ;	// Reset Counter

  // Vermeiden, da� dauerhaftes High Signal (PIO herrscht �ber das BIT)

  piobaseA->PIO_PER  = (1<<PIOTIOA3) ;	// PIN der PIO zuweisen

  piobaseA->PIO_OER  = (1<<PIOTIOA3) ;	// wird auf Output gesetzt

  piobaseA->PIO_CODR = (1<<PIOTIOA3) ;	// Clear Output (low Signal)

}



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		= 0x4000;	// Peripheral Clocks einschalten f�r PIOB,



// ab hier entsprechend der Aufgabestellung erg�nzen

//**************************************************



	pmcbase->PMC_PCER = 0x6200;		// Timer (0x200), PIOA (0x2000), PIOB (0x4000) einschalten

	Timer3_init();

	piobaseB->PIO_PER = 0x38;		// Schalter 1-3 enabeled





	// Interrupt Initialisierung f�r PIOB (0x4000)

	piobaseB->PIO_IER = 0x18;		// Schalter 1+2 l�sen Interrupts aus

	StructAIC* aicbase  = AIC_BASE;		// Basisadresse Advanced Interrupt Controller

	aicbase->AIC_IDCR = 0x4000;		// Interrupt disabled

	aicbase->AIC_ICCR = 0x4000;		// Interrupt clear

	aicbase->AIC_SMR[14] = 0x07;		// An Stelle 14 Level Sensitive / H�chste Priorit�t

	aicbase->AIC_SVR[14] = (unsigned int)taste_irq_handler;	// Adresse der Interrupt Service Routine in Vektor-Tabelle

	aicbase->AIC_IECR = 0x4000;







	while(piobaseB->PIO_PDSR & KEY3)

	{



	}



	// Vermeiden, da� dauerhaftes High Signal (PIO herrscht �ber das BIT)

	piobaseA->PIO_PER  = (1<<PIOTIOA3) ;	// PIN der PIO zuweisen

	aicbase->AIC_IDCR = 0x4000;		// Interrupt Disable

  	

	return 0;

}