1125526801 发表于 2013-6-14 13:03:34

PIC16F1824有什么C编译器能用?

本帖最后由 1125526801 于 2013-6-15 09:24 编辑

PIC16F1824有什么C编译器能用?之前学习板上的单片机不一样是18F4520,用的MCC18。PIC16F1824是用PICC吗?





caoxuedong 发表于 2013-6-14 15:29:16

我用的PICC9.71A。

i55x 发表于 2013-6-14 15:31:09

XC8破解了谁还用PICC那个老掉牙的东西?

caoxuedong 发表于 2013-6-14 16:01:47

老不见得就不好,够用就可以了,不必盲目追高,新版编译器有可能BUG会多一些。

jlian168 发表于 2013-6-14 16:16:59

i55x 发表于 2013-6-14 15:31 static/image/common/back.gif
XC8破解了谁还用PICC那个老掉牙的东西?

Sir:

Where is the "XC8破解"?

Thank you.

1125526801 发表于 2013-6-14 18:16:22

本帖最后由 1125526801 于 2013-6-15 09:25 编辑

前辈们,PIC16F1824,帮忙给个流水灯程序吧。。。折腾了一天都没亮灯。。。。实然觉得学了几年STC白学了。。。。。。。。。


头文件PIC16F1824.h

1125526801 发表于 2013-6-14 18:37:35

本帖最后由 1125526801 于 2013-6-14 18:52 编辑


电路图。#include <pic16f1824.h>       //调用头文件,

//---------------------------------------
//名称: 主函数               
//-----------------------------------------
void main(void)
{       
        TRISA=0B00000000;       //RA设置为输出
        TRISC=0B00000000;           //RC设置为输出
        PORTC=0B00000000;       //RA的LED全亮
        PORTA=0B00000000;       //RC的LED全亮
}难道还要配置时钟?怎么配置?内部时钟。

millwood0 发表于 2013-6-14 21:30:22

难道还要配置时钟?怎么配置?内部时钟。

read the datasheet and then read the compiler manual.

no other way out.

millwood0 发表于 2013-6-14 21:30:51

谁还用PICC那个老掉牙的东西?

I do.      

miscell 发表于 2013-6-14 22:42:33

CCS也不错

yoyobbs 发表于 2013-6-14 22:46:23

一直使用PICC的路过.

yklstudent 发表于 2013-6-14 23:10:14

config1 config2需要配置的

1125526801 发表于 2013-6-15 09:15:16

millwood0 发表于 2013-6-14 21:30 static/image/common/back.gif
read the datasheet and then read the compiler manual.

no other way out.

ok,thank you

1125526801 发表于 2013-6-15 09:19:34

本帖最后由 1125526801 于 2013-6-15 09:38 编辑

yklstudent 发表于 2013-6-14 23:10 static/image/common/back.gif
config1 config2需要配置的

除了学习板上的18F4520我还没用过其它PIC单片机。装了XC8免费版后,才找到PIC16F1824.h头文件。发现照搬之前的时钟配置
config过来用不了。打开之前用的PIC.h和现在的PIC16F1824.h对比,差远了。。。。

时钟不知道怎么配置。在DEBUG状态LED是能亮了。拔了仿真,直接给电不会运行。

头文件的部分:// Register: OSCCON
extern volatile unsigned char         OSCCON            @ 0x099;
#ifndef _LIB_BUILD
asm("OSCCON equ 099h");
#endif
// bitfield definitions
typedef union {
    struct {
      unsigned SCS0                   :1;
      unsigned SCS1                   :1;
      unsigned                        :1;
      unsigned IRCF0                  :1;
      unsigned IRCF1                  :1;
      unsigned IRCF2                  :1;
      unsigned IRCF3                  :1;
      unsigned SPLLEN               :1;
    };
    struct {
      unsigned SCS                  :2;
      unsigned                        :1;
      unsigned IRCF                   :4;
    };
} OSCCONbits_t;
extern volatile OSCCONbits_t OSCCONbits @ 0x099;
// bitfield macros
#define _OSCCON_SCS0_POSN                                 0x0
#define _OSCCON_SCS0_POSITION                               0x0
#define _OSCCON_SCS0_SIZE                                 0x1
#define _OSCCON_SCS0_LENGTH                                 0x1
#define _OSCCON_SCS0_MASK                                 0x1
#define _OSCCON_SCS1_POSN                                 0x1
#define _OSCCON_SCS1_POSITION                               0x1
#define _OSCCON_SCS1_SIZE                                 0x1
#define _OSCCON_SCS1_LENGTH                                 0x1
#define _OSCCON_SCS1_MASK                                 0x2
#define _OSCCON_IRCF0_POSN                                  0x3
#define _OSCCON_IRCF0_POSITION                              0x3
#define _OSCCON_IRCF0_SIZE                                  0x1
#define _OSCCON_IRCF0_LENGTH                              0x1
#define _OSCCON_IRCF0_MASK                                  0x8
#define _OSCCON_IRCF1_POSN                                  0x4
#define _OSCCON_IRCF1_POSITION                              0x4
#define _OSCCON_IRCF1_SIZE                                  0x1
#define _OSCCON_IRCF1_LENGTH                              0x1
#define _OSCCON_IRCF1_MASK                                  0x10
#define _OSCCON_IRCF2_POSN                                  0x5
#define _OSCCON_IRCF2_POSITION                              0x5
#define _OSCCON_IRCF2_SIZE                                  0x1
#define _OSCCON_IRCF2_LENGTH                              0x1
#define _OSCCON_IRCF2_MASK                                  0x20
#define _OSCCON_IRCF3_POSN                                  0x6
#define _OSCCON_IRCF3_POSITION                              0x6
#define _OSCCON_IRCF3_SIZE                                  0x1
#define _OSCCON_IRCF3_LENGTH                              0x1
#define _OSCCON_IRCF3_MASK                                  0x40
#define _OSCCON_SPLLEN_POSN                                 0x7
#define _OSCCON_SPLLEN_POSITION                           0x7
#define _OSCCON_SPLLEN_SIZE                                 0x1
#define _OSCCON_SPLLEN_LENGTH                               0x1
#define _OSCCON_SPLLEN_MASK                                 0x80
#define _OSCCON_SCS_POSN                                    0x0
#define _OSCCON_SCS_POSITION                              0x0
#define _OSCCON_SCS_SIZE                                    0x2
#define _OSCCON_SCS_LENGTH                                  0x2
#define _OSCCON_SCS_MASK                                    0x3
#define _OSCCON_IRCF_POSN                                 0x3
#define _OSCCON_IRCF_POSITION                               0x3
#define _OSCCON_IRCF_SIZE                                 0x4
#define _OSCCON_IRCF_LENGTH                                 0x4
#define _OSCCON_IRCF_MASK                                 0x78

// Register: OSCSTAT
extern volatile unsigned char         OSCSTAT             @ 0x09A;
#ifndef _LIB_BUILD
asm("OSCSTAT equ 09Ah");
#endif
// bitfield definitions
typedef union {
    struct {
      unsigned HFIOFS               :1;
      unsigned LFIOFR               :1;
      unsigned MFIOFR               :1;
      unsigned HFIOFL               :1;
      unsigned HFIOFR               :1;
      unsigned OSTS                   :1;
      unsigned PLLR                   :1;
      unsigned T1OSCR               :1;
    };
} OSCSTATbits_t;
extern volatile OSCSTATbits_t OSCSTATbits @ 0x09A;
// bitfield macros
#define _OSCSTAT_HFIOFS_POSN                              0x0
#define _OSCSTAT_HFIOFS_POSITION                            0x0
#define _OSCSTAT_HFIOFS_SIZE                              0x1
#define _OSCSTAT_HFIOFS_LENGTH                              0x1
#define _OSCSTAT_HFIOFS_MASK                              0x1
#define _OSCSTAT_LFIOFR_POSN                              0x1
#define _OSCSTAT_LFIOFR_POSITION                            0x1
#define _OSCSTAT_LFIOFR_SIZE                              0x1
#define _OSCSTAT_LFIOFR_LENGTH                              0x1
#define _OSCSTAT_LFIOFR_MASK                              0x2
#define _OSCSTAT_MFIOFR_POSN                              0x2
#define _OSCSTAT_MFIOFR_POSITION                            0x2
#define _OSCSTAT_MFIOFR_SIZE                              0x1
#define _OSCSTAT_MFIOFR_LENGTH                              0x1
#define _OSCSTAT_MFIOFR_MASK                              0x4
#define _OSCSTAT_HFIOFL_POSN                              0x3
#define _OSCSTAT_HFIOFL_POSITION                            0x3
#define _OSCSTAT_HFIOFL_SIZE                              0x1
#define _OSCSTAT_HFIOFL_LENGTH                              0x1
#define _OSCSTAT_HFIOFL_MASK                              0x8
#define _OSCSTAT_HFIOFR_POSN                              0x4
#define _OSCSTAT_HFIOFR_POSITION                            0x4
#define _OSCSTAT_HFIOFR_SIZE                              0x1
#define _OSCSTAT_HFIOFR_LENGTH                              0x1
#define _OSCSTAT_HFIOFR_MASK                              0x10
#define _OSCSTAT_OSTS_POSN                                  0x5
#define _OSCSTAT_OSTS_POSITION                              0x5
#define _OSCSTAT_OSTS_SIZE                                  0x1
#define _OSCSTAT_OSTS_LENGTH                              0x1
#define _OSCSTAT_OSTS_MASK                                  0x20
#define _OSCSTAT_PLLR_POSN                                  0x6
#define _OSCSTAT_PLLR_POSITION                              0x6
#define _OSCSTAT_PLLR_SIZE                                  0x1
#define _OSCSTAT_PLLR_LENGTH                              0x1
#define _OSCSTAT_PLLR_MASK                                  0x40
#define _OSCSTAT_T1OSCR_POSN                              0x7
#define _OSCSTAT_T1OSCR_POSITION                            0x7
#define _OSCSTAT_T1OSCR_SIZE                              0x1
#define _OSCSTAT_T1OSCR_LENGTH                              0x1
#define _OSCSTAT_T1OSCR_MASK                              0x80

1125526801 发表于 2013-6-15 09:20:59

millwood0 发表于 2013-6-14 21:30 static/image/common/back.gif
I do.

me too.{:sweat:}

sun_changdong 发表于 2013-6-15 09:41:07

MPLAB应该可以!

xiongh 发表于 2013-6-15 10:18:31

本帖最后由 xiongh 于 2013-6-15 10:20 编辑

MPLAB X+ PICC挺好用。
#include "pic.h"
#include <htc.h>

__CONFIG(FOSC_INTOSC & WDTE_OFF & PWRTE_OFF & MCLRE_ON & CP_OFF & CPD_OFF & BOREN_OFF & CLKOUTEN_OFF & IESO_ON & FCMEN_OFF);
__CONFIG(WRT_OFF & PLLEN_ON & STVREN_ON & BORV_LO & LVP_OFF);

现在正在用PIC16F1824做项目,8路AD全用了,还有一路PWM。

1125526801 发表于 2013-6-15 12:38:31

xiongh 发表于 2013-6-15 10:18 static/image/common/back.gif
MPLAB X+ PICC挺好用。
#include "pic.h"
#include


好的,谢谢。我试试看。

1125526801 发表于 2013-6-15 12:42:36

xiongh 发表于 2013-6-15 10:18 static/image/common/back.gif
MPLAB X+ PICC挺好用。
#include "pic.h"
#include


#include <pic16f1824.h>       //调用头文件,
#include "pic.h"
#include <htc.h>

__CONFIG(FOSC_INTOSC & WDTE_OFF & PWRTE_OFF & MCLRE_ON & CP_OFF & CPD_OFF & BOREN_OFF & CLKOUTEN_OFF & IESO_ON & FCMEN_OFF);
__CONFIG(WRT_OFF & PLLEN_ON & STVREN_ON & BORV_LO & LVP_OFF);


编译不成功:
Build E:\PIC\PIC_1824E\PIC_1824E for device 16F1824
Using driver C:\Program Files (x86)\Microchip\xc8\v1.12\bin\xc8.exe

Make: The target "E:\PIC\PIC_1824E\main.p1" is up to date.
Executing: "C:\Program Files (x86)\Microchip\xc8\v1.12\bin\xc8.exe" -oPIC_1824E.cof -mPIC_1824E.map --summary=default,-psect,-class,+mem,-hex --output=default,-inhx032 main.p1 --chip=16F1824 "-IC:\Program Files (x86)\Microchip\xc8\v1.12\include" "-IC:\Program Files (x86)\HI-TECH Software\PICC\std\9.60\include" -P --runtime=default,+clear,+init,-keep,+osccal,-download,-resetbits,-stackcall,-config,+clib,+plib --opt=default,+asm,-debug,-speed,+space,9 --warn=0 -N255 -D__DEBUG=1 --debugger=pickit3 -Bsmall --double=32 --float=32 --addrqual=ignore -g --asmlist "--errformat=Error   [%n] %f; %l.%c %s" "--msgformat=Advisory[%n] %s" "--warnformat=Warning [%n] %f; %l.%c %s"
Microchip MPLAB XC8 C Compiler V1.12
Copyright (C) 2012 Microchip Technology Inc.
License type: Node Configuration

Warning ; . Omniscient Code Generation not available in Free mode
Error    C:\Users\guoliang\AppData\Local\Temp\ss2k.; 339. undefined symbol "FCMEN_OFF"
Error    C:\Users\guoliang\AppData\Local\Temp\ss2k.; 339. undefined symbol "IESO_ON"
Error    C:\Users\guoliang\AppData\Local\Temp\ss2k.; 339. undefined symbol "CLKOUTEN_OFF"
Error    C:\Users\guoliang\AppData\Local\Temp\ss2k.; 339. undefined symbol "BOREN_OFF"
Error    C:\Users\guoliang\AppData\Local\Temp\ss2k.; 339. undefined symbol "CPD_OFF"
Error    C:\Users\guoliang\AppData\Local\Temp\ss2k.; 339. undefined symbol "CP_OFF"
Error    C:\Users\guoliang\AppData\Local\Temp\ss2k.; 339. undefined symbol "MCLRE_ON"
Error    C:\Users\guoliang\AppData\Local\Temp\ss2k.; 339. undefined symbol "PWRTE_OFF"
Error    C:\Users\guoliang\AppData\Local\Temp\ss2k.; 339. undefined symbol "WDTE_OFF"
Error    C:\Users\guoliang\AppData\Local\Temp\ss2k.; 339. undefined symbol "FOSC_INTOSC"
Error    C:\Users\guoliang\AppData\Local\Temp\ss2k.; 343. undefined symbol "LVP_OFF"
Error    C:\Users\guoliang\AppData\Local\Temp\ss2k.; 343. undefined symbol "BORV_LO"
Error    C:\Users\guoliang\AppData\Local\Temp\ss2k.; 343. undefined symbol "STVREN_ON"
Error    C:\Users\guoliang\AppData\Local\Temp\ss2k.; 343. undefined symbol "PLLEN_ON"
Error    C:\Users\guoliang\AppData\Local\Temp\ss2k.; 343. undefined symbol "WRT_OFF"
(908) exit status = 1

********** Build failed! **********

1125526801 发表于 2013-6-15 13:59:39

本帖最后由 1125526801 于 2013-6-15 14:08 编辑

xiongh 发表于 2013-6-15 10:18 static/image/common/back.gif
MPLAB X+ PICC挺好用。
#include "pic.h"
#include
#include<pic.h>
__CONFIG(FOSC_INTOSC&WDTE_OFF&PWRTE_ON&MCLRE_OFF&CP_ON&CPD_OFF&BOREN_ON&CLKOUTEN_OFF&IESO_ON&FCMEN_ON);
__CONFIG(PLLEN_OFF&LVP_OFF) ;//将FOSC<2:0>:振荡器选择位设置成 INTOSC,
void init_fosc(void)
{
OSCCON = 0x70;//8MHZ IRCF<3:0>时钟频率选择位设置成8MHZ
}谢谢大家!终于找到个能用的了。。。不过暂时还不能理解。

1125526801 发表于 2013-6-15 14:08:15

xiongh 发表于 2013-6-15 10:18 static/image/common/back.gif
MPLAB X+ PICC挺好用。
#include "pic.h"
#include


就RA3的灯没亮,为啥子呢{:dizzy:}
#include<pic.h>
__CONFIG(FOSC_INTOSC&WDTE_OFF&PWRTE_ON&MCLRE_OFF&CP_ON&CPD_OFF&BOREN_ON&CLKOUTEN_OFF&IESO_ON&FCMEN_ON);
__CONFIG(PLLEN_OFF&LVP_OFF) ;//将FOSC<2:0>:振荡器选择位设置成 INTOSC,

void init_fosc(void)
{
OSCCON = 0x70;//8MHZ IRCF<3:0>时钟频率选择位设置成8MHZ
}


void delay500ms(void)   //误差 0us
{
    unsigned char a,b,c;
    for(c=20;c>0;c--)
      for(b=152;b>0;b--)
            for(a=7;a>0;a--);
}
//---------------------------------------
//名称: 主函数               
//-----------------------------------------
void main()
{       
        init_fosc();
        TRISA=0B00000000;       //RA设置为输出
        TRISC=0B00000000;           //RC设置为输出
        PORTC=0x00;       //RA的LED全不亮
        PORTA=0x00;       //RC的LED全不亮
        while(1)
        {
                PORTC=0x00;
                delay500ms();
                PORTC=0xff;
                delay500ms();
               
                PORTA=0x00;
                delay500ms();
                PORTA=0xff;
                delay500ms();

        }
}

xiongh 发表于 2013-6-15 15:28:00

本帖最后由 xiongh 于 2013-6-15 15:31 编辑

看手册:

12.2 PORTA 寄存器
PORTA 是一个6 位宽的双向端口。对应的数据方向寄存
器是TRISA(寄存器12-4)。将TRISA 某位置1(= 1)
时,会将PORTA 的相应引脚为输入(即,禁止输出
驱动器)。将TRISA 某位清零(= 0)时,会将PORTA
的相应引脚设为输出(即,使能输出驱动器并将输出锁
存器中的内容输出到选定的引脚)。RA3 是个例外,它仅
可作为输入引脚,其TRIS 位总是读为1。例12-1 显示
了如何初始化PORTA。

n0831 发表于 2013-6-15 22:13:29

楼上正解

1125526801 发表于 2013-6-20 17:31:27

xiongh 发表于 2013-6-15 15:28 static/image/common/back.gif
看手册:

12.2 PORTA 寄存器


好。谢谢!我再摸索一下。

1125526801 发表于 2013-6-20 18:48:23

本帖最后由 1125526801 于 2013-6-20 18:52 编辑

#include<pic.h>

__CONFIG(FOSC_INTOSC & WDTE_OFF & PWRTE_ON & MCLRE_OFF & CP_OFF & CPD_OFF & BOREN_ON & CLKOUTEN_OFF & IESO_ON & FCMEN_OFF);
__CONFIG(WRT_OFF & PLLEN_OFF & STVREN_ON & BORV_LO & LVP_OFF);//将FOSC<2:0>:振荡器选择位设置成 INTOSC,


void init_fosc(void)
{
OSCCON = 0x70;//8MHZ IRCF<3:0>时钟频率选择位设置成8MHZ
}


void delay500ms(void)   //误差 0us
{
    unsigned char a,b,c;
    for(c=20;c>0;c--)
      for(b=152;b>0;b--)
            for(a=7;a>0;a--);
}
//---------------------------------------
//名称: 主函数               
//-----------------------------------------
void main()
{       
        init_fosc();
       
        TRISA=0B00000000;       //RA设置为输出
        TRISC=0B00000000;           //RC设置为输出

        PORTA=0B00000000;        //初始化RA
        PORTC=0B00000000;        //初始化RC


        while(1)
        {
               RC2=1;
                delay500ms();
                RC1=1;
                delay500ms();       
        }
}
又出状况了。按理接在RC1和RC2的两个LED,应该是常亮的,可是实际他是交替闪。RC1=1时,RC2会自动变为0,什么情况???

一个IO置1,会让同一组的其它自动置0?试了下一如 RC2=1; RA1=1;,则不会互相影响。

caoxuedong 发表于 2013-6-20 21:01:49

估计应该是两个原因,一个是ANSELC寄存器,一个是硬件的问题。

1125526801 发表于 2013-6-20 22:49:54

xiongh 发表于 2013-6-15 15:28 static/image/common/back.gif
看手册:

12.2 PORTA 寄存器


        while(1)
        {
               RC0=1;
                delay500ms();
                  RC1=1;
                delay500ms();
                RC2=1;
                delay500ms();
                RC3=1;
                delay500ms();
                  RC4=1;
                delay500ms();
                RC5=1;
                delay500ms();       
               
                RA0=1;
                delay500ms();
                  RA1=1;
                delay500ms();
                RA2=1;
                delay500ms();
                RA3=1;
                delay500ms();
                  RA4=1;
                delay500ms();
                RA5=1;
                delay500ms();
        }只有RA5   RC4    RC5,是一直亮的,RA0~4,RC0~3,都变成流水灯了!

millwood0 发表于 2013-6-21 04:28:02

"成流水灯了!"

If you don't try to read and understand the datasheet, you will never learn.

1125526801 发表于 2013-6-21 08:19:40

本帖最后由 1125526801 于 2013-6-21 09:19 编辑

millwood0 发表于 2013-6-21 04:28 static/image/common/back.gif
"成流水灯了!"

If you don't try to read and understand the datasheet, you will never learn.


我在看了,只是还没看懂,毕竟刚接触PIC,很多术语以前做STC51都没有的,一时没理解。millwood0真是全能的,在很多版区都能看到你出现哦。Excuse me
,Where are you from
?我英文比较差,只能用中文回复你,希望你能看得懂,抱歉{:lol:} 。

1125526801 发表于 2013-6-21 09:04:20

本帖最后由 1125526801 于 2013-6-21 09:14 编辑

millwood0 发表于 2013-6-21 04:28 static/image/common/back.gif
"成流水灯了!"

If you don't try to read and understand the datasheet, you will never learn.


OK!afteradd   " ANSELA= 0x00;   ANSELC= 0x00;"   in.原来是数字口,模拟口的问题。很好,顺便学下英文。thank you!

1125526801 发表于 2013-6-21 09:14:18

本帖最后由 1125526801 于 2013-6-21 09:15 编辑

xiongh 发表于 2013-6-15 15:28 static/image/common/back.gif
看手册:

12.2 PORTA 寄存器


RA3 是个例外,它仅
可作为输入引脚。现在除了RA3,其它做数字口,都能正常使用了。谢谢提醒!不然我又以为RA3不正常,又得折腾半天了。

xiongh 发表于 2013-6-21 09:47:41

RA3我没有使用,专门作为复位用。

1125526801 发表于 2013-6-21 14:44:53



总算把LCD点亮了!{:sweat:}

millwood0 发表于 2013-6-22 06:07:57

原来是数字口,模拟口的问题。

Generally speaking, mcus have alternate uses for any pin. Sometimes, the power-on state / mode is not (digital) GPIO - PICs as you have found out power up in the analog mode. Other PICs may also default some of their pins for comparators.

Many PICs provide a gpio initialization sequence in the GPIO section of the datasheet, or to identify all relevant registers / bits, etc.

I always execute a routine, called mcu_init(), as the first user-space routine to reset the pins to digital IO. On some mcus, that routine could be an empty routines - AVRs for example. But it is a good idea to always have that.

1125526801 发表于 2013-6-22 10:10:48

millwood0 发表于 2013-6-22 06:07 static/image/common/back.gif
Generally speaking, mcus have alternate uses for any pin. Sometimes, the power-on state / mode is...

原来,手册上的引脚功能说明中,有标ANx的IO都是带有模拟输入功能的,必须将其设置为数字输出。{:smile:}

huarana 发表于 2013-6-22 12:58:46

作输出用的时候 最好使用 LATx 寄存器 而不要用PORTx。

1125526801 发表于 2013-6-24 08:49:58

xiongh 发表于 2013-6-15 15:28 static/image/common/back.gif
看手册:

12.2 PORTA 寄存器


在学习中断,发现无论是定时器0还是定时器1还是其它,
中断程序都是这个:
void interrupt isr(void)




不像51单片机那样带有中断号来对应中断源。

难道PIC的所有中断程序都写在void interrupt isr(void)里,然后用判断语句来识别中断源吗?

气球 发表于 2013-6-24 09:24:54

XC8免费版也一样用

xiongh 发表于 2013-6-24 10:05:03

1125526801 发表于 2013-6-24 08:49 static/image/common/back.gif
在学习中断,发现无论是定时器0还是定时器1还是其它,
中断程序都是这个:
void interrupt isr(void)


进入中断后,判断中断标志,然后确定是什么中断,再进行相应处理。

1125526801 发表于 2013-6-24 11:12:02

气球 发表于 2013-6-24 09:24 static/image/common/back.gif
XC8免费版也一样用

我是破解了用,代码优化好

1125526801 发表于 2013-6-24 11:12:43

本帖最后由 1125526801 于 2013-6-24 12:09 编辑

xiongh 发表于 2013-6-24 10:05 static/image/common/back.gif
进入中断后,判断中断标志,然后确定是什么中断,再进行相应处理。

嗯嗯。试了用if,可以。ADC和PWM输出也弄出来了。消化一下,再熟悉一下PID算法,应对准备做的项目就勉强够用了{:titter:}

xiongh 发表于 2013-6-24 12:51:25

PIC单片机的稳定性非常的不错,就是价格有点贵了,不过用来做工业产品不在乎这点成本。

1125526801 发表于 2013-6-24 13:19:25

本帖最后由 1125526801 于 2013-6-24 13:21 编辑

xiongh 发表于 2013-6-24 12:51 static/image/common/back.gif
PIC单片机的稳定性非常的不错,就是价格有点贵了,不过用来做工业产品不在乎这点成本。 ...

是有点贵,我只是想积累些PIC的经验,你看我发这个帖子时之前机根本没用过PIC。。。。调试成功后再换别的低成本MCU吧,要是找不到合适的就不换了。要求要耐高温。

chengzepeng 发表于 2013-6-24 15:32:01

PIC有自带的延时函数,完全由编译器计算生成的,
首先定义一下时钟,然后就可以直接用了,
如果用很多的延时就写一个延时函数,
#define _XTAL_FREQ 4000000                // 定义时钟频率为4M
void delay_ms(uint16_t xms)
{
        for(;xms!=0;xms--)
        {
                __delay_us(986);               
        }
}

注意__delay_us和__delay_ms是两根下划线的,
其中_delay()是延时指令周期时间,一根下划线

1125526801 发表于 2013-6-24 18:15:18

chengzepeng 发表于 2013-6-24 15:32 static/image/common/back.gif
PIC有自带的延时函数,完全由编译器计算生成的,
首先定义一下时钟,然后就可以直接用了,
如果用很多的延 ...

哦!原来这样啊,我还按51单片机的写,然后接上示波器调整。。。。

1521732588 发表于 2013-6-25 09:26:36

用PICC9.8的吧

1125526801 发表于 2013-6-25 17:55:19

本帖最后由 1125526801 于 2013-6-25 20:20 编辑

xiongh 发表于 2013-6-15 10:18 static/image/common/back.gif
MPLAB X+ PICC挺好用。
#include "pic.h"
#include


    一般PIC的ADC输入,需要加RC滤波吗?我直接从电位器采样,只加了只103电容。我那小板实验做了两通道输入。
        while(1)
        {

                test=ADC_BAT_contiue(0);//ADC0转换
                Numshow_XY(2,0,test);        //显示转换结果
                test=ADC_BAT_contiue(1);//ADC1转换
                Numshow_XY(6,0,test);        //显示转换结果
                delay20ms();

        }




我在学习PPM输出,用CCP1做半桥输出,CCP2做呼吸灯。同时使用,按照手册需要设置寄存器CCPTMRSx来选择使用的定时器资源。
但是编译不过,提示CCPTMRS0未定义。后来改成CCPTMRS搞定了:CCPTMRS=0b11110100;//给CCP1和CCP2选择定时器资源。







xiongh 发表于 2013-6-25 21:10:24

1125526801 发表于 2013-6-25 17:55 static/image/common/back.gif
一般PIC的ADC输入,需要加RC滤波吗?我直接从电位器采样,只加了只103电容。我那小板实验做了两通道 ...

可以采用软件滤波

1125526801 发表于 2013-6-25 22:08:01

本帖最后由 1125526801 于 2013-6-25 22:11 编辑

xiongh 发表于 2013-6-25 21:10 static/image/common/back.gif
可以采用软件滤波

嗯。现在我那103电容也去了,是采样8次平均,做软件滤波,挺稳定的了。所用的两路AD都跟ICSPI有关,加了电容没法下载了。没加电容,也比STC的ADC稳定多了,以前玩STC的12C5A60S2,加了RC,还得采样30次以上做软件滤波效果才满意。

1125526801 发表于 2013-6-26 16:51:52

yoyobbs 发表于 2013-6-14 22:46 static/image/common/back.gif
一直使用PICC的路过.

我试了下,用PICC和XC8编译同一个工程,XC8优化好像要好点。(都是和谐过的)

HI-TECH C Compiler for PIC10/12/16 MCUs (Lite Mode)V9.80:


Microchip MPLAB XC8 C Compiler V1.12:

1125526801 发表于 2013-6-26 18:44:20

本帖最后由 1125526801 于 2013-6-26 19:05 编辑

xiongh 发表于 2013-6-21 09:47 static/image/common/back.gif
RA3我没有使用,专门作为复位用。

哥,看看我的EEPROM读写错哪了?读应该对的,我用kit3写入EEPROM,能正确读出来。但是写了数据无效。{:sad:}
void EEPROM_write(uchar add,uchar dat)//add为0x00~0xff
{

       
        EEADRL = add;        //地址写入EEADRL 寄存器
        EEDATL = dat;        //将数据写入EEDATL 寄存器

//对写操作进行解锁
        EECON2 = 0x55;//先将 55h 写入 EECON2,
        EECON2 = 0xaa;//随后将 AAh 写入 EECON2
        EECON1 = 0b00000110;//然后再将 EECON1中的WREN位置1 以使能写操作


        EECON1 = 0b00000010;//最后将 WR位(bit 1)置 1
}

uchar EEPROM_read(uchar add)//add为0x00~0xff
{
        uchar dat_tmep = 0;
       
        EEADRL = add;//写要要读的地址
        EECON1 = 0b00000001;        //清零EECON1寄存器的EEPGD 和CFGS 控制位,然后将控制位RD 置1。
                                                //               bit7   bit6                   bit0
        dat_tmep=EEDATL;//读出地址add上的数据
        return dat_tmep;
}

1125526801 发表于 2013-6-26 19:55:30

本帖最后由 1125526801 于 2013-6-26 20:04 编辑

1125526801 发表于 2013-6-26 18:44 static/image/common/back.gif
哥,看看我的EEPROM读写错哪了?读应该对的,我用kit3写入EEPROM,能正确读出来。但是写了数据无效。{:sa ...


{:sweat:} 硬着头皮一边百度一边翻译手册上的汇编例程,终于成功写入EEPROM!看来汇编还是有必要去了解一下。
突然觉悟:学会了看STC的数据手册,不代表你能看懂PIC的手册。。。不过,当真的学会了用一种PIC的MCU,PIC的其它MCU应该不难了吧,但愿。


void EEPROM_write(uchar add,uchar dat)//add为0x00~0xff
{

        EEADRL = add;        //地址写入EEADRL 寄存器
        EEDATL = dat;        //将数据写入EEDATL 寄存器
       
        CFGS = 0;//EECON1
        EEPGD = 0;
        WREN = 1;
        GIE = 0;
//对写操作进行解锁
        EECON2 = 0x55;//先将 55h 写入 EECON2,
        EECON2 = 0xaa;//随后将 AAh 写入 EECON2
        WR = 1;
        GIE = 1;
        WREN = 0;
        while(WR);//Wait for write to complete
}

millwood0 发表于 2013-6-26 20:20:03

The unlock sequence is outlined in the datasheet. Other peripherals (like RTCC) have similiar mechanism to prevent accidental write to them. You should implement that in assembly (as there are fairly strict timing requirements for those sequences that your compiler may not be able to meet), and repeat the sequence until a write is successful.

millwood0 发表于 2013-6-26 20:20:51

This is an example of why reading the datasheet is invaluable.

You cannot be a good embedded programmer if you cannot read and more importantly understand the datasheet.

1125526801 发表于 2013-6-26 22:19:53

本帖最后由 1125526801 于 2013-6-27 09:00 编辑

millwood0 发表于 2013-6-26 20:20 static/image/common/back.gif
This is an example of why reading the datasheet is invaluable.

You cannot be a good embedded progra ...

Iread it, but Idon't understand because thar text description for sequence is not very clear. and I cannot read assembly language,it is a big drawback for me.

In the PIC datasheet, all the examples are written in assembly language.

1125526801 发表于 2013-6-26 22:20:53

本帖最后由 1125526801 于 2013-6-27 09:02 编辑

millwood0 发表于 2013-6-26 20:20 static/image/common/back.gif
The unlock sequence is outlined in the datasheet. Other peripherals (like RTCC) have similiar mechan ...

不好意思,昨晚这段英文还没读懂。。。。{:dizzy:}

今天早上特意下载了个词典翻译了一下,不知道对了没:

The unlock sequence is outlined in the datasheet.
解锁序列数据手册中已列出。
Reply: oh yes, I see it.


另外,开始我并不知道EECON1原来是需要位操作:
CFGS = 0;//EECON1
EEPGD = 0;//EECON1
WREN = 1;//EECON1
GIE = 0;//EECON1
而我之前是字节操作,如:EECON1 = 0b00000010;//最后将 WR位(bit 1)置 1
显然这和正确的时序是不一样的,所以写入不成功。后来边学边看,终于大概看明白了汇编时序例程,跟着他的时序写成C,才成功写入EEPROM。


Other peripherals (like RTCC) have similiar mechanism to prevent accidental write to them.
其他外围设备(如RTCC)也有类似的机制来防止它们被意外误写。

You should implement that in assembly (as there are fairly strict timing requirements for those sequences that your compiler may not be able to meet), and repeat the sequence until a write is successful.
你应该用汇编来实现(这些序列有相当严格的时间要求,你的编译器可能无法满足),并重复这个过程直到写操作成功。

yoyobbs 发表于 2013-6-27 08:42:38

1125526801 发表于 2013-6-26 16:51 static/image/common/back.gif
我试了下,用PICC和XC8编译同一个工程,XC8优化好像要好点。(都是和谐过的)

HI-TECH C Compiler for P ...

PIC的编译XC上我没试过,但是在PIC9.8与8.05上编译,9.8确实优化得比较好.
另外,PIC在高版本的编译器上,对bank的处理与8.05略有不同.

1125526801 发表于 2013-6-27 09:14:03

PIC_1824E - 12864S&ADC&time0&PWM&EEPROM
程序上传一下,留着以后用

zenghouyun 发表于 2016-12-12 16:29:44

1125526801 发表于 2013-6-14 18:16
前辈们,PIC16F1824,帮忙给个流水灯程序吧。。。折腾了一天都没亮灯。。。。实然觉得学了几年STC白学了。 ...

非常感谢上传了中文版手册,我英语比较差,看的头晕。。。。多谢

1125526801 发表于 2017-4-7 20:16:59

zenghouyun 发表于 2016-12-12 16:29
非常感谢上传了中文版手册,我英语比较差,看的头晕。。。。多谢

转眼过去好几年了,喜欢就好{:lol:} 。

活到老学到老 发表于 2017-4-7 22:56:54

楼主你这个板子手里还有吗,淘宝了一圈没找到

1125526801 发表于 2017-4-20 19:12:42

活到老学到老 发表于 2017-4-7 22:56
楼主你这个板子手里还有吗,淘宝了一圈没找到

好久之前的了,早不知道哪里去了。你可以画个板发去打样出来就行了

MagicYang 发表于 2017-6-4 20:57:45

楼主用的是哪个编译器?

1125526801 发表于 2017-6-12 10:22:23

MagicYang 发表于 2017-6-4 20:57
楼主用的是哪个编译器?

没用PIC了,改用台产芯片了,便宜。
页: [1]
查看完整版本: PIC16F1824有什么C编译器能用?