Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "pcf8833u8_lcd.h"
- #define F_CPU 48000000UL
- #include <stdio.h>
- #include <targets\AT91SAM7.h>
- #include <ctl_api.h>
- #include <string.h>
- char xs[8];
- int st=0;
- int r=0;
- //Zadanie 3
- void PIOB_isr(){
- //Wyłączenie lub załączenie zegara w zależności od tego, który przycisk został wciśnięty
- if ((PIOB_PDSR & 1<<24)==0){
- TC0_CCR = TC0_CCR_CLKDIS;
- }
- if ((PIOB_PDSR & 1<<25)==0){
- TC0_CCR = TC0_CCR_CLKEN | TC0_CCR_SWTRG;
- }
- }
- //Zadanie 2
- void TC0_ISR(){
- //Obliczenie i wyświetlenie na ekranie temperatury
- ADC_CR = 1<<1; // lub ADC_CR_START;
- while ((ADC_SR & ADC_SR_EOC5) == 0) {} // dopóki flaga EOC3 jest rowna 0 (konwersja na kanale 5
- // nie zakooczyła się) czekaj
- // wykonaj akcję przypisaną do konwersji
- st = 20+((ADC_CDR5-500)/5);
- r = ((ADC_CDR5 - 500) % 5) * 2;
- sprintf(xs,"%d,%d", st, r);
- LCDPutStr(xs,50,30,LARGE,BLACK,WHITE);
- }
- int main()
- {
- ctl_global_interrupts_disable(); //globalne wyłączenie przerwań
- PMC_PCER = PMC_PCER_PIOA | PMC_PCER_TC0; // załączenie zegara PIOA USART0 TIMER0
- //Konfiguracja przycisków i wyświetlacza
- PMC_PCER=1<<3; //załączenie zegara PIOB
- PIOB_IER = 1<<24|1<<25;
- PIOB_OER=1<<20; //ustawienie na wyjście bitu 20 linii B
- PIOB_PER=1<<20; //załaczenie pinu 20
- PIOB_PUDR = 1<<20;
- PIOB_CODR=1<<20; //wyłączenie podświetlenia
- PIOB_OWER = 1<<20;
- PIOB_PER=1<<24;
- PIOB_PER=1<<25;
- PIOB_ODR=1<<24;
- PIOB_ODR=1<<25;
- PMC_PCER= 1<<10; // Power management controller (s. 30 datasheet)
- InitLCD();
- SetContrast(30);
- LCDClearScreen();
- LCDPutStr("Kacper Gebusia", 20, 10, LARGE, BLACK, WHITE);
- // konfiguracja ADC, konwersja wartości napięcia z kanału 3 przetwornika:
- ADC_CR = 1<<0; // lub ADC_CR_SWRST–to inny zapis tego samego –reset przetwornika
- ADC_CHER = 1<<5;// aktywowanie kanałów TERM
- ADC_IDR = 0xFFFFF;// świadomie wyłączamy przerwania od wszystkich zdarzeo(źródeł) z ADC
- ADC_MR = (23<<ADC_MR_PRESCAL_BIT) | (2<<ADC_MR_STARTUP_BIT) | (1<<ADC_MR_SHTIM_BIT);
- // w rejestrze ADC_MR możliwe również ustawienia niższej rozdzielczości
- ADC_CR = 1<<1; // lub ADC_CR_START;
- //start konwersji na aktywnych kanałach jedna konwersja
- TC0_CCR = TC0_CCR_CLKDIS; //trzeba wyłączyć zegar
- TC0_IDR = 0xFF; // wyłączyć wszystkie przerwania strona 421
- TC0_SR; //PUSTY ODCZYT, czytamy, ale wartości nigdzie nie zapisujemy ///// odczyt na pusto rejestru TC_SR, jak się go czyta to się zeruje
- // wybieramy preskaler 1024 /// później ustawimy bit CPCTRG - rc compare --> reset counter i star clock // skracamy licznik
- TC0_CMR = (1<<2 | TC0_CMR_CPCTRG); // strona 409 MCK/1024 i reset licznika przy porównaniu wartości licznika z rejestrem RC
- TC0_RC = 9375; //ustawienie wartości RC
- TC0_IER = TC0_IER_CPCS; // załączenie źródła przerwania od porównania wartości licznika z rejestrem RC
- //start TIMERA
- TC0_CCR = TC0_CCR_CLKEN | TC0_CCR_SWTRG; // załączenie zegara | reset licznika
- //PWM
- //Konfiguracja
- PMC_PCER = (1<<10); //wlaczenie zegara PWM
- PIOB_PDR = (1<<20);
- PIOB_ASR = (1<<20);
- PWM_CMR1 = (1<<0) |(1<<1) | (1<<9); //preskaler 8
- PWM_CPRD1 = 60000; //100hz, duza wartosc duza dokladnosc
- PWM_ENA = (1<<1); //wlaczenie kanału 1
- //Zadanie 3
- ctl_set_isr(3,1,CTL_ISR_TRIGGER_FIXED,PIOB_ISR,0);
- ctl_unmask_isr(3);
- //Zadanie 2
- ctl_set_isr(12,2,CTL_ISR_TRIGGER_FIXED,TC0_ISR,0);
- ctl_unmask_isr(12);
- ctl_global_interrupts_enable(); //zezwolenie na globalne przerwania
- while(1){
- while((ADC_SR & ADC_SR_EOC6) == 0) {}
- int jasnosc = ADC_CDR6;
- PWM_CUPD1 = jasnosc*60; //ustawienie nowej wartosci PWM
- ADC_CR = 1 << 1; // ponowny start konwersji na aktywnych kanałach
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement