Exemple de programe scrise in C
Se prezinta in continuare un pachet de fisiere sursa C, care permit exploatarea interfetei ADA1110.
Fisierul ada1110.h defineste prin intermediul unor directive preprocesor adresele relative ale porturilor componente:
#define PPI_A 0
#define PPI_B 1
#define CHANNEL_SLCT 1
#define GAIN_SLCT 1
#define PPI_C 2
#define PPI_CTRL 3
#define TIMER_A 4
#define TIMER_B 5
#define TIMER_C 6
#define TIMER_CTRL 7
#define START_CONVERSION 8
#define READ_DATA_MSB 8
#define READ_DATA_LSB 9
#define STATUS_BYTE 10
#define DAC_UPDATE 10
#define DAC1_LSB 12
#define DAC1_MSB 13
#define DAC2_LSB 14
#define DAC3_MSB 15
#define PPI_PORT_A 0
#define PPI_PORT_B 1
#define PPI_PORT_C 2
#define BIPOLAR 1
#define UNIPOLAR 0
Fisierul ada1110.inc contine mai multe functii generale utilizabile in scopul diferitelor utilizari ale ADA1110.
#include<dos.h>
#define ENABLED 1
#define DISABLED 0
#define INPUT 1
#define OUTPUT 0
#define TRUE 1
#define FALSE 0
unsigned BaseAddress;
float VoltageRange,
DACSlope,
ConversionFactor,
BaseLine;
int DACOffset;
unsigned char ANDBits;
/*Functia InitializeBoardSettings() este utilizata pentru setarea adresei de baza si determinarea factorului de conversie*/
void InitializeBoardSettings(unsigned BA, float Range, char Polarity)
/*Functia Function DigitalToReal() converteste o valoare intreaga intr-o valoare reala corespunzand unei tensiuni analogice exprimate in volti*/
float DigitalToReal(int DigitalValue)
/*Functia ResetBoard() este utiliyat[ pentru resetarea (reinitialiyarea) lui ADA1110; interfata 8255 este configuratia astfel ca porturile A si C sunt porturi de intrare, iar portul B este port de iesire; de asemenea declanseaza efectuarea unei conversii elementare*/
void ResetBoard(void)
/*Functia SetChannel este utiliyata pentru setarea bitilor canalului activ CAN in registrul atasat; se precizeaza canalul activ*/
void SetChannel(unsigned char ChannelNumber)
/*Functia StartConversion() declanseaza conversia AN*/
void StartConversion(void)
/*Functia ConversionDone() returneaza TRUE(#0) daca conversia AN este completa si FALSE daca este in desfasurare*/
char ConversionDone(void)
/*Functia ReadData() recupereaza cei 2 octeti ai CAN si ii combina intr-o valoare intreaga*/
int ReadData(void)
/*Functia ClockMode() este utilizata pentru a stabili modul de lucru al timerului 8254 si a selecta canalul clock =*/
void ClockMode(unsigned char Clock, unsigned char Mode)
/*Functia ClockDivisor() este utilizata pentru incarcarea canalului desemnat prin clock cu o valoare pe 2 biti, care va fi utilizata in functie de modul de lucru ales*/
void ClockDivisor(unsigned char Clock, unsigned int Divisor)
void SetUserClock(float Rate) //programeaza cele 3 canale 8254 in modul 2 incarcandu-le cu //diferite valori*/
char ClockDone(unsigned char Timer) //citeste valoarea curenta a canalului precizat prinTimer //si returneaza False la valori mai mari ca 0
/*Functia ReadDigitalIO() returneaza (citeste) valoarea unui port al interfetei 8255, precizat prin PPI_A, PPI_B, PPI_C*/
unsigned char ReadDigitalIO(unsigned char InputPort)
/* Functia WriteDigitalIO() realizeaza inscrierea in portul lui 8255 precizat de OutPort = PPI_A, B, C a valorii v*/
void WriteDigitalIO(unsigned char OutputPort, unsigned char v)
void ConfigureIOPorts(unsigned char PortA, unsigned char PortC)
//este utilizata pentru configurarea porturilor A si C; portul B ramane setat ca port de iesire; //1=input port, 0=output port
/*Functia UpdateDAC() selecteaza domeniul de tensiuni in cazul conversiilor NA; variabilele DACSlope si DACOffset trebuie setate reprezentand factorii de conversie si de translatie pentru domeniul de iesire al tensiunilor CAN, conform tabelului in cazul conversiilor pe 12 biti*/
void UpdateDAC(unsigned char DAC, float Volts)
Functia SetMUXChannel() selecteaza un canal al multiplexorului; inaintea apelarii acesteia portul C al lui 8255 trebuie configurat ca port de iesire*/
Void SetMUXChannel(unsigned char Channel)
Programul dac.c demonstreaza utilizarea CAN din cadrul placii ADA1110; programul realizeaza scanarea (parcurgerea) domeniului de iesire in tensiuni al convertoarelor CAN cu un pas de valoare egala cu un milivolt*/
#include<dos.h>
#include<conio.h>
#include "ADA1110.h">
#include "ADA1110.inc">
int i, ScanStart, ScanEnd;
int AtoDConversion(unsigned char Channel)
//aceasta functie realizeaza conversia invers returnand valoarea numerica
void ProgramTitle(char St[]) //gestiunea ecranului
void main()
UpdateDAC(1,0.0); //seteaza CNA1 la 0.0 volti
getch();
clrscr();
}
Programul (fisierul) digital.c demonstreaza scrierea si citirea porturilor interfetei paralele 8255.
#include<dos.h>
#include<stdio.h>
#include<conio.h>
#include "ADA1110.h">
#include "ADA1110.inc">
char ExitProgram, S[10], C;
unsigned char B;
void ProgramTitle(char S[]);
void main(void)
ConfigureIOPorts(INPUT,INPUT); //Port A=INPUT, port C=INPUT
clrscr();
}
Programul softtrig.c realizeaza achizitia de date utilizand "triggerare" soft:
#include<dos.h>
#include<conio.h>
#include "ADA1110.h"
#include "ADA1110.inc"
void ProgramTitle(char St[])
void main()
Programul timer.c demonstreaza programarea circuitului timer/numarator 8254 aflat pe placa ADA1110; programul utilizeaza tehnica pooling, pentru depistarea sfarsitului unui ciclu (de numarare,) al lui 8255.
#include<dos.h>
#include<conio.h>
#include "ADA1110.h"
#include "ADA1110.inc"
char C;
Programul intrpts.c demonstreaza utilizarea timerului 8254 in scopul generarii intreruperilor transmise la controlerul de intreruperi 8259.
#include<dos.h>
#include<stdio.h>
#include<conio.h>
#include "ADA1110.h"
#include "ADA1110.inc"
unsigned char OLDIMRMask; //variabila pentru memorarea IMR
unsigned char IRQ;
int ADValue; //valoare citita de la CAN
void interrupt(*OldINT)(void);
void ClearBitIMR(unsigned char Bit) //aceasta functie reseteaza (clear) bitul IMR al 8259 , //pentru a face linia omoloaga disponibila in a accepta //intreruperea
void SetBitInIMR(unsigned char Bit) //functia este asemanatoare cu ClearBitInIMR, cu deosebirea ca aceasta seteaza (pune pe 1) bitul dorit al IMR
void VectorInterrupt(int InterruptNumber, void interrupt(*ISR)())
//este utilizata pentru a asigna un nou vector pentru intreruperea respectiva
void interrupt NewISR(void)
//aceasta functie este apelata cand apare o cerere de intrerupere la liniile IRQ; este interzisa //apelarea functiilor DOS sau BIOS in cadrul functiei de tratare a intreruperii pentru a nu crea //evenimente imprevizibile
void ConfigureIRQ(unsigned char IRQ)
void RestoreStartupIRQ(void) //restaureaza IMR initiala salvata de functia anterioara, care se va //apela intotdeauna inaintea apelului acestei functii
void ProgramTitle(char St[80])
void main()
getch(); //citire caracter de la tastatura
RestoreStartupIRQ(); //restaurare sistemului de intreruperi initial
clrscr();
}
Politica de confidentialitate |
.com | Copyright ©
2024 - Toate drepturile rezervate. Toate documentele au caracter informativ cu scop educational. |
Personaje din literatura |
Baltagul – caracterizarea personajelor |
Caracterizare Alexandru Lapusneanul |
Caracterizarea lui Gavilescu |
Caracterizarea personajelor negative din basmul |
Tehnica si mecanica |
Cuplaje - definitii. notatii. exemple. repere istorice. |
Actionare macara |
Reprezentarea si cotarea filetelor |
Geografie |
Turismul pe terra |
Vulcanii Și mediul |
Padurile pe terra si industrializarea lemnului |
Termeni si conditii |
Contact |
Creeaza si tu |