Program prezentujący przetwornik cyfrowo-analogowy i analogowo-cyfrowy.
/*
Name: ADUC831_ADC_DAC
Copyright: cyberowca
Author: Dominik Łuczak
Date: 06-11-06 21:00
Description: Obsługa przetwornika analogowo-cyfrowego (ADC) i cyfrowo-analogowego (DAC)
Kod sprawdzony na kompilatorze uVision firmy Keil Elektronik.
*/
//Biblioteki
#include<aduc831.h>
///////////////////////////
//Prototypy funkcji
/////////////////////////
void DELAY(int); //opóznienie przez pętle
////////////////////////////////////////////////////////////
//Funkcja obsługująca przerwanie timera2
///////////////////////////////////////////////////////////
/*
Z powyższego rysunku widać iż 4 strasze bity danych ADCDATAH nie zawieraja informacji o sporóbkowanym sygnale, dlatego założyłem maske ADCDATAH&=~(11110000) oznaczającą zerowanie 4 najstarszych bitów.
Iloczyn logiczny z maską ~(11110000) gdzie tylda (~) oznacza negacje logiczną otrzymująć 00001111. Dla przypomnienia iloczyn logiczny:
0&0=0
0&1=0
1&0=0
1&1=1
Powyższa tabela zawiera wektor przerwań. Timer2 ma pozycje 6 dlatego przy słowie interrupt znajduje się 6 w poniższym kodzie.
DAC0H i DAC0L to odpowiednio 8 straszych i 8 młodzych bitów danchy przetwornika cyfrowo-analogowego.
*/
void przerwanie() interrupt 6{
ADCDATAH&=~(11110000); //skrucenie 16bitów ADC
//do 12bitów DAC
//rozmiar DAC-12bitów
DAC0H =ADCDATAH; //4 starsze bity DAC
DAC0L =ADCDATAL; //8 młodszych bitów DAC
TL2 = 0xD2; //ustawienie timera2
TH2 = 0xFF; //młodze i starsze 8bitów
//Progaram jest przerywany odkładany na stos i wykonywana jest funkcja przerwania po jej //wykonaniu należy zdjąć danie ze stosu, uzyskujemy to dzięki return.
return;
}
/****************/
//FUNKCJA GŁÓWNA
/****************/
void main(void){
//Inicjalizacja
//0x9E=10011110b
/*ADCCON1 = 0x9E; oznacza:
ADCCON1.7=1
ADCCON1.6=0
ADCCON1.5=0
ADCCON1.4=1
ADCCON1.3=1
ADCCON1.2=1
ADCCON1.1=1
ADCCON1.0=0 */
/////////////////////////////
ADCCON1 = 0x9E; //włączenie ADC i z>
/////////////////////////////
//0x03=00000011b
ADCCON2 = 0x03;
RCAP2L = 0xFF; //wartość przeładowania timera2
RCAP2H = 0xFF;
//0x0D=00001101
DACCON = 0x0D; //włączenie DAC0 (12bitowy)
TL2 = 0xD2; //ustawienie wartości początkowej 2*8bitów
TH2 = 0xFF; //timera2
//Tabela wyjaśnia w zupełności poniższe działania
EA = 1; //globalne zezwolenie na przerwania
EADC = 1; //zezwolenie przerwania od ADC
TR2 = 1; //start Timer2
//////////////////////////////
//Petla nieskończona
/////////////////////////////
for (;;){
DELAY(32); //Przykładowa funkcja, można ją pominąć
}
}
/****************/
//KONIEC FUNKCJI GŁÓWNEJ
/****************/
//////////////////////////
//Definicje funkcji
/////////////////////////
void DELAY(int dlugosc){
while (dlugosc >=0)
{dlugosc--;}
}
« poprzednia |
---|