АпаратнотАУпрограмний комплекс GSM-МТМ

Дипломная работа - Компьютеры, программирование

Другие дипломы по предмету Компьютеры, программирование



не заважали старi значення, якi могли залишитися вiд роботи iнших програм.

Пiсля того як ми скинули регiстри UART, можна приступити власне до iнiцiалiзацiСЧ COM-порту. Пiд час iнiцiалiзацiСЧ задаСФться формат даних - довжина слова, кiлькiсть стопових бiтiв, наявнiсть контролю по парностi i швидкiсть обмiну.

Для задання швидкостi обмiну даними треба перевести регiстр даних i регiстр керування перериваннями в режим уведення значення дiльника частоти тактового генератора. Цей режим встановлюСФться записом одиницi в старший бiт регiстра керування лiнiСФю (LCR):

// переводимо регiстр даних i регiстр

// керування перериваннями у режим уведення

// значення дiльника частоти тактового генератора

ctl = inp(LCR); // LCR - адреса регiстра керування

// установлюСФмо старший бiт регiстра

outp(LCR_N, ctl | 0x80);

// обчислюСФмо значення для дiльника частоти

//(змiнна baud визначаСФ швидкiсть обмiну,

// яку ми хочемо установити)

switch(baud) {

case 110: div = 1040; break;

case 150: div = 768; break;

case 300: div = 384; break;

case 600: div = 192; break;

case 1200: div = 96; break;

case 2400: div = 48; break;

case 4800: div = 24; break;

case 9600: div = 12; break;

case 19200: div = 6; break;

case 38400: div = 3; break;

case 57600: div = 2; break;

case 115200: div =1; break;

default: return(-1); break;

}

// записуСФмо значення дiльника частоти,

// молодший байт у регiстр даних, старший

// у регiстр керування перериваннями

// ICR - адреса регiстра керування перериваннями

outp(ICR, (div >> 8) & 0x00ff);

// DAT - адреса регiстра даних

outp(DAT, div & 0x00ff);

// переводимо регiстр даних i регiстр

// керування перериваннями назад у звичайний

// для них режим

ctl = inp(LCR); // LCR - адреса регiстра керування

//скидаСФмо старший бiт регiстра

outp(LCR, ctl & 0x7f);

Потiм треба визначити формат даних. Для цього запишемо нове керуюче слово в регiстр LCR:

// записуСФмо нове керуюче слово

outp(LCR, 00000011B);

// керуюче слово 00000011B встановлюСФ довжину

// слова 8 бiт, один стоповий бiт, скасовуСФ перевiрку

// на парнiсть i скасовуСФ режим фiксацiСЧ парностi

Останнiм кроком в iнiцiалiзацiСЧ регiстрiв UART СФ iнiцiалiзацiя регiстра керування перериваннями. Ми повиннi спецiально вказати послiдовному адаптеру, коли вiн повинен генерувати переривання.

Створення процедури обробки переривання для СОМ порта

Послiдовний асинхронний адаптер можна запрограмувати таким чином, що кожний раз, коли вiн прийме чи передасть черговий байт, буде згенероване вiдповiдне переривання. Переривання можуть генеруватися асинхронним адаптером у таких випадках:

змiнився стан лiнiСЧ приймача: вiдбулося переповнення приймача, вiдбулася помилка парностi чи синхронiзацiСЧ, лiнiя перейшла в стан BREAK (розрив);

данi прийнятi i доступнi для читання через регiстр даних;

регiстр передавача порожнiй;

змiнився стан модему: змiнився стан лiнiй CTS, RI, DCD, DSR.

РЖснуСФ можливiсть окремо забороняти чи дозволяти певний тип переривання. Для цього необхiдно встановити вiдповiднi бiти в регiстрi керування перериваннями.

Кожному COM-порту вiдповiдаСФ, крiм базовоСЧ адреси його регiстрiв, лiнiя IRQ [3]. Стандартний розподiл апаратних переривань такий:

COM-портIRQНомер переривання COM1IRQ4INT 0Ch COM2IRQ3INT 0Bh COM3IRQ4INT 0Ch COM4IRQ3INT 0Bh

Для встановлення власного оброблювача переривання вiд СОМ порту необхiдно замiнити процедуру обробки переривання, яка встановлена операцiйною системою або БРЖОСом на власну процедуру обробки переривання. Пiсля цього дозволити переривання, яке було встановлено.

При реалiзацiСЧ процедури обробки переривання необхiдно керуватися таким алгоритмом:

1.Визначити причину переривання

Для цього потрiбно проаналiзувати стан бiтiв D1 D2, якi визначають причину переривання:

Бiти D2 D1Причина переривання00переривання по лiнiСЧ стану;01буфер передавача порожнiй;10данi прийнятi;11змiнився стан модему.

У залежностi вiд того, яке вiдбулося переривання, його треба вiдповiдним чином обробити.

Алгоритм роботи для кожного типу переривання вiд СОМ порта:

Вiдбулося переривання по лiнiСЧ стану

Прочитати регiстр стану лiнiСЧ i конкретизувати причину переривання (дане переривання скидаСФться пiсля читання регiстра стану лiнiСЧ). Якщо це необхiдно, подати основнiй програмi сигнал про помилку, що вiдбулася, з метою СЧСЧ усунення. Наприклад, у випадку розриву лiнiСЧ (BREAK) (вiддалений модем повiсив трубку), можна було б спробувати вiдновити звязок.

Переривання по прийому даних

Черговий символ прийнятий, i його можна прочитати через регiстр даних. Переривання скидаСФться пiсля читання регiстра даних. Прийнятий байт необхiдно записати в прийомний буфер програми, з якого згодом його прочитаСФ основна програма. Буфер приймача зручно органiзувати у видi черги.

Буфер передавача порожнiй

Переривання вiдбуваСФться у випадку, якщо буфер передавача порожнiй i можна передати COM-порту черговий символ. Можна органiзувати буфер передавача програми, у який програма буде записувати данi, призначенi для вiдправки через COM-порт. У цьому випадку, коли прийде переривання, треба прочитати черговий символ з програмного буфера i записати його в регiстр даних. Переривання скидаСФться пiсля запису чергового символу в регiстр даних UART. Якщо немаСФ даних для передачi (програмний буфер передавача порожнiй), можна заборонити це переривання через регiстр керування перериваннями.

Змiнився стан модему

Переривання вiдбуваСФться при змiнi стану вхiдних лiнiй CTS, RI, DCD, DSR. Стан цих лiнiй можна визначити, прочитавши регiстр стану модему MSR. Це