2011年11月1日 星期二

Cooper Maa: Chapter 4 -- TIMER

Cooper Maa: Chapter 4: 註: 本文為中文翻譯,原文請見底下網址: http://www.mikroe.com/eng/chapters/view/5/chapter-4-timers/ TOC Introduction Ch. 1 Ch. 2 Ch. 3 Ch 4. C...

2011年10月24日 星期一

AD

//**************************************************************************
//*  MCU : PIC16F886
//*  DATE : 20111003 EDITED BY GARY KAO
//*  轉動可變電阻, 透過A/D 10bit轉換, 取ADRESH 8bit結果, 顯示於RB LED
//**************************************************************************
/*
說明:
此AD解析度是10BIT, 若可變電阻接5V分壓, 則每跳動1 BIT變化0.0048V
5 / 1024 = 0.0048
若設定AD結果靠左, 且只取ADRESH, 忽略ADRESL時, 則每跳動1 BIT變化0.0048 * 4 = 0.0195V
因為ADRESL有3 BIT, 表示每次需經過3次,第4次會進位到ADRESH, ADRESH才會加1


所以若將5V分為5區間, 則判斷式設定如下
1. 0.25V / 0.0195 = 12.8
2. 1.25V / 0.0195 = 64
3. 2.5V  / 0.0195 = 128
4. 3.75V / 0.0195 = 192
5. 5V    / 0.0195 = 256
*/

#include <pic.h>
#include "DELAY.H"

// CONFIG
//__CONFIG(FOSC_INTRC_NOCLKOUT & WDTE_OFF & PWRTE_OFF & MCLRE_ON & BOREN_OFF & DEBUG_ON & CPD_OFF &LVP_ON&WRT_OFF&FCMEN_OFF&IESO_OFF&CP_OFF&BOR4V_BOR21V);
__CONFIG (FOSC_INTRC_CLKOUT & WDTE_OFF & PWRTE_OFF & MCLRE_ON & CP_OFF & CPD_OFF & BOREN_ON & IESO_OFF & FCMEN_OFF & LVP_OFF & DEBUG_ON);
__CONFIG (BOR4V_BOR21V & WRT_OFF);

void InitIO();
void InitAD();


void main(void)
{
InitIO();
InitAD();


OSCCON = 0x61;  // Fosc : 4MHz

GIE = 1;
while(1)
{



GO = 1;  // enable ad interrupt

}
}


//*****************
//  IO INITIALIZE
//*****************
void InitIO()
{

TRISB = 0x00;
PORTB = 0x00;

TRISC = 0X00;
TRISCbits.TRISC2 = 1;  // SET RC2 INPUT
//TRISC = 0X04;
}

//*****************
//  A/D INITIALIZE
//*****************
void InitAD()
{

TRISA = 0X01;
ANSEL = 0X01;

ADCON0 = 0X00; // RESET ADCON0
ADCS0 = 1; // OSC : FRC
ADCS1 = 1;
ADON = 1; // ENABLE ADC

ADCON1 = 0X00; // VREF : VSS-VDD
        ADFM = 0;                         // 0 : 左對位


ADRESL = 0X00;
ADRESH = 0X00;

//GIE = 1; // ENABLE GLOBLE INT
PEIE = 1;
ADIE = 1; // ENABLE ADC
}

interrupt void AD_isr()
{
if(ADIF == 1)
{
if(ADRESH <= 13)
{
PORTB = 0X00;
}
else if ( (ADRESH <= 64) && (ADRESH > 13) )
{
PORTB = 0X01;
}
else if ( (ADRESH < 128) && (ADRESH > 64) )
{
PORTB = 0X03;
}
else if ( (ADRESH < 192) && (ADRESH >= 128) )
{
PORTB = 0X07;
}
else
{
PORTB = 0X0F;
}

ADIF = 0;
}

}

TIMER0



//**************************************************************************
//*  MCU : PIC16F886
//*  DATE : 20111003 EDITED BY GARY KAO
//*  建立100ms , 1s 與 10s的TIMER0 中斷, 輸出到RB LED顯示
//**************************************************************************

#include <pic.h>
#include "DELAY.H"

// CONFIG
//__CONFIG(FOSC_INTRC_NOCLKOUT & WDTE_OFF & PWRTE_OFF & MCLRE_ON & BOREN_OFF & DEBUG_ON & CPD_OFF &LVP_ON&WRT_OFF&FCMEN_OFF&IESO_OFF&CP_OFF&BOR4V_BOR21V);
__CONFIG (FOSC_INTRC_CLKOUT & WDTE_OFF & PWRTE_OFF & MCLRE_ON & CP_OFF & CPD_OFF & BOREN_ON & IESO_OFF & FCMEN_OFF & LVP_OFF & DEBUG_ON);
__CONFIG (BOR4V_BOR21V & WRT_OFF);

void InitIO();
void InitAD();
void InitTMR0();

unsigned char a;
unsigned char TMR0_100ms;
unsigned char TMR0_1s;
unsigned char TMR0_10s;

void main(void)
{
InitIO();

InitTMR0();
//PORTB = 0X03;
//OSCCON = 0x61; // Fosc : 4MHz
OSCCON = 0X71; // 8MHz
/* if<PS2-PS0> SET 011, 預除器1:16, 表示當osc為4MHz時, 每16us TMR0加1
若要4ms時, TMR0產生溢位: 4ms/16us = 250 , 256-250=6
所以TMR0初值要設定為6,表示TMR0由6開始遞增, 遞增到256時觸發中斷
剛好為4ms
*/

/* 若Fosd : 8MHz, 表示 1 / (8Mhz/4) = 0.5us為一個指令週期,
預除器1:8,表示每 8 * 0.5us = 4us加1
若TMR0初值設定為6, 表示TMR0由6開始遞增, 遞增到256時觸發中斷, 總共遞增250次 (256-6)
所以觸發中斷時間為 4us * 250 = 1ms


*/
TMR0 = 0x06;

/* 如何產生1s的計時中斷?
1s / 4ms = 250
在中斷程式中判斷, 當第250次中斷發生時也是1s時間到了
此時再去執行真正想做的動作
*/
TMR0_100ms = 0;
TMR0_1s = 0;
TMR0_10s = 0;

//DelayMs(50); // delay 100ms @ 4MHz
GIE = 1;


while(1)
{


}
}

//*****************
//  TIMER0 INITIALIZE
//*****************
void InitTMR0()
{
//OPTION_REG = 0X00;
OPTION_REGbits.PS0 = 0; // PRESCALER 1:8
OPTION_REGbits.PS1 = 1;
OPTION_REGbits.PS2 = 0;
OPTION_REGbits.PSA = 0; // 0: TIMER0 ; 1: WDT
OPTION_REGbits.T0SE = 1; // 一般指clock由RA4/T0CKI輸入時
// 0:正緣觸發  ;  1:負緣觸發

OPTION_REGbits.T0CS = 0; // 0:TIMER(clock週期與指令週期相同)
// 1:COUNTER(clock由RA4/T0CKI輸入)

T0IE = 1; // ENABLE TIMER0 INT

}

//*****************
//  IO INITIALIZE
//*****************
void InitIO()
{

TRISB = 0x00;
PORTB = 0x00;

TRISC = 0X00;
TRISCbits.TRISC2 = 1;  // SET RC2 INPUT
//TRISC = 0X04;
}


interrupt void AD_isr()
{
if(T0IF)
{
TMR0_100ms++;
if(TMR0_100ms == 100)
{
PORTBbits.RB0 = !PORTBbits.RB0;
TMR0_100ms = 0;

TMR0_1s++;
if(TMR0_1s == 10) // 100ms * 10 = 1s
{
PORTBbits.RB1 = !PORTBbits.RB1;
TMR0_1s = 0;

TMR0_10s++;
if(TMR0_10s == 10) // 1s * 10 = 10s
{
PORTBbits.RB2 = !PORTBbits.RB2;
TMR0_10s = 0;
}

}

}



T0IF = 0;

}
}

2011年8月15日 星期一

等待英雄

自從看過「蝙蝠俠」這部電影以後,他就常常拿被單披在身上,跟兒子玩「蝙蝠俠」的遊戲, 兩個人殺來砍去,還踢破了門板。兒子對他崇拜的不得了。
  他身材高大魁武,但是成長過程一直很膽小,老是作大孩子的跟班,被使喚來去。他喜歡冥 思,常走進虛無飄渺的夢裏神遊,若問他到底在想些什麼,又不會表達。功課既不好,又不會蠻 勇,中學時代沒什麼好混的,卻不幸被一個看上他身材的女孩黏住了,讓她懷了孕,一當完兵就 草草結婚。
  他一直找不到理想的工作,只好跟父母住在一起。既是獨子,又有孫子,父母倒也樂得三代 同堂熱熱鬧鬧。可是老婆兇悍,對現狀不滿就大吼大叫滋生事端,搞得一個家還沒來得及溫馨就 像地獄。
  老婆最喜歡找父母吵架。他一出面勸和,老婆就兇他:「沒本事就一邊站!沒出息的東西。」 他果真一邊站住。母親倒看不過去:「沒出息?沒出息妳勾引他作什麼?騷包狐狸精,賴上我兒 子還敢兇,有本事就滾啊!」
  「滾就滾!妳當我喜歡住在這裏?小強,過來!」
  「帶小強走?妳美哦!小強姓我家的姓。」
  「可是我肚裏生出來的,當然是我的。」
  「會生孩子有什麼了不起?那個女人不會生?」
  「妳會生?妳就只會生一個,養得他像孬種。」老婆說。
  「罵我兒子孬種。妳真王八蛋!」
  兩個女人一拉小強左手,一拉小強右手,爭來搶去,只見小強一忽兒往這邊站,一忽兒往那邊 站,好痛苦,只好喊爸:「救命啊!」
  他一邊站著,很無力,好希望有人來救他,就很想念蝙蝠俠。
  這天他去應徵一份工作,是青島東路上一貿易公司的送貨員,出門前又為調解老婆與娘的糾紛, 被羞辱了一頓。
  「有本事就找份工作賺錢養你老婆兒子,不要白吃你爸媽的,讓你老婆看盡臉色;沒本事就滾 一邊涼快去,逞什麼英雄!」
  他垂頭喪氣的出了門。
  每次跟父母伸手要錢都有些尷尬,寧願省著點用,減少些要錢的次數,所以不敢叫計程車,在 大太陽底下站著等公車。
  過往公車很多,就是沒有他要的那班。他被車屁股黑煙薰得一頭一身,好躁熱。
  耳裏響的盡是老婆與娘的爭吵,眼底看的盡是交通的擁塞與等車人一張張沒表情的臉。
  一輛輛公車,一輛輛計程車在他面前停了又走了。
  一批批人被吞進車門裏,但仍有一群群人環繞著他。每個人都是淡著臉,沒有愉快也沒有不愉 快,彷彿再無法感覺出什麼。
  而內車道裏是穿流不息的轎車,有各種令他刺痛的名牌:賓士、BMW、VOLVO……,基 本生存之上的消費,隱含了社會階級的區隔,與人世間存在了不公平的印證。
  他有一種快被窒息的感覺,似乎周圍的人都長成一個個巨人,抑或是他自己已萎縮成株儒;整 個世界向他傾倒過來,淹沒了他、吸收了他,而他的任何掙扎、吶喊,都無法喚醒這世界一絲一毫, 甚至所有自救的努力,根本就引不起別人的注意。
  他想念蝙蝠俠是有原因的。蝙蝠俠沒有不能解決的難題,他是人類的救贖。
  他需要蝙蝠俠。
  他幻想自己是蝙蝠俠。他救贖自己,他救贖社會。
  他坐上公車。車子停停走走。車上有冷氣好舒服,不知不覺打起盹來,頭左晃右晃下點上拉。
  又猛然驚醒。
  「到青島東路的在這裏下車自己走過去,咱不能開了。」
  「怎麼回事?」
  「鐵網子都架起來啦!道路封鎖啦!」
  「怎麼回事?」
  「抗議嘛!就在立法院門口。」
  「又打起來啦?」
  「下車下車,不然怎麼辦呢?」
  好幾聲嘆息。
  他出了冷氣車,熱氣迎面撲來。猶疑一會兒,無所適從,還是往青島東路走去。
  才走百米公尺,突然警哨大作,還來不及搞清楚怎麼回事,猛然被推進一家店面。他回頭,是 憲警。
  「這時候還在街上走,你不要命啦!」又對店主道:「關上門,沒通知別開門。」
  玻璃店門立刻卡答關上。
  他只好站定在店裏,是家服飾店。
  「唉!今天又甭想好好營業了。誰曉得會搞到幾點。」店主道:「希望我們店面別遭殃。」
  他環視屋內,發現零零落落站了好些像他一樣被趕進來的路人。
  外頭警哨此起彼落。漸有人在街道上跑來跑來。一忽兒是拿著石塊的人,一忽兒是拿著警棍的人, 還有扛攝影機拿照相機的。
  店主將所有門窗的百葉簾都放了下來:「別往外看,人家火大了會找麻煩。上回就砸破了我一扇 窗,這窗簾,是領了教訓才趕快裝上的。」
  現在與外頭世界的聯繫只剩下一條條隱約灑落進來的光線,和無法聽分明的吼叫、哨聲。室內是 個封閉、完整而獨立的小小空間,竟有一種風雨之中的寧靜。
  一個老人幽幽嘆口氣:「怎麼這樣哩!亂成造樣!我不過是要去台大醫院看個病,過都不讓過。」
  「你過過看!小心點!我朋友的車都給當成出氣筒砸爛了。還好我看苗頭不對,趕快改道,逃出 來了。」計程車司機說。
  「抗議就抗議嘛!打什麼架?郝柏村有這麼不好?」
  「不是反郝柏村這個人,是反軍人干政。」一個手中拿著書載副眼鏡的年輕人道:「這是民主倒 退,不合民意。」
  「那也犯不著打架啊!」老人生氣道,對他不能上醫院,還是耿耿於懷。
  「那些動不動就說要民主、要民意的人,到底懂不懂老百姓啊?我看他們懂作官,不懂作老百姓 哦!」
  店老闆也點頭:「是啊!到底什麼是民意?老實講,今天誰作行政院長都沒關係,就是不要亂嘛! 你們看我這玻璃門,換過兩次了,都是被石頭砸的。立法院一有抗議,我們就得關店。」
  「噯呀!關個店算什麼?就當休息放假。我有個朋友在忠孝東路開銀樓,被搶得一乾一淨傾家蕩 產呢!」
  「所以我說,郝怕村當行政院長有什麼不好?至少治安好一點,強人嘛!」
  「這個這個」,坐在一旁,有點口吃的黝黑中年人道:「治治治安真真是會會有好?」
  「不管治安會不會好,最怕的就是強人政治,」戴眼鏡拿書本的年輕人推推眼鏡,說:「解決了 治安,又產生別的問題,冒太大的險了。何況治安還不一定靠郝柏村就解決的了,還是像美國英國一 樣,先建立一個健全的制度最重要。」
  「啊美美美國的杜社會真真有比比較好?這這是真真的?為為什麼美國電影壞壞壞人這這樣多, 電電影一一直拍一一直拍?」
  「哼!」老人嗤之以鼻:「你們讀書人,就講些天一般高的觀念。拿父母的錢讀書,能懂多少民 生疾苦?有本事就不要往美國跑,在台灣安身立命,賺點辛苦錢,講話才服得了人。」老人生氣的說, 拐杖不停點著地。大概他常這麼訓誨年輕人。
  年輕人仍不死心:「我是很落實的,只是我想得很遠。我從歷史的觀點來看台灣人民真正的需要。」
  「什麼是人真正的需要?」店主問。
  「是啊!什麼是人真正的需要?」計程車司機也笑道。
  坐在一旁雙手交疊的他這時突然說:「誰能解決問題救贖人類,誰就是民意,就是英雄。」
  因為一逕是沈默無語的,突然插入談話,吸走所有人的注意力。大家都轉頭看他。
  「我們需要解決困難,我們需要被救贖。」
  「是啊是啊!這是我們的基本前提,我們需要解決難題。但是,靠什麼呢?」年輕人笑說: 「英雄嗎?強人嗎?某政黨嗎?還是健全的體制呢?」
  大家都等著答案,想知道他支持那一方。
  「靠蝙蝠俠。」
  「蝙蝠俠?」大家面面相覷,不明究理。
  「這這這電影我我有看看過。這這世間真的有蝙蝙蝠俠?」
  計程車司機笑道:「你真會開玩笑,幽默幽默。」
  他卻很認真的說:「你們知道蝙蝠俠沒有出現的原因是什麼?他絕不是孬種,他在研究敵人。當 大家都在清查被毒素摻雜的物質時,蝙蝠俠已經知道敵人不是這些物質,是下毒的人,就是小丑。」
  「怎麼講起什麼蝙蝠俠來了?離譜離譜。」嚴肅的老人聽不懂,搖頭嘆息。
  拿書的年輕人沒有看過這部電影,倒也知道說的是賣座很高的娛樂名片,覺得不甚有學問,便不 答話。
  看過片子的計程車司機笑道:「蝙蝠俠什麼時候出來呢?」
  「蝙蝠俠是誰呢?」店主也問。
  披著床單和兒子玩蝙蝠俠的影像在腦海中游走;兒子滿是崇拜的表情。可是影像突然中斷,出現 老婆滿臉不屑的罵街模樣。
  是啊!蝙蝠俠是誰?又是什麼時候出來?這不是他問了自己千百遍的問題嗎?
  血液在血管中翻湧,心跳加快。他血氣澎濟,激動不已。
  他跳起來,衝向門口。
  拉開門,那短暫被隔絕掉的真實世界迎面撲來,警哨聲此起彼落,人跑來跑去,憲警拿著棍子追逐。
  「危險哪!」老人身後喊。
  他衝向街中央,雙手平展,作出他以為的制止衝突帶來和平的拯救姿勢。
  先是石頭迎面飛來,然後是警棍打在他身上。
  他被送進醫院。
  新聞記者蜂擁進他的家,報知兩種截然不同的消息。
  「妳先生是警棍底下的犧牲者,是抵制不合理政治體制的遇難英雄。」
  「妳先生是反對暴民護衛和平的最勇敢英雄。」
  他老婆只聽懂「英雄」兩個宇:「你們說他是英雄?他是英雄?」也有立場公正的新聞媒體想搞清楚 到底是怎麼回事,去服飾店找店主問個究竟。
  「請問他衝到街上去之前說了什麼,或做了什麼?」
  店主說:「他在談蝙蝠俠那部電影啊!談著談著,沒頭沒腦的就衝出去了。」
  因為查不清真相,各家報紙還是自說自話,將他視為支持己方的英雄人物。
  但他無從辨明,因為他沒再醒過來。

(原載宇宙光雜誌七十九年九月)