痞酷網_PIGOO

 找回密碼
 立即註冊
!!! [系統偵測到廣告阻擋軟體] !!!

如果您覺得痞酷網對您有些許幫助,或者您認同痞酷網的理想,

那麼希望您將痞酷網設定為白名單.

並請在上論壇的時候,動動您的手指,用行動支持我們.

謝謝!
12
返回列表 發新帖
樓主: lotor

請問如何開始學單晶片 c 語言?

  [複製鏈接]
發表於 2012-2-25 16:50:53 | 顯示全部樓層
lotor 發表於 2012-2-25 11:02 AM static/image/common/back.gif
MPS430資料建議看原廠英文版,不要看翻譯的,那我不只呆了還傻了,我是菜英文一族的新手耶!
燃眉之急是希 ...

我英文程度也不好,至少沒辦法看英文報章雜誌,也無法以英文對話,
但看原文硬體Data Sheet卻沒問題,這跟英文程度沒有直接關係。
找英文系的來看data Sheet也是看得霧煞煞的,有人更是將「high current driver」
翻譯成「高電流磁碟機」,目前yahoo字典則翻譯成「高電流司機」。

若是8051系列,中文參考書籍非常多,不必管原廠Data Sheet是可以的,
但MPS430內部結構不是普通的複雜,中文參考書籍也不若51系列那麼多,
所以MPS430還是以原廠Data Sheet為準才是根本之道......

先苦一點慢慢看,勤查字典,專業術語就那幾個,進入狀況後其實沒想像中那麼難。

 樓主| 發表於 2012-2-25 19:27:25 | 顯示全部樓層
ysc 發表於 2012-2-25 04:50 PM static/image/common/back.gif
我英文程度也不好,至少沒辦法看英文報章雜誌,也無法以英文對話,
但看原文硬體Data Sheet卻沒問題,這 ...

先苦一點慢慢看,勤查字典,專業術語就那幾個,進入狀況後其實沒想像中那麼難。
很中肯的激勵!n_016|
 樓主| 發表於 2012-2-25 19:33:07 | 顯示全部樓層
xiaolaba 發表於 2012-2-25 01:53 PM static/image/common/back.gif
你要對照看的disassembly的話, C COMPILER要用直譯, 不要開啟 [優化 OPTIMISATION]
COMPILER還可以選擇保 ...

這個真的不容易,只好翻譯+猜測機率+土法煉鋼試試!:sam31
 樓主| 發表於 2012-2-26 11:04:59 | 顯示全部樓層
請教這是該如何解釋?謝謝!剛下第一步就撞牆了n_144|
#define   uchar   unsigned char        //這是定義什麼?       
#define   uint    unsigned int        //這是定義什麼?但怎麼不用定義disp_data 暫存器是哪個位置。
#define disp_data  P5OUT        //這是定義 P5OUT 輸出值為 disp_data 的值 ?但怎麼不用定義disp_data 暫存器是哪個位置。
#define dig P4OUT        //這是定義 P4OUT 輸出值為 dig 的值 ?但怎麼不用定義disp_data 暫存器是哪個位置。
       
#define t_3ms5  2300        //這是定義什麼 ?
#define t_1ms   666        //這是定義什麼 ?
uchar get_code[4] = {0};        //這是什麼 ?
uchar dat_code=0;        //這是什麼 ?
uint  timer;        //這是什麼 ?
發表於 2012-2-26 14:35:42 | 顯示全部樓層
本帖最後由 ysc 於 2012-2-26 03:06 PM 編輯
lotor 發表於 2012-2-26 11:04 AM static/image/common/back.gif
請教這是該如何解釋?謝謝!剛下第一步就撞牆了
#define   uchar   unsigned char        //這是定義什麼 ...

這些宣告在C語言裡算是最基礎的,
請詳讀您所使用的C編譯器說明文件,在文件裡應該都有清楚交代,
特別注意保留字(Reserved word)與變數宣告。
發表於 2012-2-26 15:42:54 | 顯示全部樓層
本帖最後由 xiaolaba 於 2012-2-26 03:45 PM 編輯
lotor 發表於 2012-2-26 11:04 AM static/image/common/back.gif
請教這是該如何解釋?謝謝!剛下第一步就撞牆了
#define   uchar   unsigned char        //這是定義什麼 ...


既然帶著實例來問, 那俺就嘗試用你寫的做一部分小小的解釋
例如第一句

#define   uchar   unsigned char        //這是定義什麼?

你要理解的是 unsigned char

C 有基本定義, char = 8 bit, 你會 ASM, 應該可以理解

unsigned, 表示沒有負號的數, 好像是所有電腦語言寫碼都要明白的.
8 bit 如何比表示正負數或整數, 範圍是哪裡到哪裡, 你會 ASM, 應該也可以理解, 不理解的話那ASM還沒入門, 先去研讀一下.

如果理解了何謂 unsigned char, 那整句的話就不難理解, 俺個人理解如下-
因為人都是懶惰的, 所以希望寫碼時會儘量少打字

那麼對這個 #define   uchar   Unsigned Char 整句的意思是,
有人看到, 每次定義一個 8 bit 無符號數值時, 都要打很多字 (Unsigned Char),
因此 用他希望用 U + Char = uchar, 代表 Unsigned Char, 以減少打字數量.

所以, 他就就寫了那麼一句
#define   uchar   unsigned char

所以有了後面那句
uchar dat_code=0;

能看得明白就入門了, 跟 ASM 差不多吧..

評分

1

查看全部評分

 樓主| 發表於 2012-2-26 16:05:48 | 顯示全部樓層
ysc 發表於 2012-2-26 02:35 PM static/image/common/back.gif
這些宣告在C語言裡算是最基礎的,
請詳讀您所使用的C編譯器說明文件,在文件裡應該都有清楚交代,
特別注 ...

ysc 大,我的C編譯器是 IAR ,請問這說明文件是 HELP 裡眾多說明內嗎?還是連結外部程序宣告的說明文件?
茫茫大海搞不清方向,偏偏又是個半文盲n_074|
請問這是怎麼了!這有連結錯誤ㄚ!但是 list 檔沒有錯誤!怎麼了?

抓圖.jpg

Error[e16]: Segment RESET (size: 0x2 align: 0x1) is too long for segment definition. At least 0x2 more bytes needed.
The problem occurred while processing the segment placement command "-Z(CODE)RESET=FFFE-FFFF", where at the moment
of placement the available memory ranges were "-none-"
   Reserved ranges relevant to this placement:  fffe-ffff  Absolute code from ir
Error while running Linker

:sam30
 樓主| 發表於 2012-2-26 16:29:16 | 顯示全部樓層
xiaolaba 發表於 2012-2-26 03:42 PM static/image/common/back.gif
既然帶著實例來問, 那俺就嘗試用你寫的做一部分小小的解釋
例如第一句

xiaolaba大,這簡單的說就是//宣告運算值為8 bit無借位的整數,最小值為0的意思嗎?如asm的
dat   equ    0x10h
.
.
   clrc
   sub   dat,a
.
.
   mov  a,dat  ;;dat=unsigned
是嗎?n_078|


發表於 2012-2-26 16:43:26 | 顯示全部樓層
本帖最後由 s10274chen 於 2012-2-26 04:48 PM 編輯
lotor 發表於 2012-2-26 11:04 AM static/image/common/back.gif
請教這是該如何解釋?謝謝!剛下第一步就撞牆了
#define   uchar   unsigned char        //這是定義什麼 ...


#define這寫您想成重定義,例如#define   uchar   unsigned char就是把unsigned char變數型態重定義成uchar,這樣其實對程式結構是沒有改變,當您寫uchar時,compiler會把它當成unsigned char來處理,而對您在coding時,是方便識別您一些東西。
#define disp_data  P5OUT 這又是不同的感覺,P5OUT應該是指IO的暫存器,但寫P5OUT實在很難讓人看的懂成是在幹什麼,因此將它重定為disp_data ,方便您觀看撰寫程式。
#define t_3ms5  2300 這則是將常數定義,也是方便識別,把2300這樣的常數定義為t_3ms5,當您在某些程式段落中,要塞入2300這個數值,如果程式中出現很多要2300這個數值,當您想要異動這個數值時,並非使用這樣去重定義,每的地方都寫2300,我想會改到抓狂,因此用了這樣常數定義,只要很方便地去改定義的數值這樣就全改完了。
uchar get_code[4] = {0};     這是指宣告一個uchar型態的陣列,陣列元素有4個,且設初值為0
uchar dat_code=0;        這則是宣告一個uchar型態變數且設值為0
uint  timer;        這就....應該知道了.....

您那在link的時候發生錯誤可能是專案的設定有地方有問題.....
http://bbs.lierda.com/archive/index.php/t-14624.html
http://yaoguangle.blog.sohu.com/85479183.html
http://xmfreet.spaces.eaw.com.cn/articles/article/item/7700
 樓主| 發表於 2012-2-26 17:16:27 | 顯示全部樓層
s10274chen 發表於 2012-2-26 04:43 PM static/image/common/back.gif
#define這寫您想成重定義,例如#define   uchar   unsigned char就是把unsigned char變數型態重定義成uch ...

#define disp_data  P5OUT 若以asm解釋為 disp_data  equ  P5OUT 是嗎?
#define t_3ms5  2300 若以asm解釋為 t_3ms5  equ  08fch 是嗎?
uchar get_code[4] = {0}; 若以asm解釋為 get_code equ  (r12 to r15), (r12 to r15初值=0)  是嗎?
uchar dat_code=0若以asm解釋為 dat_code  equ  r12 (r12初值=0)是嗎?
uint  timer若以asm解釋為 timer 為16位元的正整數是嗎?
n_078|感謝各高手不吝指教!
 樓主| 發表於 2012-2-26 23:03:14 | 顯示全部樓層
燃眉之急是希望能有高手幫忙,我現有 c 語言範例﹝約100行內﹞,翻譯成組合語言的相同內容,兩種都能有詳細中文註解,期待高手出手報價請進→f74879@yahoo.com.tw:sam17
發表於 2012-2-27 08:17:20 | 顯示全部樓層
lotor 發表於 2012-2-26 05:16 PM static/image/common/back.gif
#define disp_data  P5OUT 若以asm解釋為 disp_data  equ  P5OUT 是嗎?
#define t_3ms5  2300 若以asm解 ...

#define那些好像不是equ,因為#define這是要給compiler看的,在轉成組合中,不會看到。
哈!說真的,我忘光組合語言了.....
後面幾個看起來我是覺得對的。
uint是16 bits無號整數沒錯。
用C寫又是另一種思維了。
發表於 2012-2-27 11:28:23 | 顯示全部樓層
建議還是不要用ASM去思考C的作法
即使用ASM去寫個2-3千行的程式再C去重寫一遍,也沒有人去用這種方式來說的
我想就算是燃眉之急,只要你想以後用C去作業
還是先將書本的第1,2章完全先看幾遍比較實際吧
#define disp_data  P5OUT  應該是定義一個變數叫disp_data他是使用P5OUT,P5OUT看起來比較像是P5這個輸出PORT,這個應該要看include進來的.H檔定義,就像ASM中有.INC檔定義一樣
#define t_3ms5  2300  應該是定義t_3ms5(猜測是時間參數)為2300值
uchar get_code[4] = {0} 應該是定義get_code的取得字碼陣列初始值都是零
uchar dat_code=0   定義dat_code應是一個資料碼的初始為零
C的好處是變數定義都是有義意的,因為作者自己來定義的,所以上面這些由變數名大都可以看出用途
因為換成是自己也大概都是這樣定義的,還是一樣,先將書本的第1,2章完全先看幾遍比較實際吧
 樓主| 發表於 2012-2-27 17:02:35 | 顯示全部樓層
legion 發表於 2012-2-27 11:28 AM static/image/common/back.gif
建議還是不要用ASM去思考C的作法
即使用ASM去寫個2-3千行的程式再C去重寫一遍,也沒有人去用這種方式來說的
...

依目前看來還是先以ASM去學,至於 c 還是等【頭殼卡精光】解壓後再下功夫,一句話 c 『難啊!』。
以下幾個 msp430 ASM 指令請教,謝謝!

#define     length_1  R4
;;-----------------------------------------------------------------------------------
  mov.w   &TAR,&CCR0              ;把TAR/計數器的值存入CCR0比較/抓取暫存器 請問是嗎?

  sub.w   length_1,0(SP)          ;length_1 - SP 請問是什麼意思呢?

  cmp.w   #Start_1,0(SP)          ;#Start_1 與 0(SP)請問是請問什麼意思呢?

  incd.w  SP                      ;SP暫存器加 2 請問是什麼意思呢?

  mov.w   #GIE,0(SP)              ;把 #GIE 存入 0(SP) 請問是什麼意思呢?
;;------------------------------------------------------------------------------------
發表於 2012-2-27 20:31:40 | 顯示全部樓層
lotor 發表於 2012-2-25 07:33 PM static/image/common/back.gif
這個真的不容易,只好翻譯+猜測機率+土法煉鋼試試!

英文這檔的事以前也困擾我多年,我很想學究是有點懒,後來被公司逼急了(沒過就無法升等),於是好好的K一陣子約快一年吧!! 後來就不怕了!! 其實 工程上原文的專門術語"最可怕"因為同事幫不太上手,一個是自己揣摩,一個是問人,痞酷網許多熱心的前輩可以請教(有幫忙就叫做熱心)問題PO出來大都可以得到幫助,只要不是"存心一直靠別人"因為熱心的人們是"救急不救窮"的!!
發表於 2012-2-27 20:48:47 | 顯示全部樓層
s10274chen 發表於 2012-2-26 04:43 PM static/image/common/back.gif
#define這寫您想成重定義,例如#define   uchar   unsigned char就是把unsigned char變數型態重定義成uch ...

S10274CHEN大:
   解釋的非常清楚,可惜你在台中,要是在新竹我一定常常帶"珍奶"去找你問問題...
  我目前有一個問題想請教: 在程式上常常出現 #include "shengming.h"
#include "Num1632.h"
#include "HZ16.h"
#include "displaytime.h"
#include "MSP24064.h"
#include "nongli.h"
#include "DS1302.h"
#include "ds18b20.h"
#include "keydone.h"..
就是把許多小程式整合在一起,我到現在還不會如此整合!! 感覺上應該會比較簡潔 卻不知道應該在哪個地方把它結合在一起??? 可以幫忙釋疑嗎? 我的程式到目前都還是一條通!!
 樓主| 發表於 2012-2-27 21:05:07 | 顯示全部樓層
antlu 發表於 2012-2-27 08:31 PM static/image/common/back.gif
英文這檔的事以前也困擾我多年,我很想學究是有點懒,後來被公司逼急了(沒過就無法升等),於是好好的K一陣子 ...

antlu 大別誤會了,若是只"存心一直靠別人",那就不會要請高手傳授手藝,乾脆出個專題請人代勞就好了,也不用《絞汁》去學,謝謝指教!
再補個問題如下 PxSELn 這個參考資料太少搞不太懂,若n=0為一般i/o,若n=1為其他模組,那又要如何選擇哪個模組呢?
發表於 2012-2-27 22:11:54 | 顯示全部樓層
lotor 發表於 2012-2-27 09:05 PM static/image/common/back.gif
antlu 大別誤會了,若是只"存心一直靠別人",那就不會要請高手傳授手藝,乾脆出個專題請人代勞就好了,也 ...

我也是初學!!不懂!!
發表於 2012-2-28 19:48:10 | 顯示全部樓層
antlu 發表於 2012-2-27 08:48 PM static/image/common/back.gif
S10274CHEN大:
   解釋的非常清楚,可惜你在台中,要是在新竹我一定常常帶"珍奶"去找你問問題...
  我目前 ...

呵!謝謝阿乾大您的讚美,我是把我所理解的寫出來。
要做出那些標頭檔,您要先將您想要製作的副程式先整理好為一個c檔,然後再另開一個檔案為h檔去extern原本C檔那些副程式,而C檔要記得去include那個h檔,這樣就完成了,我理解的是這樣。不過有時候我偷懶,沒去特別整理這些C檔為h檔,都直接把有包含我要的副程式C檔包到程式的專案中,然後要call副程式的c檔程式前面去extern副程式。
下面是一個範例,我也是照抄模仿,用的環境是IAR。怕不同的compiler可能有些許差異。
test.rar (6.46 KB, 下載次數: 52)
發表於 2012-2-28 20:37:35 | 顯示全部樓層
s10274chen 發表於 2012-2-28 07:48 PM static/image/common/back.gif
呵!謝謝阿乾大您的讚美,我是把我所理解的寫出來。
要做出那些標頭檔,您要先將您想要製作的副程式先整 ...

s10274chen大:
    先下載下來看清楚,不懂的地方再請教!! 最近幾天 清晨4點起床5點坐車到台北(陪兒子考碩士) 還有 便宜買到一片 LCD240128 一直搞不出來(不顯示) ...
發表於 2012-3-5 16:50:34 | 顯示全部樓層
各位大大的金玉良言真有益
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

關閉

站長小叮嚀上一條 /1 下一條

禁閉室|手機版|連繫我們|痞酷網電子技術論壇

GMT+8, 2024-11-21 09:13 PM , Processed in 0.237110 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.