2017年10月18日 星期三

[MCU]PIC18F45K20 Demo board LED Example

手邊有一組 PICkit 44-Pin Demo Board (PIC18F45K20)


這塊版子的LED在RD0~RD7

可變電阻(右上方)接在RA0

Switch Button(右下方)接在RB0

程式碼如下
#pragma config FOSC = INTIO67    // FOSC = INTIO67 Internal oscillator block
#pragma config WDTEN = OFF, LVP = OFF    // LVP = OFF Single-Supply ICSP disabled
                                         //WDTEN = OFF Watch dog timer is always disabled. SWDTEN has no effect.
 #include "p18f45k20.h"   //inclue this mcu header
 
 void delay();   
 //delay function   
 void delay() {      
    int counter = 0;   
    for (counter = 0; counter<1000; counter++);    
 }   
 void main(void) {      
    int dummy = 0;   
    /*init the RA0 as analog input*/   
    TRISA = 0x1; // set potentiometer at porta as input (only set port A0)    
    ANSELbits.ANS0 = 1; // set RA0 to analog (=1, 0 = digital) -> this is important to potentiometer  at RA0      
    ADCON0bits.ADON = 1; // activate A/D unit   
    /*init the RB0 as digital input*/   
    TRISB = 0x1; // set bit0 of portb to input because there is the push button at RB0      
    ANSELHbits.ANS12 = 0; // set RB0 to digital (=0, 1= analog) -> this is important to read button at RB0   
    /*init the RD0..RD7(PORTD) as digital output*/   
    TRISD = 0; // all bits of portd are set 0 as output      
    PORTD = 0; // deactivate all led's   
                                                                                                                                                                 
    while (1) {          
       if (PORTBbits.RB0 == 0) { //check if button is pressed (=0, 1= not pressed)                          
          ADCON0bits.GO_DONE = 1; // start A/D convert              
          while(ADCON0bits.GO_DONE != 0); // wait till A/D convert done               
          dummy = ADRESH; // copy A/D result (high part) to leds -> dummy variable is only for better debugging              
          PORTD = dummy;          
       } else {              
          PORTD = PORTD<<1; // move set led   
          if (PORTD == 0) {    
             PORTD = 0x1; // if all led's off activate one   
          }          
       }   
       delay();      
    }       
 }   
 



程式碼內容主要為

config
設定使用內建震盪器、關閉看門狗

pin define

設定RA0為類比輸入
RB0為類比輸入
RD0~7為輸出

function
若switch button沒有按下,則執行跑馬燈,

若按下則讀取RA0的類比輸入並透過LED
顯示數值。












一開始遇到的困難是程式build success,按燒錄後卻沒有任何反應,

以下有二個小心得:

(1) 燒錄時Pickit 3要供電3.25V
(2)必須按下Run Project,單獨program的話,只會在燒錄過程中供電,燒完就沒電了,
當然不會亮囉。

晚安囉~

參考資料:

2017年10月16日 星期一

[iOS] Signing for "Map" requires a development team.


初用MapKit,編譯時遇到這個錯誤

Signing for "Map" requires a development team.


解法如下:

1.登入APPLE ID


2.在Signing設定Team即可(我的APPLE ID是沒有交99鎂的)

3.重新Builder



2017年10月14日 星期六

「電路」邏輯電平轉換

當你有3.3V 和5V需要UART通訊的需求時,會需要一個電平轉換IC,不然3.3V那邊可能

會燒毀。


我用的是這一顆 3.3V 5V Logic Level Converter



購買網址如下:
https://ok.100y.com.tw/Goods/97459


LV接3.3V , HV接5V,接下來就可以進行UART的通訊,實際測過7688與Arduino nano

是OK的,可以正常通訊。

[C] fget read stdin after scanf("%d"...) not work

最近遇到一個問題,當我用fget讀取訊息後,並沒有進行讀取,程式碼如下



#include <stdio.h>
#include <string.h>


int main(void)
{


char message[200];
int ID;




printf("\t[Info] 請輸入員工編號:");
scanf("%d", &ID);


printf("員工編號:%d",ID);

printf("\n 請輸入要傳遞老闆的訊息:" );
fgets(message,sizeof(message),stdin);

printf("您傳給老闆的訊息:%s",message);

}

執行結果:




網路上查詢後,發現問題如下:

When you read the integer with scanf("%d"....), it does not remove the newline from the input stream. So when you call fgets later, it reads and finds a newline , i.e. you read a blank line.
To read the next line instead you will need to consume that newline, e.g. getchar() as someone else suggested.

因為scanf("%d,...")並不讀進換行字元,當您在之後使用fget時,

就會直接讀到一個換行字元,然候就結束了,所以必須先處理掉這個換行字元,

透過getchar()這個method去讀一個字元。

修正後的程式碼如下:

#include <stdio.h>
#include <string.h>


int main(void)
{


char message[200];
int ID;




printf("\t[Info] 請輸入員工編號:");
scanf("%d", &ID);


printf("員工編號:%d",ID);

getchar();

printf("\n 請輸入要傳遞老闆的訊息:" );
fgets(message,sizeof(message),stdin);

printf("您傳給老闆的訊息:%s",message);

}

執行結果:




參考來源:
https://stackoverflow.com/questions/22552166/fgets-not-working-in-c-linux

2017年10月10日 星期二

[分享]碟剎油(剎車油)更換

某一天和朋友出去,友人突然發現我的剎車油變黑了,建議快去換。

以下是後碟剎油,里程數約8K



前碟剎油



明顯發現後碟剎劣化快多了。

更換前後剎車油600(前250,後350),記得要找信任的店家,

剎車油更換中如果有空氣進入管道中,剎車壓力會不見(也就是失靈),

更換完畢後,必須要用清潔濟清洗週邊,剎車油具有腐蝕性,會吃漆,

弄壞你的外殻,千萬不要滴到。

最後來一張,更換後的。


其實我可以只換後碟剎油的,但想說前碟雖然沒有劣化那麼嚴重,

就一起換一換吧,老闆說一般即使黑掉還是能使用,只要別拖到

開始結塊了,一般來說每1萬二千公里要檢查一次。

「單字筆記」 Insurance claims

Insurance claims   保險理賠
[ in'ʃuərəns ] [kl'em] 

「單字筆記」mandatory

mandatory  「ˈmandəˌtôrē

adj.強制的;命令的;受委託的;

n.受托者;

Mandatory sign: mandatory sign requires specific behaviors or action.
強制性標識:強制性標識是對行為或行動的明確要求。

It is mandatory to rate overall achievement of specific objectives and general performance via this scale.
通過這種尺度對所有特殊的宗旨和一般的業績是強制性的。


資料來源:
https://tw.voicetube.com/definition/mandatory

「分享」用地址查詢地號

有時候需要去查詢地政資料時,會需要你家的地號和建號,讓如何查詢呢?

有一個免費的系統

地籍圖資網路便民服務系統:
http://easymap.land.moi.gov.tw/R02/Index

我們來查一下高雄市政府四維行政中心的地號吧

802高雄市苓雅區四維三路2號



















按下查詢後



















放大一點看看


























有了這些,你就可以申請到地政膽本。

2017年10月9日 星期一

[arduino] Arduino Nano 使用DFRobot LCD KeyPad Shield

首先介紹一下二個主角

  1. Arduino Nano
    1. 官方的說明 -->The Arduino Nano is a compact board similar to the UNO. (Arduino Nano是一塊類似於UNO的簡潔版)
      它的體型比較小,而且Analog Input有8支,比UNO多二支。

      資料及圖片來源:
      https://store.arduino.cc/usa/arduino-nano
  2. DFRobot LCD KeyPad Shield
    1. 這是一塊For UNO的擴充版,上面有一個1602LCD及幾個按鈕。
    2. 使用到的PIN如下表
      Analog 0是透過不同按鈕會輸出不同的電壓來分辨是那一個按鈕
       if (adc_key_in < 50)   return btnRIGHT;  
       if (adc_key_in < 250)  return btnUP; 
       if (adc_key_in < 450)  return btnDOWN; 
       if (adc_key_in < 650)  return btnLEFT; 
       if (adc_key_in < 850)  return btnSELECT;  
      Analog 0Button (select, up, right, down and left)
      Digital 4DB4
      Digital 5DB5
      Digital 6DB6
      Digital 7DB7
      Digital 8RS (Data or Signal Display Selection)
      Digital 9Enable
      Digital 10Backlit Control
              我們依照以上接腳定義,將其接上nano的D4~D10即可使用1602LCD的功能。