📄 main.c
字号:
/******************************************************************************
* Plik: main.c
* Autor: Dariusz Wysocki
*******************************************************************************/
//#include <stdio.h> // dolaczenie biblioteki dla funkcji sprintf()
#include <LPC2103.H>
#define CR 0x0D // powrot karetki
// deklaracje funkcji
void initSerial (void);
int sendChar (int ch);
void sendString(char *p);
void initADC(void);
void initTimer(void);
void T0isr (void) __irq;
// zmienne globalne
float data10 = 0, last10 = 0;
/******************************************************************************
* Inicjalizacja przetwornika A/C
******************************************************************************/
void initADC(void)
{
PINSEL1 = 0x00003000; // ustawienie pinu P0.22 na AIN0
ADCR = 0x00200401; // 10bit/3MHZ
}
/******************************************************************************
* Inicjalizacja ukladu UART1
******************************************************************************/
void initSerial (void) {
PINSEL0 = 0x00050000; // ustawienie pinow dla RxD0 i TxD0
U1LCR = 0x8B; // 8 bitow, bit parzystosci, bit stopu
U1DLL = 19; // 38400bps @ 15MHz VPB Clock
U1FDR = 228;
U1LCR = 0x0B; // DLAB = 0
}
/******************************************************************************
* Funkcja wysylajaca znak na port szeregowy
******************************************************************************/
int sendChar (int ch) {
if (ch == '\n') {
while (!(U1LSR & 0x20));
U1THR = CR;
}
while (!(U1LSR & 0x20));
return (U1THR = ch);
}
/******************************************************************************
* Funkcja wysylajaca string na port szeregowy
******************************************************************************/
void sendString(char *p)
{
while(*p)
{
sendChar(*p++);
}
}
/******************************************************************************
* Funkcja wysylajaca wartosc pomiaru na port szeregowy
******************************************************************************/
void sendFloat(float wyn)
{
float pom;
pom = (int)wyn;
sendChar(pom+48);
sendChar('.');
pom = ((int)(wyn * 10)) % 10;
sendChar(pom+48);
pom = (((int)(wyn * 100)) % 100) % 10;
sendChar(pom+48);
pom = ((((int)(wyn * 1000)) % 1000) % 100) % 10;
sendChar(pom+48);
sendChar(' ');
}
void initTimer(void)
{
T0TCR = 0x00000002; //Reset
T0MCR = 0x00000003; //Przy zrownaniu TCR z MR0 reset TCR i przerwanie
T0MR0 = 0x0016E360; //Ustawienie czasu przerwania
T0TCR = 0x00000001; //Uruchomienie licznika 1 * TOMR0 / 60 000 000
VICVectAddr0 = (unsigned)T0isr; //Ustawienie wektora przerwania
VICVectCntl0 = 0x00000024; //Ustawienie kanalu przerwania (od timer'a 0)
VICIntEnable |= 0x00000010; //Uaktywnienie przerwania
}
/******************************************************************************
* Funkcja glowna
******************************************************************************/
int main (void)
{
initTimer();
initADC();
initSerial();
sendString("Projekt 1 - stacja pomiarowa\n");
while (1)
{ // Petla nieskonczona
;
}
}
/******************************************************************************
* Przerwanie od licznika (wywolywane co 100ms)
******************************************************************************/
void T0isr (void) __irq
{
static int count = 0;
unsigned int val;
float wynik;
ADCR |= 0x01000000; // Start konwersji A/D
do
{
val = ADDR0; // Czytanie rejestu danych
}
while ((val & 0x80000000) == 0); // Czy konwersja skonczona?
ADCR = 0x00200401; // Stop A/D
val = ((val >> 6) & 0x03FF); // Wydzielenie wyniku z rejestru
wynik = ((float)(val)*3.3f/1023); // Zamiana wyniku na napiecie wejsciowe
count++;
data10 += wynik;
sendFloat(wynik); // wyswietlenie wartosci pomiaru
//sprintf(tabl,"%f",wynik);
//sendString(tabl);
if (count == 10) // Czy zebranych 10 pomiarow?
{
sendChar('\n');
sendString("Wart.sr. = ");
sendFloat((data10/10));
if (data10 > last10)
{
sendString("wzrosla\n");
}
else if (data10 == last10)
{
sendString("nie zmienila sie\n");
}
else
{
sendString("zmalala\n");
}
count = 0;
last10 = data10;
data10 = 0;
}
T0IR |= 0x00000001; // Skasowanie flagi przerwania
VICVectAddr = 0x00000000; // Sygnal skonczenia przerwania
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -