Advertisement
mikolajmki

Untitled

Jan 18th, 2023
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.91 KB | None | 0 0
  1. #include "pcf8833u8_lcd.h"
  2.  
  3. #define F_CPU 48000000UL
  4.  
  5. #include <stdio.h>
  6. #include <targets\AT91SAM7.h>
  7. #include <ctl_api.h>
  8. #include <string.h>
  9.  
  10. char xs[8];
  11. int st=0;
  12. int r=0;
  13.  
  14.  
  15. //Zadanie 3
  16. void PIOB_isr(){
  17. //Wyłączenie lub załączenie zegara w zależności od tego, który przycisk został wciśnięty
  18. if ((PIOB_PDSR & 1<<24)==0){
  19. TC0_CCR = TC0_CCR_CLKDIS;
  20. }
  21.  
  22. if ((PIOB_PDSR & 1<<25)==0){
  23. TC0_CCR = TC0_CCR_CLKEN | TC0_CCR_SWTRG;
  24. }
  25. }
  26.  
  27. //Zadanie 2
  28. void TC0_ISR(){
  29. //Obliczenie i wyświetlenie na ekranie temperatury
  30. ADC_CR = 1<<1; // lub ADC_CR_START;
  31. while ((ADC_SR & ADC_SR_EOC5) == 0) {} // dopóki flaga EOC3 jest rowna 0 (konwersja na kanale 5
  32. // nie zakooczyła się) czekaj
  33. // wykonaj akcję przypisaną do konwersji
  34. st = 20+((ADC_CDR5-500)/5);
  35. r = ((ADC_CDR5 - 500) % 5) * 2;
  36.  
  37. sprintf(xs,"%d,%d", st, r);
  38.  
  39. LCDPutStr(xs,50,30,LARGE,BLACK,WHITE);
  40. }
  41.  
  42. int main()
  43. {
  44. ctl_global_interrupts_disable(); //globalne wyłączenie przerwań
  45.  
  46. PMC_PCER = PMC_PCER_PIOA | PMC_PCER_TC0; // załączenie zegara PIOA USART0 TIMER0
  47.  
  48. //Konfiguracja przycisków i wyświetlacza
  49. PMC_PCER=1<<3; //załączenie zegara PIOB
  50. PIOB_IER = 1<<24|1<<25;
  51. PIOB_OER=1<<20; //ustawienie na wyjście bitu 20 linii B
  52. PIOB_PER=1<<20; //załaczenie pinu 20
  53. PIOB_PUDR = 1<<20;
  54. PIOB_CODR=1<<20; //wyłączenie podświetlenia
  55. PIOB_OWER = 1<<20;
  56. PIOB_PER=1<<24;
  57. PIOB_PER=1<<25;
  58. PIOB_ODR=1<<24;
  59. PIOB_ODR=1<<25;
  60.  
  61. PMC_PCER= 1<<10; // Power management controller (s. 30 datasheet)
  62.  
  63. InitLCD();
  64. SetContrast(30);
  65. LCDClearScreen();
  66.  
  67. LCDPutStr("Kacper Gebusia", 20, 10, LARGE, BLACK, WHITE);
  68.  
  69. // konfiguracja ADC, konwersja wartości napięcia z kanału 3 przetwornika:
  70. ADC_CR = 1<<0; // lub ADC_CR_SWRST–to inny zapis tego samego –reset przetwornika
  71. ADC_CHER = 1<<5;// aktywowanie kanałów TERM
  72. ADC_IDR = 0xFFFFF;// świadomie wyłączamy przerwania od wszystkich zdarzeo(źródeł) z ADC
  73. ADC_MR = (23<<ADC_MR_PRESCAL_BIT) | (2<<ADC_MR_STARTUP_BIT) | (1<<ADC_MR_SHTIM_BIT);
  74. // w rejestrze ADC_MR możliwe również ustawienia niższej rozdzielczości
  75. ADC_CR = 1<<1; // lub ADC_CR_START;
  76. //start konwersji na aktywnych kanałach jedna konwersja
  77.  
  78. TC0_CCR = TC0_CCR_CLKDIS; //trzeba wyłączyć zegar
  79. TC0_IDR = 0xFF; // wyłączyć wszystkie przerwania strona 421
  80. TC0_SR; //PUSTY ODCZYT, czytamy, ale wartości nigdzie nie zapisujemy ///// odczyt na pusto rejestru TC_SR, jak się go czyta to się zeruje
  81.  
  82. // wybieramy preskaler 1024 /// później ustawimy bit CPCTRG - rc compare --> reset counter i star clock // skracamy licznik
  83. TC0_CMR = (1<<2 | TC0_CMR_CPCTRG); // strona 409 MCK/1024 i reset licznika przy porównaniu wartości licznika z rejestrem RC
  84.  
  85. TC0_RC = 9375; //ustawienie wartości RC
  86.  
  87. TC0_IER = TC0_IER_CPCS; // załączenie źródła przerwania od porównania wartości licznika z rejestrem RC
  88.  
  89. //start TIMERA
  90. TC0_CCR = TC0_CCR_CLKEN | TC0_CCR_SWTRG; // załączenie zegara | reset licznika
  91.  
  92. //PWM
  93. //Konfiguracja
  94. PMC_PCER = (1<<10); //wlaczenie zegara PWM
  95. PIOB_PDR = (1<<20);
  96. PIOB_ASR = (1<<20);
  97. PWM_CMR1 = (1<<0) |(1<<1) | (1<<9); //preskaler 8
  98. PWM_CPRD1 = 60000; //100hz, duza wartosc duza dokladnosc
  99. PWM_ENA = (1<<1); //wlaczenie kanału 1
  100.  
  101.  
  102. //Zadanie 3
  103. ctl_set_isr(3,1,CTL_ISR_TRIGGER_FIXED,PIOB_ISR,0);
  104. ctl_unmask_isr(3);
  105.  
  106. //Zadanie 2
  107. ctl_set_isr(12,2,CTL_ISR_TRIGGER_FIXED,TC0_ISR,0);
  108. ctl_unmask_isr(12);
  109.  
  110.  
  111. ctl_global_interrupts_enable(); //zezwolenie na globalne przerwania
  112.  
  113. while(1){
  114. while((ADC_SR & ADC_SR_EOC6) == 0) {}
  115. int jasnosc = ADC_CDR6;
  116. PWM_CUPD1 = jasnosc*60; //ustawienie nowej wartosci PWM
  117. ADC_CR = 1 << 1; // ponowny start konwersji na aktywnych kanałach
  118. }
  119. }
  120.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement