佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 2446|回复: 46

16F84A

[复制链接]
发表于 14-10-2007 05:06 PM | 显示全部楼层 |阅读模式
各位:

大家好。。!! 想请问。。 

1.ASM 写 90 和 60 分钟的DELAY 16F 84A microcontroller 做到吗? 该怎么写??
2.HardwarePart RESET 的部分我参考了几个Circuit 到底哪个比较好?我需要用到RESET Button

        A.Datasheetpg26)的Circuit
                ·没给正确的Component Value 该怎样才知道正确的Value呢?
        B.Parallel 4.7 uF E-Cap Push Button switch. 然后去Vcc
        C.Series Resistor (10k) Push Button switch
                ·RPB之间的Point接去Pin4R的另一头接Vcc PB的另一头接GND
        D.Parallel Diode=1N4148 和R1=0Ohm SeriesE-cap0.1uF.
                ·Diode –VE 和 R1Vcc
                ·Diode VeR1EcapVEPin4
                ·E-capVEGND


3.ICSP 所用到的Pin 同时也有其他Connection 对整个Circiut会有影响吗?

希望各位能解答我的疑问..

谢谢..!!

[ 本帖最后由 PenBrush 于 14-10-2007 05:57 PM 编辑 ]
回复

使用道具 举报


ADVERTISEMENT

发表于 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 | 显示全部楼层

回复 #2 rothmans 的帖子

我做到5分钟的DELAY但是60分钟的还不能。。
回复

使用道具 举报

发表于 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的贴还有其他问题.
希望各位能解答我的疑问..

请放电路。
回复

使用道具 举报

Follow Us
发表于 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.Datasheetpg26)的Circuit
                ·没给正确的Component Value 该怎样才知道正确的Value呢?
        B.Parallel 4.7 uF E-Cap Push Button switch. 然后去Vcc
        C.Series Resistor (10k) Push Button switch
                ·RPB之间的Point接去Pin4R的另一头接Vcc PB的另一头接GND
        D.Parallel Diode=1N4148 和R1=0Ohm SeriesE-cap0.1uF.
                ·Diode –VE 和 R1Vcc
                ·Diode VeR1EcapVEPin4
                ·E-capVEGND


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 画,很乱不能放上来。

非常抱歉!
回复

使用道具 举报


ADVERTISEMENT

发表于 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在浪费时间, 它就是等, 什么也不干。


  1. #include <16F628A.H>
  2. #fuses  HS,PROTECT,nolvp,WDT,nomclr,nobrownout
  3. #use delay(clock=20000000)
  4. void main()
  5. {
  6. int i;
  7.    while(1)
  8.    {
  9.       /////////////////////////////   
  10.       // Delay 60 min
  11.       for (i=0;i<60;i++)
  12.       {
  13.          delay_ms(60000); // 60 Sec, 1 minute
  14.       }
  15.    }
  16. }
复制代码
  1.                ROM used: 46 words (2%)
  2.                          Largest free fragment is 2002
  3.                RAM used: 8 (4%) at main() level
  4.                          9 (4%) worst case
  5.                Stack:    1 locations
  6. *
  7. 0000:  MOVLW  00
  8. 0001:  MOVWF  0A
  9. 0002:  GOTO   018
  10. 0003:  NOP
  11. .................... #include <16F628A.H>
  12. .................... //////// Standard Header file for the PIC16F628A device ////////////////
  13. .................... #device PIC16F628A
  14. .................... #list
  15. ....................  
  16. .................... #fuses  HS,PROTECT,nolvp,WDT,nomclr,nobrownout
  17. .................... #use delay(clock=20000000)
  18. 0004:  MOVLW  23
  19. 0005:  MOVWF  04
  20. 0006:  BCF    03.7
  21. 0007:  MOVF   00,W
  22. 0008:  BTFSC  03.2
  23. 0009:  GOTO   017
  24. 000A:  MOVLW  06
  25. 000B:  MOVWF  78
  26. 000C:  CLRF   77
  27. 000D:  DECFSZ 77,F
  28. 000E:  GOTO   00D
  29. 000F:  DECFSZ 78,F
  30. 0010:  GOTO   00C
  31. 0011:  MOVLW  7B
  32. 0012:  MOVWF  77
  33. 0013:  DECFSZ 77,F
  34. 0014:  GOTO   013
  35. 0015:  DECFSZ 00,F
  36. 0016:  GOTO   00A
  37. 0017:  GOTO   028 (RETURN)
  38. ....................  
  39. .................... void main()
  40. .................... {
  41. 0018:  CLRF   04
  42. 0019:  BCF    03.7
  43. 001A:  MOVLW  1F
  44. 001B:  ANDWF  03,F
  45. 001C:  MOVLW  07
  46. 001D:  MOVWF  1F
  47. .................... int i;
  48. ....................  
  49. ....................    while(1)
  50. ....................    {
  51. ....................       // Delay 60 min
  52. ....................       for (i=0;i<60;i++)
  53. 001E:  CLRF   21
  54. 001F:  MOVF   21,W
  55. 0020:  SUBLW  3B
  56. 0021:  BTFSS  03.0
  57. 0022:  GOTO   02C
  58. ....................       {
  59. ....................          delay_ms(60000); // 60 Sec, 1 minute
  60. 0023:  MOVLW  F0
  61. 0024:  MOVWF  22
  62. 0025:  MOVLW  FA
  63. 0026:  MOVWF  23
  64. 0027:  GOTO   004
  65. 0028:  DECFSZ 22,F
  66. 0029:  GOTO   025
  67. ....................       }
  68. 002A:  INCF   21,F
  69. 002B:  GOTO   01F
  70. ....................    }
  71. 002C:  GOTO   01E
  72. ....................  
  73. ....................  
  74. .................... }
  75. 002D:  SLEEP
  76. Configuration Fuses:
  77.    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 | 显示全部楼层

回复 #13 pic 的帖子

为什么呢? 那就是算到9 不就少算一次了吗?
回复

使用道具 举报

发表于 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);}
        
}
回复

使用道具 举报


ADVERTISEMENT

发表于 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写得怪怪的。。。。
  1. void main()
  2. {
  3. // Set Tris ,可以不用set,因为 C compiler 会帮你自动Set
  4. //    set_tris_a(0b11111011);            //PORTA; 1=input 0=output
  5. //    set_tris_b(0b10000000);            //portB; 1=input 0=output
  6.    
  7.     while(true)
  8.     {
  9.        if (input(STH)) //  或 if (input(STH)==1)
  10.        {
  11.          output_high(FAN);
  12.          output_high(COMP);
  13.        }
  14.        else
  15.        {
  16.          output_low(FAN);
  17.          output_low(COMP);
  18.        }


  19.        if (input(CTH))   // 或 if (input(CTH)==1)
  20.        {
  21.          output_low(UV);
  22.        }
  23.        else
  24.        {
  25.          output_high(UV);
  26.        }
  27.     }
  28. }
复制代码



修正: While() ---》 While(1) 或 While(True)

[ 本帖最后由 pic 于 30-10-2007 10:21 AM 编辑 ]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 25-12-2024 12:35 AM , Processed in 0.218870 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表