|
各位:
大家好。。!! 想请问。。
1.ASM 写 90 和 60 分钟的DELAY 16F 84A microcontroller 做到吗? 该怎么写??
2.HardwarePart RESET 的部分我参考了几个Circuit 到底哪个比较好?我需要用到RESET Button
A.Datasheet(pg26)的Circuit。
·没给正确的Component Value 该怎样才知道正确的Value呢?
B.Parallel 4.7 uF E-Cap 和Push Button switch. 然后去Vcc。
C.Series Resistor (10k) 和Push Button switch.
·R和PB之间的Point接去Pin4,R的另一头接Vcc PB的另一头接GND.
D.Parallel Diode=1N4148 和R1=0Ohm 再SeriesE-cap=0.1uF.
·Diode –VE 和 R1接Vcc
·Diode =Ve,R1和Ecap=VE接Pin4
·E-cap-VE接GND
3.ICSP 所用到的Pin 同时也有其他Connection 对整个Circiut会有影响吗?
希望各位能解答我的疑问..
谢谢..!!
[ 本帖最后由 PenBrush 于 14-10-2007 05:57 PM 编辑 ] |
|
|
|
|
|
|
|
发表于 14-10-2007 05:16 PM
|
显示全部楼层
原帖由 PenBrush 于 14-10-2007 05:06 PM 发表
各位:
大家好。。!! 想请问。。 用 ASM 写 90 和 60 分钟的DELAY
16F 84A microcontroller 做到吗?
一般地说不论哪内 mcu 都能用来做时间延迟, 看你是要用指令当延迟或是用内置时钟延迟。 |
|
|
|
|
|
|
|
楼主 |
发表于 14-10-2007 05:59 PM
|
显示全部楼层
|
|
|
|
|
|
|
发表于 14-10-2007 06:56 PM
|
显示全部楼层
原帖由 PenBrush 于 14-10-2007 05:59 PM 发表
我做到5分钟的DELAY但是60分钟的还不能。。
12个5分钟的DELAY就是60分钟。 |
|
|
|
|
|
|
|
楼主 |
发表于 14-10-2007 09:31 PM
|
显示全部楼层
回复 #4 pic 的帖子
谢谢..
我再试做看.
其实我在#1的贴还有其他问题.
希望各位能解答我的疑问.. |
|
|
|
|
|
|
|
发表于 14-10-2007 11:14 PM
|
显示全部楼层
原帖由 PenBrush 于 14-10-2007 09:31 PM 发表
谢谢..
我再试做看.
为什么不用C而用ASM呢?
还有, 不要用16F84A, 改用16F628A。
其实我在#1的贴还有其他问题.
希望各位能解答我的疑问..
请放电路。 |
|
|
|
|
|
|
|
发表于 14-10-2007 11:15 PM
|
显示全部楼层
原帖由 PenBrush 于 14-10-2007 09:31 PM 发表
谢谢..
我再试做看.
其实我在#1的贴还有其他问题.
希望各位能解答我的疑问..
1.ASM 写 90 和 60 分钟的DELAY 16F 84A microcontroller 做到吗? 该怎么写??
2.HardwarePart RESET 的部分我参考了几个Circuit 到底哪个比较好?我需要用到RESET Button
A.Datasheet(pg26)的Circuit。
·没给正确的Component Value 该怎样才知道正确的Value呢?
B.Parallel 4.7 uF E-Cap 和Push Button switch. 然后去Vcc。
C.Series Resistor (10k) 和Push Button switch.
·R和PB之间的Point接去Pin4,R的另一头接Vcc PB的另一头接GND.
D.Parallel Diode=1N4148 和R1=0Ohm 再SeriesE-cap=0.1uF.
·Diode –VE 和 R1接Vcc
·Diode =Ve,R1和Ecap=VE接Pin4
·E-cap-VE接GND
3.ICSP 所用到的Pin 同时也有其他Connection 对整个Circiut会有影响吗?
·没给正确的Component Value 该怎样才知道正确的Value呢?..
第二十六页的NOTE-1.已经告诉你了(External Power-on Reset circuit is required only if VDD power-up rate is too slow).
如果你需要手动复位,只须根据第二十六页的图,再加上一个switch 与 C 并连。 个人建议 R=10k, C=4.7uF,R1 = 100~1k ohm.
Diode D =IN4148.
当 ICSP 脚有其他功能是是会影响Programming的,视状况而定,不晓得你的接法,无法断言。请提供参考。 |
|
|
|
|
|
|
|
楼主 |
发表于 28-10-2007 01:15 AM
|
显示全部楼层
其实我是想要做一个trainerkit 给自己学写PIC Program , 最近工作很忙没时间做了,电路图也是用手画得还没用Protel 画,很乱不能放上来。
非常抱歉! |
|
|
|
|
|
|
|
发表于 28-10-2007 01:40 AM
|
显示全部楼层
原帖由 PenBrush 于 28-10-2007 01:15 AM 发表
其实我是想要做一个trainerkit 给自己学写PIC Program , 最近工作很忙没时间做了,电路图也是用手画得还没用Protel 画,很乱不能放上来。
非常抱歉!
我有一个提议,制作learning kit 的话,选脚位多的比较好用。不要用 PIC16F84 啦!这颗太过单纯了。 |
|
|
|
|
|
|
|
发表于 28-10-2007 09:33 AM
|
显示全部楼层
原帖由 PenBrush 于 28-10-2007 01:15 AM 发表
其实我是想要做一个trainerkit 给自己学写PIC Program , 最近工作很忙没时间做了,电路图也是用手画得还没用Protel 画,很乱不能放上来。
非常抱歉!
原来如此。。。
初学者最好跳过ASM, 直接学C。
CCS C 是目前最好, 最强的 C Compiler。
那几时学, 要不要学ASM呢? 在有需要的时候, 我们明白它就可以了, 不需要精通的。
比如要delay 60 分钟,下面是其中一种简单的做法,MCU在浪费时间, 它就是等, 什么也不干。
- #include <16F628A.H>
- #fuses HS,PROTECT,nolvp,WDT,nomclr,nobrownout
- #use delay(clock=20000000)
- void main()
- {
- int i;
- while(1)
- {
- /////////////////////////////
- // Delay 60 min
- for (i=0;i<60;i++)
- {
- delay_ms(60000); // 60 Sec, 1 minute
- }
- }
- }
复制代码- ROM used: 46 words (2%)
- Largest free fragment is 2002
- RAM used: 8 (4%) at main() level
- 9 (4%) worst case
- Stack: 1 locations
- *
- 0000: MOVLW 00
- 0001: MOVWF 0A
- 0002: GOTO 018
- 0003: NOP
- .................... #include <16F628A.H>
- .................... //////// Standard Header file for the PIC16F628A device ////////////////
- .................... #device PIC16F628A
- .................... #list
- ....................
- .................... #fuses HS,PROTECT,nolvp,WDT,nomclr,nobrownout
- .................... #use delay(clock=20000000)
- 0004: MOVLW 23
- 0005: MOVWF 04
- 0006: BCF 03.7
- 0007: MOVF 00,W
- 0008: BTFSC 03.2
- 0009: GOTO 017
- 000A: MOVLW 06
- 000B: MOVWF 78
- 000C: CLRF 77
- 000D: DECFSZ 77,F
- 000E: GOTO 00D
- 000F: DECFSZ 78,F
- 0010: GOTO 00C
- 0011: MOVLW 7B
- 0012: MOVWF 77
- 0013: DECFSZ 77,F
- 0014: GOTO 013
- 0015: DECFSZ 00,F
- 0016: GOTO 00A
- 0017: GOTO 028 (RETURN)
- ....................
- .................... void main()
- .................... {
- 0018: CLRF 04
- 0019: BCF 03.7
- 001A: MOVLW 1F
- 001B: ANDWF 03,F
- 001C: MOVLW 07
- 001D: MOVWF 1F
- .................... int i;
- ....................
- .................... while(1)
- .................... {
- .................... // Delay 60 min
- .................... for (i=0;i<60;i++)
- 001E: CLRF 21
- 001F: MOVF 21,W
- 0020: SUBLW 3B
- 0021: BTFSS 03.0
- 0022: GOTO 02C
- .................... {
- .................... delay_ms(60000); // 60 Sec, 1 minute
- 0023: MOVLW F0
- 0024: MOVWF 22
- 0025: MOVLW FA
- 0026: MOVWF 23
- 0027: GOTO 004
- 0028: DECFSZ 22,F
- 0029: GOTO 025
- .................... }
- 002A: INCF 21,F
- 002B: GOTO 01F
- .................... }
- 002C: GOTO 01E
- ....................
- ....................
- .................... }
- 002D: SLEEP
- Configuration Fuses:
- Word 1: 1F06 HS WDT PUT PROTECT NOBROWNOUT NOMCLR NOLVP NOCPD
复制代码
[ 本帖最后由 pic 于 28-10-2007 09:36 AM 编辑 ] |
|
|
|
|
|
|
|
楼主 |
发表于 28-10-2007 06:43 PM
|
显示全部楼层
谢谢..!!
为什么用倒反的算法不能操作?想不通….
void TDelay_10s()
{
int i;
for(i=0;i<10;i++)
{delay_ms(1000);}
}//work*/
void TDelay_10s()
{
int i;
for(i=10;i<0;i--)
{delay_ms(1000);}
}//not work
void TDelay_1s()
{
int dcnt0,dcnt1,dcnt2,dcnt3;
#locate dcnt0=0x80
#locate dcnt1=0x81
#locate dcnt2=0x82
#locate dcnt3=0x83
#asm
Dly1s: movlw 0x64 ; Load WREG with "100"
movwf dcnt2 ; Move WREG to F, dcnt2 at 0x82
db1: movlw 0x64 ; Load WREG with "100"
movwf dcnt1 ; Move WREG to f, dcnt1 at 0x81
db2: movlw 0x19 ; Load WREG with "25"
movwf dcnt0 ; Move WREG to f, dcnt0 at 0x80
db3: decfsz dcnt0,1
goto db3
decfsz dcnt1,1
goto db2
decfsz dcnt2,1
goto db1
return
#endasm
}//not work also
[ 本帖最后由 PenBrush 于 28-10-2007 07:01 PM 编辑 ] |
|
|
|
|
|
|
|
楼主 |
发表于 28-10-2007 06:58 PM
|
显示全部楼层
什么时候学。。。。一有时间就会看看论坛。。读datasheet 和CCSC user manual 可是我对 C programming =0 很多读了也不知是什么。。。所以就用实习来学习。。。很高兴program终于没error了。但是却不跟我所明白的sequence走。
我想要做的TrainerKit 是能用在16F877A / 16F84A / 16F628 / 16F72 的。用Switches 把PIC Switch 去适当的电路。
ASM 嘛。。是因为我会一点点。。。以前有念过 |
|
|
|
|
|
|
|
发表于 28-10-2007 06:58 PM
|
显示全部楼层
原帖由 PenBrush 于 28-10-2007 06:43 PM 发表
谢谢..!!
为什么用倒反的算法不能操作?想不通….
void TDelay_10s()
{
int i;
for(i=10;i>0;i--)
{delay_ms(1000);}
}//可以的。 |
|
|
|
|
|
|
|
楼主 |
发表于 28-10-2007 07:03 PM
|
显示全部楼层
|
|
|
|
|
|
|
发表于 28-10-2007 07:04 PM
|
显示全部楼层
原帖由 PenBrush 于 28-10-2007 06:58 PM 发表
我想要做的TrainerKit 是能用在16F877A / 16F84A / 16F628 / 16F72 的。用Switches 把PIC Switch 去适当的电路。
你要做traning-kit?
建议你专心在16F877A 就好了。 |
|
|
|
|
|
|
|
发表于 28-10-2007 07:14 PM
|
显示全部楼层
原帖由 PenBrush 于 28-10-2007 07:03 PM 发表
为什么呢? 那就是算到9 不就少算一次了吗?
也可以:
void TDelay_10s()
{
signed int i;
for(i=10;i>=0;i--)
{delay_ms(1000);}
} |
|
|
|
|
|
|
|
发表于 28-10-2007 07:53 PM
|
显示全部楼层
原帖由 PenBrush 于 28-10-2007 07:03 PM 发表
为什么呢? 那就是算到9 不就少算一次了吗?
你可知道 for loop 的运算方式。从10 到 1 是多少呢?就是 算 10 次咯!。在第一次运算,当 10 〉0 时,就减一次,明白吗?大致上是这么说,如果不明白,你最好多练习下习题。光问不练,是没有成绩的。不好意思,我并不太会解释。因为学习编程的最好方法是多练习。有些东西很难言传,只能意会。 |
|
|
|
|
|
|
|
楼主 |
发表于 29-10-2007 12:10 AM
|
显示全部楼层
谢谢.....想通了...
但是...我还有其他问题...迟些再问....
楼上的大哥…谢谢你也给了我很多指导
我在练习了…需要时间嘛… |
|
|
|
|
|
|
|
楼主 |
发表于 29-10-2007 01:12 PM
|
显示全部楼层
void main()
{
set_tris_a(0b11111011); //PORTA; 1=input 0=output
set_tris_b(0b10000000); //portB; 1=input 0=output
while(1)
{
goto AA;
AA: w=input(STH);
if (w==1)
{output_high(FAN);
output_high(COMP);} //ok
goto BB;
else
{output_low(FAN);
output_low(COMP);} //ok
goto BB;
BB: x=input(CTH);
if (x==1)
{output_low(UV);}
goto AA;
else
{output_high(UV);}
goto AA;
}
}
Line 137(1,5): A numeric expression must appear here
Line 149(1,5): A numeric expression must appear here
2 Errors, 1 Warnings.
为什么Errors呢?问题.??
i found the problem and solve it already.tQ!!
[ 本帖最后由 PenBrush 于 29-10-2007 05:35 PM 编辑 ] |
|
|
|
|
|
|
|
发表于 29-10-2007 10:42 PM
|
显示全部楼层
你的C写得怪怪的。。。。- void main()
- {
- // Set Tris ,可以不用set,因为 C compiler 会帮你自动Set
- // set_tris_a(0b11111011); //PORTA; 1=input 0=output
- // set_tris_b(0b10000000); //portB; 1=input 0=output
-
- while(true)
- {
- if (input(STH)) // 或 if (input(STH)==1)
- {
- output_high(FAN);
- output_high(COMP);
- }
- else
- {
- output_low(FAN);
- output_low(COMP);
- }
- if (input(CTH)) // 或 if (input(CTH)==1)
- {
- output_low(UV);
- }
- else
- {
- output_high(UV);
- }
- }
- }
复制代码
修正: While() ---》 While(1) 或 While(True)
[ 本帖最后由 pic 于 30-10-2007 10:21 AM 编辑 ] |
|
|
|
|
|
|
| |
本周最热论坛帖子
|