2011年11月2日 星期三

A/D , TIMER0 and RB interrupt

//**************************************************************************
//*  MCU : PIC16F886
//*  DATE : 20111003 EDITED BY GARY KAO
//*  轉動可變電阻, 透過A/D 10bit轉換, 取ADRESH 8bit結果, 顯示於RB LED
//*  啟動時進入sleep mode, 按下RB4 wake up, 觸發RBIF中斷, 啟動AD (GO = 1), enableRB4INT = 1
//*  while(1)判斷enableRB4INT是否為1, 且AD是否轉換完成(GO = 0)
//*  若條件成立, show BAT level, 利用TIMER 0延遲8秒後再進入sleep mode

//**************************************************************************
//*  此程式使用RB中斷喚醒MCU, 沒使用 A/D中斷
//**************************************************************************
/*
說明:
此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 InitTMR0();

void sleep();
void showChargingState();

bit enableRB4INT;
unsigned char TMR0_1ms;
unsigned char TMR0_100ms;
unsigned char TMR0_1s;


void main(void)
{
OSCCON = 0x61;  // Fosc : 4MHz

enableRB4INT = 0;
InitIO();
InitAD();
InitTMR0();

TMR0 = 0x06; // TMR0: 6~256 ; 250次
TMR0_1ms = 0;
TMR0_100ms = 0;
TMR0_1s = 0;

RBIE = 1;
GIE = 1;
// GO = 1;
sleep();

while(1)
{
if(enableRB4INT == 1)
{
if(GO == 0) // if A/D completed
{

showChargingState();
T0IE = 1; // ENABLE TIMER0 INT

if(TMR0_1s == 8)
{
PORTBbits.RB0 = 0;
PORTBbits.RB1 = 0;
PORTBbits.RB2 = 0;
PORTBbits.RB3 = 0;
T0IE = 0; // Disable TIMER0 INT
TMR0_1s = 0;
enableRB4INT = 0;
sleep();
}

}

}


}
}

void showChargingState()
{

if(ADRESH < 180) // < 3.5v
{
PORTBbits.RB0 = !PORTBbits.RB0;
PORTBbits.RB1 = !PORTBbits.RB1;
PORTBbits.RB2 = !PORTBbits.RB2;
PORTBbits.RB3 = !PORTBbits.RB3;
DelayMs(200);
//PORTB = 0x0f;
//DelayMs(200);
}
else if ( (ADRESH >= 180) && (ADRESH < 186) ) // 3.51v ~ 3.62v
{
PORTBbits.RB0 = 1;
PORTBbits.RB1 = !PORTBbits.RB1;
PORTBbits.RB2 = !PORTBbits.RB2;
PORTBbits.RB3 = !PORTBbits.RB3;
//PORTB = 0X01;
DelayMs(200);
}
else if ( (ADRESH >= 186) && (ADRESH < 198) ) // 3.63v ~ 3.86v
{
PORTBbits.RB0 = 1;
PORTBbits.RB1 = 1;
PORTBbits.RB2 = !PORTBbits.RB2;
PORTBbits.RB3 = !PORTBbits.RB3;
DelayMs(200);
}
else if ( (ADRESH >= 198) && (ADRESH < 209) ) // 3.87v ~ 4.07v
{
PORTBbits.RB0 = 1;
PORTBbits.RB1 = 1;
PORTBbits.RB2 = 1;
PORTBbits.RB3 = !PORTBbits.RB3;
DelayMs(200);
}
else // > 4.08v
{
PORTB = 0X0F;
}

}

//*****************
//  TIMER0 INITIALIZE
//*****************
void InitTMR0()
{
//OPTION_REG = 0X00;
OPTION_REGbits.PS0 = 1; // PRESCALER 1:4; 4us加1, 4us*250 = 1ms
OPTION_REGbits.PS1 = 0;
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()
{
ANSELH = 0X00; // disable AN8~AN13
TRISB = 0x10; // RB4 : INPUT
PORTB = 0x10; // RB4 : INPUT
WPUB = 0X10; // enable RB4 weak pull high
IOCB = 0X10; // enable RB4 interrupt
OPTION_REGbits.nRBPU = 0; // enable weak pull high
OPTION_REGbits.INTEDG = 0; // falling edge interrupt

//TRISB = 0x00;
//PORTB = 0x00;

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

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

TRISA = 0X01; // RA0:input
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 INT
}

interrupt void AD_isr()
{
/*if(ADIF == 1)
{


ADIF = 0;
}*/

if(T0IF) // 1ms
{
TMR0_1ms++;
if(TMR0_1ms == 100) // 100ms
{
//PORTBbits.RB0 = !PORTBbits.RB0;


TMR0_100ms++;
if(TMR0_100ms == 10) // 1s
{
//PORTBbits.RB3 = !PORTBbits.RB3;

TMR0_1s++;

//if(TMR0_1s == 3) // 1s * 3 = 3s
// pressed3Sec = 1;
//else
// PORTBbits.RB0 = 0;

TMR0_100ms = 0;
}

TMR0_1ms = 0;
}
T0IF = 0;
}

if(RBIF)
{
if(PORTBbits.RB4 == 0) // RB4 pressed
{
DelayUs(100);
GO = 1;  // A/D start
enableRB4INT = 1;
}

RBIF = 0;
}

}

void sleep()
{
     #asm
          SLEEP
     #endasm
}

2011年11月1日 星期二

Cooper Maa: Chapter 7 -- Analog Modules

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

Cooper Maa: Chapter 1 -- PIC16F887 Microcontroller - Device Overview

Cooper Maa: Chapter 1: 註: 本文為中文翻譯,原文請見底下網址: http://www.mikroe.com/eng/chapters/view/2/chapter-1-pic16f887-microcontroller-device-overview/ TOC Introducti...

Cooper Maa: Chapter 2 -- Core SFRs

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

Cooper Maa: Chapter 3 -- I/O Port

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

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

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

2011年7月28日 星期四

Arduino周邊應用 -- Hijack

參考 : http://www.seeedstudio.com/blog/2011/07/01/hijack-development-pack-launched/
http://www.seeedstudio.com/depot/hijack-development-pack-p-865.html?cPath=174


Hijack Development Pack

Arduino周邊應用 -- MP3 Player Shield

參考 : http://www.sparkfun.com/products/10628

MP3 Player Shield

Arduino周邊應用 -- Music Shield

參考 : http://www.seeedstudio.com/depot/music-shield-p-642.html?cPath=132_134


Music Shield


Arduino周邊應用 -- WiFly Shield

參考 : http://www.sparkfun.com/products/9954


WiFly Shield



Arduino周邊應用 -- microSD Shield

參考 : http://www.sparkfun.com/tutorials/172


microSD Shield

2011年7月15日 星期五

安裝Android開發工具

from: http://code.google.com/p/androidbmi/wiki/InstallAndroid

支援的作業系統如下:
  • Windows XP 或 Vista
  • Mac OS X 10.4.8 或之後版本 (僅適用 2007 年後出廠,採用 x86 架構的 Intel Mac)
  • Linux (官方是在 Ubuntu 上測試)

2011年7月14日 星期四

Installing the ADT Plugin

The sections below provide instructions on how to download and install ADT into your Eclipse environment. If you encounter problems, see the Troubleshooting section.

建立Android開發環境

Step 1. Preparing Your Development Computer

2011年6月28日 星期二

iPad / iPhone / iOS App 上架程式確認流程

from: http://o4inno.tw/blog/2011/04/16/xcode-4-%E5%88%9D%E6%8E%A2-iphone-app-%E4%B8%8A%E6%9E%B6-%E7%A8%8B%E5%BC%8F%E7%A2%BA%E8%AA%8D%E6%B5%81%E7%A8%8B/

------------------------------------------------------------------


慣了Xcode 3的介面,一下子改到Xcode 4有點不習慣,但要用到的部份大致上都找得到,不過久沒上架App還是花了我一些時間,為了讓之後的上架流程更加順利,這邊做一下筆記。

2011年6月20日 星期一

Change background color of UIButton

add QuartzCore.framework to project


//
//  PowerBankViewController.h


#import <QuartzCore/QuartzCore.h>

IBOutlet UIButton *btn10;
IBOutlet UIButton *btn20;

@property (nonatomic, retain) IBOutlet UIButton *btn10;
@property (nonatomic, retain) IBOutlet UIButton *btn20;

Easy to use UISwitch

IBOutlet UISwitch --> value changed event
(UISlider也是類似此方式)
//
//  PowerBankViewController.h

@interface PPowerBankViewController : UIViewController {
IBOutlet UISwitch *aSwitch;
}

兩個View傳送資料

環境:
1. main view
2. table view

目的:
將main view的資料傳送到table view上並顯示出來

重點:
從main view建立table view的instance 來傳資料給table view,  ex:
DetailData *_showDetailData = [[DetailData alloc] init];

_showDetailData.receiveArrayBatLevel = arrayBatLevel;
_showDetailData.receiveArrayCurTime = arrayCurTime;

DetailData為table view, create instance of DetailData,  將arrayBatLevel (main view的資料)傳給table view

若用相反方式來作, 則須透過protocol,

Navigation 使用心得

構想: two view
1. main view: include current time and battery status
2. table view: record current time and battery level, using NSTimer

main view按下info button會顯示table view

2011年6月13日 星期一

About "Instruments"

Instruments 可以收集CPU和記憶體行為, 並紀錄在檔案中, 可以用來分析性能瓶頸,記憶體洩露等
例如: 在Xcode開啓Leaks

主界面如下

2011年5月30日 星期一

腺病毒

腺病毒,顧名思義。乃是因其對身體內的腺體或淋巴組織有強烈感染力,腺病毒是眾多人類能致病的病毒之一,屬於DNA病毒,約有40多種類型,在動物,如:狗、猴子、雞、牛也可發現。

2011年5月22日 星期日

UIImagePickerController

可用來選取照片(從photo library中)或重新拍照(使用camera)...在使用的時候需要先產生UIImagePickerController  實作, 為其指定委託(delegate), 並選擇圖像來源類型, 設定圖像是否可編輯,  最後將其啓動, 顯示其檢視

iPhone開發推薦書籍

精通Objective-C 2.0程式設計
誠心推薦

2011年5月17日 星期二

啟動Win7的快速啟動列

from:http://blog.hsdn.net/1428.html

安裝好Windows 7到今天算一算也過了一個星期,用起來沒有什麼大問題,可是對於Windows 7的快速啟動列,卻覺得不是很好用,於是我決定把它修改成以往Windows的顯示方式。

2011年5月16日 星期一

讓MSN離開工具列

from: http://blog.hsdn.net/1430.html
怎麼讓msn從工具列中移除,然後讓它像在微軟其它的舊系統一樣乖乖待在通知區域(就是有小時鐘的那個區塊)。

將 Skype 由 Windows 7 工作列移除

from:http://www.ezpaso.com/blog/archives/2010/08/

新版的 Skype 似乎是為了配合 Windows 7 釘選的新功能,在關閉視窗之後依然會強制保留在工作列上。說真的,還真的是很不方便,不過幸好有辦法可以關閉此功能。(版本為 4.2.0.169)

Windows 7 啟動 Administrator 為預設帳號


Windows 7 一安裝完成的時候,使用者帳號類型被歸類為「系統管理員」。乍看之下似乎沒什麼問題,但是實際上並非如此。因為這並非真正的系統管理員,而僅是一個權限受到限制的管理員帳號。而且這種管理員帳號可以建立很多組,而且每個都受到系統的限制。
剛剛由舊版的作業系統升上來的人,可能會搞不懂為什麼微軟要這麼設計?說真的,我們也不知道。所幸我們可以把真正的系統管理員「Administrator」叫出來使用,而使用 Administrator ,我們才可以真正取得整台電腦完整的權限,不僅各種權限全部開啟,還可以更改其他帳號,連擾人的 UAC 都消失不見。
方法一:
  1. 安裝 Windows 7。
  2. 桌面載入之後,找到「開始」→「附屬應用程式」→「命令提示字元」。
  3. 按滑鼠右鍵,選擇「以系統管理員身分執行」。
  4. 然後在命令提示字元(DOS 畫面)中輸入「net user administrator /active:yes」,按 ENTER。
  5. 啟動完成。
  6. 現在可以登出現有帳號,改以 Administrator 重新豋入。
  7. 刪掉其他不需要的帳戶即可。
方法二:
  1. 安裝 Windows 7。
  2. 桌面載入之後,找到「開始」→「電腦」→按下滑鼠右鍵→選「管理」。
  3. 找到「本機使用者和群組」→「使用者」→「Administrator」。
  4. 按右鍵→選「內容」。
  5. 將「帳戶已停用」取消→「確定」。
  6. 找到自己目前的使用者帳號→右鍵→「刪除」。
  7. 重開機即可。

UIDevice

UIDevice類別是題供iPhone/iPod touch有關的裝置資訊
此類別唯一實體可利用類別方法currentDevice來取得,  下列是可利用這個實體取得的資訊

1. 獨一無二的識別資訊(unique identifier)

@property (nonatomic, readonly, retain) NSString *uniqueIdentifier;


2. 作業系統OS

@property (nonatomic, readonly, retain) NSString *systemName;


3. OS Version

@property (nonatomic, readonly, retain) NSString *systemVersion;


4. model (iPhone or iPod touch or iPad etc)

@property (nonatomic, readonly, retain) NSString *model;


5. 裝置定向   (可利用orientation屬性取得)

@property (nonatomic, readonly) UIDeviceOrientation orientation;
可能的內容值如下
-UIDeviceOrientationUnknown
-UIDeviceOrientationPortrait
-UIDeviceOrientationPortraitUpsideDown
-UIDeviceOrientationLandscapeLeft
-UIDeviceOrientationLandscapeRight
-UIDeviceOrientationFaceUp(螢幕朝上)
-UIDeviceOrientationFaceDown(螢幕朝下)


6. 電池狀態 (透過batteryLevel取得目前電池電量等級)

@property (nonatomic, readonly) float batteryLevel;

取得的數值是介於0.0~1.0(完全充飽), 假設電池電量無法背叛斷出來, 此值會等於1.0


6-1 利用batteryState取得電池狀態

@property (nonatomic, readonly) UIDeviceBatteryState batteryState;

回傳值為下列之一
-UIDeviceBatteryStateUnknown (電池狀態無法判斷, 使用simulator會得到此結果)
-UIDeviceBatteryStateUnplugged (電池因為未接上電源而處於耗電狀態)
-UIDeviceBatteryStateCharging
-UIDeviceBatteryStateFull


6-2 電池狀態等級通知
任何物件都可以被當成觀察者來加入底下兩個通知
-UIDeviceBatteryLevelDidChangeNotification
  此通知會在電池電量等級有發生改變時被發送出來 , 發送頻率最多是每分鐘一次


-UIDeviceBatteryStateDidChangeNotification
  電池狀態有發生改變時被發送出來, 例如: 裝置正被連接到電源上


為了接收這些通知資訊, 須將屬性batteryMonitoringEnabled設為YES





2011年5月15日 星期日

Customization Navigation View

basic property of navigation

//取得Navigation實體
@property (nonatomic, readonly, retain) UINavigationItem *navigationItem

2011年5月4日 星期三

About afconvert

iPhone OS支援的音樂格式 (部份)
CAF:apple的core audio音樂格式(.caf)
ALAC :apple不失真的音樂格式(.m4a)
AIFF:apple的音樂格式(.aif, .aiff)
AAC:itunes store音樂傳送時使用(.m4a)
MP3:(.mp3)

2011年5月2日 星期一

About AVAudioPlayer

There are many different ways to get an iPhone app to generate and record audio, but AVFoundation is the best compromise between simplicity and functionality

AVFoundation.framework : AVAudioPlayer, AVAudioRecorder

2011年4月27日 星期三

view switcher(三)-SwitchViewController








//

//  SwitchViewController.h

#import <UIKit/UIKit.h>

@class BlueViewController;
@class YellowViewController;

@interface SwitchViewController : UIViewController {
BlueViewController *_blueViewController;
YellowViewController *_yellowViewController;

}

@property (nonatomic, retain) BlueViewController *_blueViewController;
@property (nonatomic, retain) YellowViewController *_yellowViewController;

-(IBAction)switchViews:(id)sender;

@end

修改MainWindow.xib
按兩下MainWindow.xib開啓IB, 必須再建立用來表示root controller的實例; 因為IB程式庫沒有SwitchViewController, 所以必須加入一個view controller,再將其類別改為SwitchViewController
(圖一)將UIViewController拉到nib時所產生的view



接下來建立root controller的view, root controller的view將包含螢幕下方的一個工具列
之前我們將UIViewController拉到nib主視窗時, 產生了一個新視窗(如第一張圖), 要在此視窗為root controller(SwitchViewController)建立view

SwitchViewController主要任務是切換BlueView與YellowView, 所以必須有可以讓使用者改變檢視的方法, 所以在工具列增加一按鈕讓使用者切換檢視

從Library拖曳View到(圖一), Library拖曳Toolbar
更改button name 為 Switch Views

接著將動作與button連接
選擇MainWindow.xib的Switch View Controller, 選擇Inspector的Connections Inspector, 將switchViews方法連結至Toolbar的button (如下圖)

之前在SwitchViewControllerAppDelegate.h建立IBOutlet (_switchViewController), 因此應用程式可以連接到SwitchViewController的實例, 並在主要的應用程式視窗中加入sub view,..  所以必須在nib中將SwitchViewController實例連接到此IBOutlet
選擇Switch View Controller App Delegate, 選擇Inspector的Connections Inspector,將_switchViewController連接到SwitchViewController的實例, 如下圖

儲存nib, 開始編輯SwitchViewController.m

//  SwitchViewController.m
//  SwitchViewController

//

#import "SwitchViewController.h"

#import "BlueViewController.h"
#import "YellowViewController.h"

@implementation SwitchViewController

@synthesize _blueViewController;
@synthesize _yellowViewController;

-(IBAction)switchViews:(id)sender
{
//先檢查_yellowViewController的view之上層view是否為nil
if (self._yellowViewController.view.superview == nil
{
//檢察_yellowViewController是否被建立, 若尚未被建立, 則下列if成立 
if (self._yellowViewController == nil
{
YellowViewController *yellowController = [[YellowViewController alloc]
  initWithNibName:@"YellowView" bundle:nil];
self._yellowViewController =yellowController;
[yellowController release];
}
[_blueViewController.view removeFromSuperview];
[self.view insertSubview:_yellowViewController.view atIndex:0];
}
else {
if (self._blueViewController == nil
{
BlueViewController *blueController = [[BlueViewController alloc]
  initWithNibName:@"BlueView" bundle:nil];
self._blueViewController =blueController;
[blueController release];
}
[_yellowViewController.view removeFromSuperview];
[self.view insertSubview:_blueViewController.view atIndex:0];
}

}


- (void)viewDidLoad {
BlueViewController *blueController = [[BlueViewController alloc
  initWithNibName:@"BlueView" bundle:nil];
self._blueViewController = blueController;
//將藍色檢視加入成為根檢視的子檢視, 索引值為0表示此子檢視放在所有東西的最下層,
//如此可確保工具列永遠都看的見
[self.view insertSubview:blueController atIndex:0];
[blueController release];
    [super viewDidLoad];
}


- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];
if (self._blueViewController.view.superview == nil
{
self._blueViewController = nil;
}
else 
{
self._yellowViewController = nil;
}

}

- (void)viewDidUnload {
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}


- (void)dealloc {
[_blueViewController release];
[_yellowViewController release];
    [super dealloc];
}


@end

將兩個檢視加入按鈕觸發動作

//
//  BlueViewController.h

#import <UIKit/UIKit.h>

@interface BlueViewController : UIViewController {

}

-(IBAction)blueButtonPressed;

@end


//
//  YellowViewController.h
#import <UIKit/UIKit.h>

@interface YellowViewController : UIViewController {

}

-(IBAction)yellowButtonPressed;

@end

將兩個檢視與 xib連結,  分別開啓BlueView.xib , YellowView.xib
ex: double click "BlueView.xib", select File's Owner, 按下command+4呼叫Identity Inspector
NSObject 改為 BlueViewController

更改view背景顏色為藍色

增加button, 連接blueButtonPressed, 除了連接IBAction, 還要將BlueViewController的View接口連接到nib中的view

YellowView的做法也與BlueView相同