diff options
Diffstat (limited to 'Bachelor/Mikroprozessorsysteme2/mi2/Termin6/Termin6Aufgabe1.c')
| -rw-r--r-- | Bachelor/Mikroprozessorsysteme2/mi2/Termin6/Termin6Aufgabe1.c | 288 |
1 files changed, 288 insertions, 0 deletions
diff --git a/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/Termin6Aufgabe1.c b/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/Termin6Aufgabe1.c new file mode 100644 index 0000000..c4ffe50 --- /dev/null +++ b/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/Termin6Aufgabe1.c @@ -0,0 +1,288 @@ +// Lösung zu Termin6&7 +// Aufgabe 1... +// Namen: Andreas Spirka; Sven Eisenhauer +// Matr.: 702789; 707173 +// vom : 25.01.2006 + + +#include "../h/pmc.h" +#include "../h/tc.h" +#include "../h/pio.h" +#include "../h/aic.h" + +void pmcinit(void); +void pioinit(void); +void Timer_init(void); +int massemessen(void); +void pumpestart(void); +void pumpestop(void); +void greeting(void); +void ausgabe(int); +int genaumessen(void); +void Int2Str(int); +void taste_irq_handler (void) __attribute__ ((interrupt)); + +volatile int aktion=0; +char lf[2]; +char cr[2]; + +// für die Initialisierung der Zähler TC4 und TC5 + +#define TC4_INIT TC_CLKS_MCK2 | TC_LDBSTOP | TC_CAPT | TC_LDRA_RISING_EDGE | TC_LDRB_RISING_EDGE +#define TC5_INIT TC_CLKS_MCK2 | TC_LDBSTOP | TC_CAPT | TC_LDRA_RISING_EDGE | TC_LDRB_RISING_EDGE + +// 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 Advanced Interrupt Controller + int taste = piobaseB->PIO_PDSR; + if (!(taste & KEY1)) // falls Schalter 1 gedrückt + aktion=1; + if (!(taste & KEY2)) // falls Schalter 2 gedrückt + aktion=2; + + aicbase->AIC_EOICR = piobaseB->PIO_ISR; // AIC End of Interrupt Command Register = 1 +} + +void pmcinit(void) +{ + StructPMC* pmcbase = PMC_BASE; + pmcbase->PMC_PCER = 0x06f84; // Clock PIOA, PIOB, Timer5, Timer4, Timer3,US0 einschalten +} + +void pioinit(void) +{ + StructPIO* piobaseB = PIOB_BASE; // Basisadresse PIO B + StructAIC* aicbase = AIC_BASE; // Basisadresse Advanced Interrupt Controller + // disable all interrupt sources of pio + piobaseB->PIO_IDR = 0xFFFFFFFF; + piobaseB->PIO_PER = KEY1|KEY2; // Schalter 1-2 enabeled + // Interrupt Initialisierung für PIOB (0x4000) + aicbase->AIC_IDCR = (1<<PIOB_ID); // Interrupt disabled + aicbase->AIC_ICCR = (1<<PIOB_ID); // Interrupt clear + aicbase->AIC_SMR[PIOB_ID] = 0x1; // An Stelle 14 Level Sensitive / Höchste Priorität + aicbase->AIC_SVR[PIOB_ID] = (unsigned int)taste_irq_handler; // Adresse der Interrupt Service Routine in Vektor-Tabelle + aicbase->AIC_IECR = (1<<PIOB_ID); // enable PIOB Interrupt in AIC + piobaseB->PIO_IER = KEY1|KEY2; // Schalter 1+2 lösen Interrupts aus +} + +void Timer_init(void) +{ + StructTC* tcbase3 = TCB3_BASE; // Basisadressse TC Block 3 Pumpe + StructTC* tcbase4 = TCB4_BASE; // Basisadressse TC Block 4 Waage + StructTC* tcbase5 = TCB5_BASE; // Basisadressse TC Block 5 Waage + StructPIO* piobaseA = PIOA_BASE; // Basisadresse PIO A + + tcbase3->TC_CCR = TC_CLKDIS; // Disable Clock + + // Initialize the mode of the timer 3 + tcbase3->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: + tcbase3->TC_RA = 244; + tcbase3->TC_RC = 488; // RA = RC/2 für symmetrisches Signal + + // Start the timer : + tcbase3->TC_CCR = TC_CLKEN ; //__ + tcbase3->TC_CCR = TC_SWTRG ; //__ + piobaseA->PIO_PER = (1<<PIOTIOA3) ; // Pio herrscht über pin + piobaseA->PIO_OER = (1<<PIOTIOA3) ; // Output an pin + piobaseA->PIO_CODR = (1<<PIOTIOA3) ; // clear output -> low signal, pumpe aus + +// Periodendauer der Waagensignale messen +// Signal aud TIOA4 ca. 16kHz entspricht ca. einer Periodendauer von 62,5us +// durch den Teiler von 32 ergeben sich ca. 2ms +// Zähler mit positiver Flanke starten + + //piobaseA->PIO_PDR = 0x090; + piobaseA->PIO_PDR = (1<<PIOTIOA4)|(1<<PIOTIOA5); + tcbase4->TC_CCR = TC_CLKDIS; + tcbase4->TC_CMR = TC4_INIT; + tcbase4->TC_CCR = TC_CLKEN; + tcbase4->TC_CCR = TC_SWTRG; + + tcbase5->TC_CCR = TC_CLKDIS; + tcbase5->TC_CMR = TC5_INIT; + tcbase5->TC_CCR = TC_CLKEN; + tcbase5->TC_CCR = TC_SWTRG; +} + +int massemessen(void) +{ + StructTC* tcbase4 = TCB4_BASE; + StructTC* tcbase5 = TCB5_BASE; + volatile int captureRA1; + volatile int captureRB1; + volatile int capturediff1; + volatile float Periodendauer1; + volatile int captureRA2; + volatile int captureRB2; + volatile int capturediff2; + volatile float Periodendauer2; + volatile int c1=18030; + volatile int c2=40; + volatile int masse; + + tcbase4->TC_CCR = TC_SWTRG; + tcbase5->TC_CCR = TC_SWTRG; + while (!( tcbase4->TC_SR & TC_LDBSTOP)); // Capture Register B wurde geladen Messung abgeschlossen + captureRA1 = tcbase4->TC_RA; // + captureRB1 = tcbase4->TC_RB; + capturediff1 = abs(captureRB1) - abs(captureRA1); + Periodendauer1 = abs(capturediff1); + while (!( tcbase5->TC_SR & TC_LDBSTOP)); // Capture Register B wurde geladen Messung abgeschlossen + captureRA2 = tcbase5->TC_RA; // + captureRB2 = tcbase5->TC_RB; + capturediff2 = abs(captureRB2) - abs(captureRA2); + Periodendauer2 = abs(capturediff2); + + masse = c1 * ((Periodendauer1 / Periodendauer2) -1) -c2; + return masse; +} + +void pumpestart(void) +{ + StructPIO* piobaseA = PIOA_BASE; + piobaseA->PIO_PDR = (1<<PIOTIOA3); // Timer herrscht über Bit (Taktsignal) +} + +void pumpestop(void) +{ + StructPIO* piobaseA = PIOA_BASE; + // 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) +} + +void greeting(void) +{ + cr[0]=0x0d; + lf[0]=0x0a; + lf[1]='\0'; + cr[1]='\0'; + puts("AUSSCHANKSTATION\0"); + puts(&cr[0]); + puts(&lf[0]); + puts("Bitte Becher auf die Waage stellen\0"); + puts(&cr[0]); + puts(&lf[0]); + puts("SW1 zum tarieren drücken\0"); + puts(&cr[0]); + puts(&lf[0]); +} + +void ausgabe(int m) +{ + cr[0]=0x0d; + lf[0]=0x0a; + lf[1]='\0'; + cr[1]='\0'; + puts("Gemessene Gesamtmasse: \0"); + Int2Str(m); + puts(&cr[0]); + puts(&lf[0]); + puts("Becher kann entfernt werden\0"); + puts(&cr[0]); + puts(&lf[0]); + +} + +void Int2Str(int m) +{ + int a,i=7; + char string[9]; + string[8] = '\0'; + + while(m != 0) + { + a = m%10; + string[i] = a + '0'; + m = m/10; + i--; + } + puts(&string[i+1]); +} + +int genaumessen(void) +{ + volatile int durchlaeufe=10; + volatile int summe=0; + volatile int retVal=0; + volatile int i=0; + for (i=0;i<durchlaeufe;i++) + { + summe+=massemessen(); + } + retVal= summe/durchlaeufe; + return retVal; +} + +int main(void) +{ + volatile int masse=0; + volatile int tara=0; + volatile int netto=0; + + cr[0]=0x0d; + lf[0]=0x0a; + lf[1]='\0'; + cr[1]='\0'; + + inits(); + greeting(); + pmcinit(); + Timer_init(); + pioinit(); + + for(;;) + { + if(aktion == 1) + { + puts("Tara: \0"); + tara=genaumessen(); + netto=0; + Int2Str(tara); + puts(" SW2 startet die Pumpe"); + puts(&cr[0]); + aktion=0; + } + if (aktion == 2 && tara != 0) + { + puts(&cr[0]); + puts(&lf[0]); + pumpestart(); + while(netto <= 50) + { + masse=genaumessen(); + netto=masse-tara; + puts("Fuellgewicht: \0"); + Int2Str(netto); + puts(&cr[0]); + } + pumpestop(); + ausgabe(masse); + do { + masse=genaumessen(); + } + while (masse > 10); + // Gewicht hat sich geändert, d. h. Becher wurde entfernt + // D. h. von vorne starten + greeting(); + aktion=0; + } + } + // disable piob command register in AIC + //aicbase->AIC_IDCR = (1<<PIOB_ID); + // disable all interrupt sources of pio + //piobaseB->PIO_IDR = 0xFFFFFFFF; + // Timer (0x200), PIOA (0x2000), PIOB (0x4000) ausschalten + //pmcbase->PMC_PCDR = (1<<PIOA_ID)|(1<<PIOB_ID)|(1<<TC3_ID); + return 0; +} |
