(kolorem szarym zaznaczono linie źródłowe związane z zadawaniem częstości próbkowania)
#include <ADuC831.h> // predefiniowane symbole ADuC831
#include <stdio.h>
#define SENSTEMP 8 // kanał 8
#define DMASTOP 15 // DMA-> STOP
#define DZ 18 // dzielnik Licznika2, zadawanie częstotliwości próbkowania
// ZMIENNE DEFINIOWANE W WEWNĘTRZNEJ PAMIĘCI RAM
idata int xdata ”ptr; idata int num; bdata bit C;
sbit P32 = P3A2; II linia INTO = Port3.2 - przełącznik IntO
sbit LED = P3A4; // dioda LED
idata unsigned char ch; // numer przetwarzanego kanału
xdata int DMASTART[1024]; // segment pamięci dla przesłań DMA
// Procedura obsługi przerwania generowanego sygnałem ADCI z przetw. ADC void end_of_adc(void) interrupt 6 { // int_6"8+3 = 51dec = 33hex = ADCI
TR2=0; II zakończ wyzwalanie przetwornika
C=0; II zeruj wskaźnik
}
// Procedura obsługi przeiwania generowanego sygn. zewnętrznym INTO // W obsłudze tego przerwania realizujemy pomiar temperatury void interrupt_0 0 interrupt 0 {
int T;
// włączenie zasilania przetwornika // włączenie sensora temp.
II opóźnienie programowe
// rozkaz pojedynczej konwersji
II oczekiowanie na zakończeniu konwersji SCCONV<=0
// odbior wyniku przetwarzania
// wyłączenie zasiolania przetwornika
// wyświetlenie binarnej wartości wyniku przetwarzania A/C
ADCCON1 = 0x80;
ADCCON2 = SENSTEMP; for (T=0; T<100; T++);
SCONV= 1; while (IADCI);
T=((ADCDATAH & 0x0F) * 256) + ADCDATAL;
ADCCON1=OxOO;
printf ("\nTemperatura binarnie = %u bit",T);
}
int i, DMACOUNT;
CFG831 =0x11; // Uaktywnij pamięć 2kB pamięci RAM jako XDATA
// KONFIGURACJA portu transmisji szeregowej - UART
T3CON=0x085; // specjalizowany licznik L3
T3FD= 0x08; // szybkość transmisji 9600baud
SCON =0x052;
printf("%cTESTOWANIE PRZETWORNIKA A/C \n", 0x0C);
// Numer przetwarzanego kanału
//liczba: od Odo 14
// Liczba próbek mierzonego sygnału
printf("\nWprowadz numer kanału przetwarzania A/C (0-15): ?"); scanf r%bd", &ch); ch&=0xF;
printf("\nPodaj liczbę próbek sygnału pomiarowego DMACOUNT: ?") scanf ("%u”, &DMACOUNT);
printf("\nWybrales kanał nr=%bd i N=%d próbek sygnału badanego", ch, DMACOUNT);
// PRE-KONFIGURACJA zewnętrznej RAM dla DMA w pojedynczym kanale for(i=0; i<DMACOUNT; i++) DMASTARTji] = ch « 12;
DMASTART[i]=DMASTOP « 12; // Zancznik końca bloku danych pomiarowych: Stop DMA
for (i=0; i<=DMACOUNT; i++) { // Wydruk kontrolny prekonfigurowanego obszaru RAM
if (i % 8 ==0) printf("\n"); printf(”%3d=%04X ", i, DMASTARTji]); }
// KONFIGURACJA ADC dla konwersji typu DMA ...
DMAL=0; // adres inicjujący kanał operacji DMA
DMAH=0;
DMAP=0; II koniecznie w takim porządku: DMAL, DMAH, DMAP)
TL2,TH2=0;
//Fsys=11059200Hz //Tosc=12/Fosc -> 1.085us
RCAP2L=0x10000-DZ; // okres próbkowania = T2 =(DZ*1,085us)
RCAP2H=(0x10000-DZ)»8; //[RCAP2H,RCAP2L]= 65536 - DZ
ADCCON1 =0x9E; II tryb zasilania -> normaly
ADCCON2=0x40; //tryb przesyłania danych -> DMA
II wyzwalanie przetwornika -> Timer2 C=1; //lokany wskaźnik warunku