打印
[国产单片机]

STC就这质量,要黄!!!

[复制链接]
楼主: liu5300997
手机看帖
扫描二维码
随时随地手机跟帖
41
zzyfidy| | 2012-8-6 17:13 | 只看该作者 回帖奖励 |倒序浏览
这么贵,单又小的机型尽然用STC的,

使用特权

评论回复
42
ayb_ice| | 2012-8-6 17:25 | 只看该作者
山寨产品用山寨的MCU

使用特权

评论回复
43
damiaa| | 2012-8-7 11:18 | 只看该作者
是啊。这么贵的产品有人要?真是牛人啊。

使用特权

评论回复
44
wsypaul| | 2012-8-7 21:01 | 只看该作者
这个帖子的动机明显有问题

使用特权

评论回复
45
liu5300997|  楼主 | 2012-8-7 21:51 | 只看该作者
我开发哪个东西时就当玩具,做了一个非常小的CAN压力传感器,缺陷很多,6000多一个卖了12个,可以在应用中改变下位机ID,改变测量曲线,因此买一个可以用于很多地方,可现在麻烦了,哪个小玩意中放不更多东西,比如完全隔离。昨天退货了,连几万元的线一起给我,要我找原因!这么小的空间要完全隔离(光电)我放不下第二个DC,四十元出一片正品也行,可DC从忽略到了2000元,很伤,但这项目还不差的16000一个,但以前我做的东西中几十元的东西就废了

使用特权

评论回复
46
liu5300997|  楼主 | 2012-8-7 21:57 | 只看该作者
主要是产品体积小,2007年做了,2009年定型,哈“定型”,我不好更了,以前STC不错!
好难过啊,这东西需要大改啊!体积增大才行!!φ58mmX100mm,测量压力0~15MPa,以及0~1MPa,满足GJB150A要求!16000元一只!

使用特权

评论回复
47
liu5300997|  楼主 | 2012-8-7 22:03 | 只看该作者
程序是根据STC的datasheet改的如下:
头文件:
/*
  签名  :刘伟
  日期  :20070530
 功能描述:宏声明
 其它功能:
 版本  :
*/   

        #ifndef __SENSOR_MACRO_H__
        #define __SENSOR_MACRO_H__
        /*----------------------传感器选择-------------------------*/
                #define sensor_presure         00
        //        #define DEBUG
        /*-----------------------UART协议命令----------------------*/
                #define NORMAL                        0
                #define READ                        1
                #define READ_CAN_SEND        2
                #define SAMPLING_PRESS                3
                #define READ_CAN_RECEIVE        4
                #define CHANGE_ADDR                5
                #define TX_STATUS                6
                #define CAN_LOOP                7                //CAN回环测试模式
                #define REPEAT                        8

                #define FLASH_USED                10               
        //        #define GET                                2
               
        //        #define TWO_BYTE                2
        /*---------------------------------------------------------*/               
                #define        ADC_DATA_LENGTH        8                //adc数据长度暂取6位
        /*-----------------------本机位号--------------------------*/
        //        #define IP_ADDRESS                                1               
               
                #define DIGIT                        256                //累加位数
                #define FST_TIMES                16
                 
        /*-----------------------定时器----------------------------*/
                //        #define #00111101B        0x3d
                #define WDT        (WDT_CONTR= 0x3d)               
                /*允许WDT,WDT开始计数,看门狗始终计数,预分频64,
                溢出时间=12*预分频*32768/时钟频率,12MHz下为1.25ms*/
                #define SHUTDOWN_WDT        (WDT_CONTR=0x1d)        //关闭看门狗,重新计数其它不变
                /* TIMER0开始*/
                #define  T0_START                 (TR0 = 1)
               
                /*TIMER0关闭*/
                #define  T0_SHUT                 (TR0 = 0)
                /*TIMER1开始*/
                #define  T1_START                 (TR1 = 1)
                /*TIMER1关闭*/
                #define  T1_SHUT                 (TR1 = 0)
        /*--------------------USART-------------------------------*/

        //        #define uart_oe                        P1_7
                #define  CS                                P1_1                //SPI片选
                #define  CLK P1_7
               
                #define MISO  P1_6
                #define MOSI  P1_5
       
       
                #define  UART_MODE_0                0                //MODE 0 ,同步移位模式   baud=fosc/12
                #define  UART_MODE_1                0X40        //MODE 1 ,10BIT 异步收发
                #define  UART_MODE_2        0X80        //MODE 2 ,11BIT                        baud = fosc/32 or fosc/64
                #define  UART_MODE_3                0XC0        //MODE 3 ,11BIT       
                //--------------------------
                #define  UART_TIIF_CLR      (TI = 0)
                #define  UART_RIIF_CLR          (RI = 0)
                #define  setup_uart(x)            (SCON = (x))
               
                #define  ENABLE_UART_RCV        (REN = 1)
                #define  DISABLE_UART_RCV        (REN = 0)
                #define  UART_RATE_MUL            (PCON |= 0X80)                         //baudrate *2
                #define  UART_RATE_NOR            (PCON &= 0X7F)
                #define  READ_UART()                    SBUF                            //读缓冲
                #define  WRITE_UART(x)                    (SBUF = (x))            //写缓冲               
       
        /*-------ADC应先打开电源->引脚开漏->设置速度->设置通道->延时1ms->启动A/D------------*/
                #define        ADC_Chanel_0_Result                0x30        //0通道A/D转换结果
                #define        ADC_Chanel_1_Result                0x31
                #define        ADC_Chanel_2_Result                0x32
                #define AD_CH0                0
                #define AD_CH1                1
                #define AD_CH2                2
                #define AD_CH3                3
                #define AD_CH4                4
                #define AD_CH5                5
                #define AD_CH6                6
                #define AD_CH7                7
                #define AD_SPEED1   0
                #define AD_SPEED2        1
                #define AD_SPEED3        2
                #define AD_SPEED4        3                //最高速
                #define set_adc_ch(x)        (ADC_CONTR &= 0XF8) ;(ADC_CONTR |= (x))        //ad通道选择选择P1口
                #define ADCIF_CLR                (ADC_CONTR &= 0XEF)                        //AD标志清零
                #define set_adc_speed(x)        (ADC_CONTR &= 0X9F); (ADC_CONTR |= (x))        //ad转换速度
                #define ADC_START           (ADC_CONTR |= 0X08)        //启动AD。在结束前最好不要改变任何IO状态以提高精度
                #define ADC_POWER_ON        (ADC_CONTR |= 0X80)        //打开adc电源。ad启动前一定要打开
                #define ADC_POWER_OFF   (ADC_CONTR &= 0X7F)        //ad转换结束后可以关闭以节电。初次打开后延时再测量。

        /*-------------------------12C5410flash------------------------*/
        //        #define ENABLE_ISP                0x80                                //<30MHz
        //        #define ENABLE_ISP                0x81                                //<24MHz
                #define ENABLE_ISP                0x82                                //<20MHz
        //        #define ENABLE_ISP                0x83                                //小于12MHz时值
        //        #define ENABLE_ISP                0x84                                //<6MHz
        //        #define ENABLE_ISP                0x85                                //<3MHz
        //        #define ENABLE_ISP                0x86                                //<2MHZ
        //        #define ENABLE_ISP                0x87                                //<1MHz
                #define DATA_FLASH_START_ADDRESS_H        0x28
                #define        DATA_FLASH_START_ADDRESS_L        0x00        //5410系列起始地址,间隔0x200
                #define ISP_IAP_BYTE_READ                1
                #define ISP_IAP_BYTE_PROGRAM        2
                #define ISP_IAP_SECTOR_ERASE        3
        /*-------------------------SPI宏---------------------------------*/
                #define ENABLE_SPI                SPCTL |= 0X40
                  #define DISABLE_SPI                SPCTL &= 0XBF

                  #define SPI_MASTER_BY_SS         0      // SPCTL &= 0X7F
                  #define SPI_MASTER_BY_MSTR 0X80   //SPCTL |= 0X80

                  #define SPI_LSB                        0X20   //SPCTL |= 0X10
                  #define SPI_MSB                        0      //SPCTL &= 0XDF 高位在前

                  #define SPI_MATER_MODE        0X10   //SPCTL |= 0X08 主模式
                  #define SPI_SLAVE_MODE        0      //SPCTL &= 0XF7

                  #define SPI_CLK_POSITIVE  0      //SPCTL &= 0XFB
                  #define SPI_CLK_NEGATIVE  0X08   //SPCTL |= 0X04

                  #define SPI_CLK_PHAF                0X04   //SPCTL |= 0X02
                  #define SPI_CLK_PHAB                0      //SPCTL &= 0XFD


                  #define SPI_CLK_DIV_BY_4        0X00        //时钟四分频
                  #define SPI_CLK_DIV_BY_16 0X01
                  #define SPI_CLK_DIV_BY_64 0X02
                  #define SPI_CLK_DIV_BY_128 0X03

                  #define setup_spi(x)        SPCTL = (x);                //spi的工作模式
          //----------------------------------------------------------
                  #define SPIF_CLR                        SPSTAT |= 0X80
                  #define SPIF_WCOL                        SPSTAT |= 0X40
                 #define SPIF                                (SPSTAT & 0X80)         //中断标志
                  #define SPWCOL                        SPSTAT & 0X40;         //冲突标志

          //------------------------------------------------------------
                  #define wrb_spi(x)                SPDAT = (x)                        //spi发送一个字节数据
                  #define rdb_spi()                        SPDAT                                //接收一个数据


        /*-------------------------其它常量------------------------------------*/
                #define HIGH                1
                #define LOW                        0
                #define BAUD_RATE        0xd9        //1200,1.5MHz 1T方式
       
               
        #endif

除引用没改。
下边是程序:
//        #pragma src
        #include "STC54XX.H"       
        #include "sensor_macro.h"
        #include "sensor_var.h"
        #include "sensor_function.h"

        unsigned char xdata flash_data[FLASH_USED];                //Flash数据刷新时备份
        /*-----------这里集中定义了与Flash相关的变量以利于简化读写程序------*/
        unsigned char data ip_addr[2],main_ip[2];
        data union                                                        //定义曲线的k
        {
                unsigned int ui_k;
                unsigned char uc_k[2];
        } k;

        data union                                                        //定义曲线的b
        {
                unsigned long ul_b;
                unsigned char uc_b[4];
        } b0;
        /*
        函数名:shut_isp()
        接口  :直接调用
        功能  :为防止误操作,完全关闭ISP,这是必要的
        */
        void shut_isp(void)
        {
                ISP_CONTR=0;
                ISP_CMD=0;                        //空闲状态
                ISP_TRIG=0;
        }
        /*
          函数名 :ReadByte()
          接口   :Flash地址增量即以0x2800作为基址
          功能   :从Flash从读取一个字节
        */
                 unsigned char ReadByte (unsigned char ad_l)
        {
                ISP_CONTR=ENABLE_ISP;
                ISP_CMD=ISP_IAP_BYTE_READ;                                //读状态
                ISP_ADDRH=DATA_FLASH_START_ADDRESS_H;
                ISP_ADDRL=DATA_FLASH_START_ADDRESS_L+ad_l;
                EA=0;
                ISP_TRIG=0x46;
                ISP_TRIG=0xb9;
                EA=1;
                shut_isp();                                                        //关闭ISP
                return ISP_DATA;
        }

        /*
          函数名 :WriteByte()
          接口   :地址和数据
          功能   :写一字节到Flash的指定地址
        */

                void WriteByte (unsigned char ad_l,unsigned char dh)
        {
                ISP_CONTR=ENABLE_ISP;
                ISP_CMD=ISP_IAP_BYTE_PROGRAM;                        //写状态
                ISP_ADDRH=DATA_FLASH_START_ADDRESS_H;
                ISP_ADDRL=DATA_FLASH_START_ADDRESS_L+ad_l;
                ISP_DATA=dh;
                EA=0;
                ISP_TRIG=0x46;
                ISP_TRIG=0xb9;
                EA=1;
                shut_isp();                                                        //关闭ISP
        }

        /*
          函数名 :erase()
          接口   :
          功能   :擦除自0x2800的第一页
        */

                void erase (void)
        {
                ISP_CONTR=ENABLE_ISP;
                ISP_CMD=ISP_IAP_SECTOR_ERASE;                        //擦除状态
                ISP_ADDRH=DATA_FLASH_START_ADDRESS_H;
                ISP_ADDRL=DATA_FLASH_START_ADDRESS_L;
                EA=0;
                ISP_TRIG=0x46;
                ISP_TRIG=0xb9;
                EA=1;
                shut_isp();                                                               
        }
        /*
          函数名 :Flash_buckup()
          接口   :
          功能   :擦除数据前的备份数据
        */
        void Flash_buckup(void)
        {
                unsigned char data i;
                for(i=0;i<FLASH_USED;i++)       
                {
                        flash_data[i]=ReadByte(i);
                }
        }
        /*
          函数名 :Flash_buckup()
          接口   :
          功能   :全部数据写入
        */
        void Flash_write(void)
        {
                unsigned char data i;
                WDT_CONTR&=0x07;                                //关闭看门狗
                erase();
                for(i=0;i<=FLASH_USED;i++)       
                {
                        WriteByte(i,flash_data[i]);
                }
                WriteByte(100,0x88);                        //改写标志位
                WDT;                                                        //重启看门狗
               
        }
        /*
          函数名 :change_address()
          接口   :
          功能   :修改地址
        */
        void change_address(void)
        {
                Flash_buckup();                                        //先备份数据
                flash_data[0]=ip_addr[0];                //修改相应数据
                flash_data[1]=ip_addr[1];
                flash_data[8]=main_ip[0];
                flash_data[9]=main_ip[1];
                Flash_write();                                        //写入
                init_can();                                                //再次初始化CAN控制器
        }
        /*
          函数名 :change_address()
          接口   :
          功能   :修改y=kx+b的常数
        */
        void change_k_b(void)                                //仅在调试完成时调用它
        {
        //        unsigned char data i;
                Flash_buckup();                                        //先备份数据
                flash_data[2]=k.uc_k[0];                //修改相应数据
                flash_data[3]=k.uc_k[1];
                flash_data[5]=b0.uc_b[1];
                flash_data[6]=b0.uc_b[2];
                flash_data[7]=b0.uc_b[3];
                if(!b_bflag)                                                //b<0?
                {
                        b0.uc_b[0]=0;
                        b_bflag=0;
                }
                else
                {
                        b0.uc_b[0]=1;
                        b_bflag=1;
                }
                flash_data[4]=b0.uc_b[0];
                Flash_write();
                b0.uc_b[0]=0;                                        //回到工作状态最高位清零,无符号数                                       
        }
        /*
          函数名 :read_data()
          接口   :
          功能   :数据读入内存
        */
        void read_data(void)
        {
                unsigned char data i;
                unsigned char data *data ptr;
                ptr=&ip_addr;
                for(i=0;i<=FLASH_USED;i++)       
                {
                        *ptr=ReadByte(i);
                        ptr++;
                }
        /*
                ip_addr[0]=ReadByte(0);
                ip_addr[1]=ReadByte(1)&0xe0;
                main_ip[0]=ReadByte(2);
                main_ip[1]=ReadByte(3);
                k.uc_k[0]=ReadByte(4);
                k.uc_k[1]=ReadByte(5);
                b0.uc_b[0]=ReadByte(6);
                b0.uc_b[1]=ReadByte(7);
                b0.uc_b[2]=ReadByte(8);
                b0.uc_b[3]=ReadByte(9);
        */
                if(b0.uc_b[0]==0)
                {b_bflag=0;}
                else
                {b_bflag=1;}
                b0.uc_b[0]=0;
        }

使用特权

评论回复
48
liu5300997|  楼主 | 2012-8-7 22:04 | 只看该作者
就加了点扩展应用子程序

使用特权

评论回复
49
liu5300997|  楼主 | 2012-8-7 22:12 | 只看该作者
只是将ID,系数放入数据EEPROM,对于用户2007年行,2009年的不知如何,但库存的STC2510AD不能用了!!!2012,我很难,因为这个元件,所有问题,以前没有的都是它的,我将它的功能用完了才能在2007年做出小体积的CAN传感器,找谁哭去!!!!!!!!!!!

使用特权

评论回复
50
xwj| | 2012-8-8 08:30 | 只看该作者
真是佩服LZ。

卖12000元的产品,关键的核心用几块钱的山寨IC,你真的是太牛B了,不佩服你的胆量都不行啊~~~


几年前,以前公司的民用级产品,有一批用了STC的,结果上量后问题数不胜数,很多都是CPU没坏程序丢了、数据丢了,擦掉重新下载又可能会好了。STC根本就没法查出原因和解决问题(其实它们很清楚,只是不敢说罢了)

那批产品对公司的品牌声誉造成了很严重的影响,最后公司研究后只能全面召回更换CPU,从此以后全面禁用STC的山寨货。

——而且,更有意思的是:半导体器件都在降价,而当时的STC却在牛B哄哄的涨价。市场采购稍微一联系,才发现SST、ATMEL等同样配置的MCU价格比STC还低些,就更不用说台湾的华邦、新茂等了。

使用特权

评论回复
51
t.jm| | 2012-8-8 08:44 | 只看该作者
我不关心LZ用什么MCU,我奇怪的是测个压力就能卖1W多,看来我要找点时间完善我的压力测量温度补偿方案啦!

使用特权

评论回复
52
rockli| | 2012-8-9 14:49 | 只看该作者
GJB150A是军用标准吧?
满足军标的设备居然用山寨小厂的单片机。真是佩服。

使用特权

评论回复
53
liu5300997|  楼主 | 2012-8-9 19:33 | 只看该作者
2007年做的产品,2009年定型,对方又没说要什么标准的,只是我们做产品时除MCU外全是军用的,插座1700,电源当时也是1000多的。2011年才说要满足GJB150A

使用特权

评论回复
54
xt3203| | 2012-8-9 20:03 | 只看该作者
感觉你的程序问题的可能性比较大。我们一直在用STC的片子,没有出现什么问题。还是好好看看你自己的程序,不要随便说这个不行那个不行。当年我们单位有个同事编的程序老是死机,每次都很自信的说他程序没有问题,是 ...
bbv 发表于 2012-8-4 17:31

同感!

使用特权

评论回复
55
liu5300997|  楼主 | 2012-8-10 20:52 | 只看该作者
本帖最后由 liu5300997 于 2012-8-10 21:56 编辑

说我程序有问题的,不了解我们的生产程序,最有可能的是,2012年STC的12c5410ad与我在2009年用的不一样。我说下我们生产产品和程序:我的产品2009年定型,什么叫定型!!!就是产品做了大量试验,没问题了,请专家,请用户、对设计、对生产工艺、对产品性能进行评审,认为产品实现了所有性能,原材料来源可靠,能进行批量生产,符合用户要求,环境试验符合要求,因此产品技术状态冻结!!!转入D型。什么叫冻结?就是产品成熟了,就是图纸,软件再改要有专家级组的意见!若是军品,要有军方总军代表同意!随便改有法律责任的!也改不了,生产上也要见最终批复!要将任何原料或元件更换来源,要写报告的!难啊!难于重新设计新产品!你以前的元件不行,我装机的还能行?你要换,装了多少全换,还不是钱的问题,是你敢换?出问题只能修,决不能换!当然你想换,也没人敢同意!除非你进行过D型的全部试验,就可以。
这种管理是严谨的,2009年时如果程序有问题不可能通过评审!!!
2009年我程序针对12c5410ad绝对没有问题!!!产品试验按鉴定试验大纲走,认为程序有问题的,根本不知军品如何生产的,研制阶段为F型,即方案设计,方案样机,然后是C型,初样,性能测试,装机试车,用户结论合格后,进行评审,转S型,小批量装机,试车,一定批量后没问题转定型。S型阶段若有问题,必须消除故障,上报故障规零报告,并更换所有产品(招回制,军品早就实现了)
一个定型产品在定型后发现S型的程序有大错!!!否定的可不是我的智慧,还有用户的智慧!!!


STC有产品定型这说法吗???还是想改就改!!!有招回制吗???你招回我也不敢,只能消毁,
我用错了行了吧!没什么目的,就是用错了,对国产单片机没信心了!

看到认为我程序有错的说法,很生气,数据写不进去,肯定是有问题,以前写现在不能,我只是想说明,产品的状态有冻结的时候,不能说2009年你的能写,2012就不能了,用户如何办?用一周时间来分析最后发现这个元件与以前不一样???我的产品就是16000一个也受不了,FUCK YOU!!!

使用特权

评论回复
56
大道至简| | 2012-8-11 09:29 | 只看该作者
这么贵,单又小的机型尽然用STC的,
zzyfidy 发表于 2012-8-6 17:13



附议

使用特权

评论回复
57
forrest11| | 2012-8-11 19:11 | 只看该作者
本帖最后由 forrest11 于 2012-8-11 19:14 编辑

57# liu5300997
楼主,请不要着急,更不要激动。
对于这样的事情,你首先要**一点:1、这是个问题;2、这个问题可以解决,但目前没有找到原因。
我这样说好像没话找话。但如果你**这两点,你就会对这里的答复不生气,而认为是给你出主意。
我今天花了点时间看了一下你的代码,基本是STC的demo照搬。我仔细看了flash_write,你的等待时间对应为82。对此我很担心。因为STCdatasheet上没有相应Flash的写入时间,但提到过max time为60us。你设置等待时间为2一定没有问题吗?
我建议你:1、老老实实加大写入时间,看看改变后是否能写入,读出。
2、有机会的话,同时将失败品交给STC,让他们分析内部flash是否损坏,如损坏,原因是什么?如果他们说不出原因,建议以后不要再选用他们的产品。如果他们的分析合理,没有理由更换设计。

同时,我希望你不要说自己的东西通过检查了,就没有问题了,军品又怎么样呢,当时的测试是黑盒测试,只能说明当时情况下产品通过测试。如果STC生产批次有不同,但在他们产品参数在datasheet范围内,是可以的。而你的产品用了新一批芯片后出了问题,只能说明你的设计有问题,不能说明其它;如果确实这批产品的某些参数超出datasheet上数据,你可以名正言顺地拿着测试数据去要求赔偿;如果datasheet上没有明确说明相关参数,只能说明该厂商的设计和产品还很不成熟,而你没有什么可抱怨的-----你当时选型和设计的时候,没有这些关键参数时,就从来不担心吗?。比如,我前面就问你flash写时间是否足够,我猜想你还是没有好好去测试和看代码及datasheet。

我还是建议你照以上两点去做吧,这个问题原因点很少,耐心做就一定很快定位的。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
ttl_web + 1 淡定
58
aceice| | 2012-8-11 23:07 | 只看该作者
:L简直是抠门到家了
话说LZ背景肯定不小

使用特权

评论回复
59
lrhsx33| | 2012-8-13 09:35 | 只看该作者
我想也是程序容错不够问题 4# forrest11

使用特权

评论回复
60
少先队员| | 2013-3-6 13:59 | 只看该作者
stc不至于这么差吧,自己检查程序没?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则