Advertisement
mikolajmki

systemy_na5

Jan 27th, 2023
990
1
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.19 KB | None | 1 0
  1. #include <targets\AT91SAM7.h>
  2. #include "pcf8833u8_lcd.h"
  3. #include <ctl_api.h>
  4. #include <stdio.h>
  5.  
  6. char b[4] = {0};
  7. char procent[4] = {0};
  8. int p = 550;
  9. int loop = 510;
  10. int a = 0;
  11.  
  12. void wyswietl(char b) {
  13. //    sprintf("%.f", 12);
  14.     ADC_CR = 1<<1;  // lub ADC_CR_START; // start konwersji na aktywnych kanałach
  15.     while ((ADC_SR & ADC_SR_EOC5) == 0) {}  // dopóki flaga EOC6 jest rowna 0 (konwersja na kanale 6 nie zakończona - rób nic)
  16.     sprintf(b, "%d.%d", 20+((ADC_CDR5-530)/5), ADC_CDR5 % 100);// wykonaj akcję przypisaną do konwersji
  17.     LCDPutStr(b, 55,50,LARGE,WHITE,BLACK);
  18. }
  19.  
  20. void TIMER0_ISR () {
  21. //    wyswietl(b);//zmiana stanu LCD_BL
  22.     p = ADC_CDR5;
  23.     loop = loop + 1;
  24.     ADC_CR = 1<<1;  // lub ADC_CR_START; // start konwersji na aktywnych kanałach
  25.     while ((ADC_SR & ADC_SR_EOC5) == 0) {}  // dopóki flaga EOC6 jest rowna 0 (konwersja na kanale 6 nie zakończona - rób nic)
  26.     sprintf(b, "%d.%d", 20+((p-530)/5), p % 10);
  27.     sprintf(procent, "%d", a / 200);// wykonaj akcję przypisaną do konwersji
  28.     LCDSetPixel(131 - p, loop, BLACK);
  29.     if (loop > 641) {
  30.         LCDClearPlot();
  31.         loop = 510;
  32.     }
  33.     LCDPutStr(b, 20,50,LARGE,WHITE,BLACK);
  34.     LCDPutStr(procent, 20,10,LARGE,WHITE,BLACK);
  35. //    LCDClearPlot();
  36.  
  37.     TC0_SR;   // na początku pusty odczyt rejestru statusu - kasowanie flagi przerwania CPCS
  38. }
  39.  
  40. void TIMER0_ISR1 () {
  41.     int isr = PIOB_ISR;
  42.     if (isr  & (1<<24)) {
  43.       TC0_CCR |= (1<<1);
  44.     } else if (isr & (1<<25)) {
  45.       TC0_CCR |= (1<<2) | (1<<0);
  46.     }
  47.     PIOB_ISR;
  48. }
  49.  
  50.  
  51. int pomiar(){
  52.                 // w rejestrze ADC_MR możliwe również ustawienia niższej rozdzielczości
  53.  
  54.   return ADC_CDR5;
  55. }
  56.  
  57. int main(void){
  58.  
  59.   char b[7];
  60.  
  61.   InitLCD();  
  62.   LCDClearScreen();
  63.   Backlight(BL_ON);
  64.  
  65.   ctl_global_interrupts_disable();
  66.   PMC_PCER |= (1<<3) | (1<<12) | (1<<17) | (1<<10); // Power management controller (s. 30 datasheet);
  67.   PIOB_PDR = (1<<20);
  68.   PIOB_ASR = (1<<20);
  69.  
  70.   PWM_CMR1 = (1<<3);
  71.   PWM_ENA = (1<<1);
  72.   PWM_CPRD1 = 1840;
  73.  
  74.   PIOB_ODR |= (1<<24) | (1<<25);
  75.   PIOB_IER |= (1<<24) | (1<<25);
  76.  
  77.   TC0_CCR = (1<<1);
  78.   TC0_SR;
  79.   TC0_CMR = (1<<2) | (1<<14);
  80.   TC0_IER= (1<<4);
  81.   TC0_RC = 9400;
  82.  
  83.   // konfiguracja ADC, konwersja wartości napięcia z kanału 3 przetwornika:
  84.   ADC_CR = 1 << 0;  // lub ADC_CR_SWRST – to inny zapis tego samego – reset przetwornika
  85.   ADC_CHER = (1 << 5) | (1 << 6);   // aktywowanie kanałów na których ma być przeprowadzona konwersja
  86.   ADC_IDR = 0xFFFFF;    // świadomie wyłączamy przerwania od wszystkich zdarzeń(źródeł) z ADC
  87.   ADC_MR = (23<<ADC_MR_PRESCAL_BIT) | (2<<ADC_MR_STARTUP_BIT) | (1<<ADC_MR_SHTIM_BIT);
  88.  
  89.   ctl_unmask_isr(3);
  90.   ctl_set_isr(12,1,CTL_ISR_TRIGGER_FIXED,TIMER0_ISR,0);
  91.   ctl_set_isr(3,2,CTL_ISR_TRIGGER_FIXED,TIMER0_ISR1,0);
  92.   ctl_unmask_isr(12);
  93. //  ctl_unmask_isr(3);
  94.   ctl_global_interrupts_enable();
  95.  
  96.   TC0_CCR |= (1<<2) | (1<<0);
  97.  
  98.   while(1){
  99.       loop = loop + 1;
  100. //    sprintf(b, "%d.%d", 20+((pomiar()-530)/5), pomiar() % 10);// wykonaj akcję przypisaną do konwersji
  101. //    LCDPutStr(b,55,50,LARGE,WHITE,BLACK);
  102.       while ((ADC_SR & ADC_SR_EOC6) == 0) {}
  103.       a = ADC_CDR6;
  104.       a = a * 2;
  105.       PWM_CDTY1 = a;
  106.  
  107.   }
  108. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement