痞酷網_PIGOO

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

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

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

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

謝謝!
查看: 5562|回復: 9

野人獻曝: 黑晶爐電路STM8S903K3 初體驗

[複製鏈接]
發表於 2014-6-25 00:43:02 | 顯示全部樓層 |閱讀模式
本帖最後由 antlu 於 2014-6-25 12:58 AM 編輯

感謝: JOJOLING大 不斷的指導和督促(只是還是要讓他失望些!)
感謝: F0S大幫助我對 STM8S的硬體軟體認識,協助我BUG TRACE ,硬體的入門,軟件的全部供應
感謝: YSC大 拉我進入這個MCU的世界

電路: stm8s903k.png

黑晶600.png

目前只用到第一圖 功能SW3 START/STOP , SW4 -10 ,SW5 -1, SW2 +10,SW1 +1 , 4個LED 會影響到SW4 SW5的工作,所以沒有使用(等到功力提升後再挑戰) 2個中斷 都是定時間的,...

最終目標: 讀取溫度值 輸出控制電熱器,定時 定溫 警報,應用上大家就自己活用了!!

接線: F0S大幫忙接的 DSC07900.JPG

加上一個開關方便下載程式 DSC07901.JPG

DSC07898.JPG

ST-LINK : DSC07899.JPG

目前功能: DSC07897.JPG

開發用程式使用 ST Visual Develop  下載程式: STVP  參考書籍: STM8單片機自學筆記 & STM8單片機原理與實踐

主程式:

#include "stm8s.h"
#include "stm8s_tim1.h"
#include "stm8s_tim6.h"

#define BUZZER GPIO_PIN_0
void delay(unsigned int time);
void GPIOinit(void);
void GPIOflash(void);
void GPIO10flash(void);
void tim1init(void);//匯總 TIM1
void tim1svc(void);//中斷服務程式
void GPIOon (void);


u8 pcdis[]={0xd6,0x14,0xcc,0x5c,0x1e,0x5a,0xda,0x14,0xde,0x5e};
u8 pedis[]={0x01,0x00,0x01,0x01,0x00,0x01,0x01,0x01,0x01,0x01};
u8 Temperature,Hundreds,Tens,Units;
u8 PowerOn,ON,OFF,ErrFlag;
unsigned int count1;
unsigned char count6;
u8 ErrCount=0;
u8 Start_Flag=0;

@far @interrupt void TIM1_OVF_IRQ(void);
@far @interrupt void TIM6_OVF_IRQ(void);

void KeyScan(void);
void delay(unsigned int time);
void TransData(void);
void ErrTransData(void);
void Display(void);
void GPIOinit(void);
void tim1init(void);
void tim1svc(void);
void tim6init(void);
void tim6svc(void);

void LED_control(u8 LED);


void main(void)
{
        GPIOinit();
        tim1init();       
  tim6init();
  rim();       
        Temperature=120;

        while(1)
        {
        KeyScan();
        if(ErrFlag)
        ErrTransData();
        else
        TransData();
        Display();
        }
}

void KeyScan(void)
{
        GPIO_WriteLow(GPIOD,GPIO_PIN_2);
        GPIO_WriteLow(GPIOD,GPIO_PIN_3);
        GPIO_WriteLow(GPIOD,GPIO_PIN_4);
        GPIO_WriteLow(GPIOD,GPIO_PIN_5);       
        GPIO_Init(GPIOC,(GPIO_PIN_6|GPIO_PIN_7),GPIO_MODE_IN_PU_NO_IT);//變更 sw4 sw5 成為 input

        if(GPIO_ReadInputPin(GPIOC,GPIO_PIN_7)==0)//PC7 press
        {
        delay(50);
        if(GPIO_ReadInputPin(GPIOC,GPIO_PIN_7)==0)
        {
                while(GPIO_ReadInputPin(GPIOC,GPIO_PIN_7)==0);
                Temperature -=10;
        }       
  }

       
        if(GPIO_ReadInputPin(GPIOB,GPIO_PIN_3)==0)
        {
        delay(50);
        if(GPIO_ReadInputPin(GPIOB,GPIO_PIN_3)==0)
        {
                while(GPIO_ReadInputPin(GPIOB,GPIO_PIN_3)==0);
                Start_Flag = !Start_Flag;
        }
}
       
        if(GPIO_ReadInputPin(GPIOA,GPIO_PIN_1)==0)
        {
        delay(50);
        if(GPIO_ReadInputPin(GPIOA,GPIO_PIN_1)==0)
        {
                while(GPIO_ReadInputPin(GPIOA,GPIO_PIN_1)==0);
                Temperature+=1;
        }
}
        if(GPIO_ReadInputPin(GPIOA,GPIO_PIN_3)==0)
        {
        delay(50);
        if(GPIO_ReadInputPin(GPIOA,GPIO_PIN_3)==0)
        {
                while(GPIO_ReadInputPin(GPIOA,GPIO_PIN_3)==0);
                Temperature+=10;
        }
}


        if(GPIO_ReadInputPin(GPIOC,GPIO_PIN_6)==0)//PC6 press
        {
        delay(50);
        if(GPIO_ReadInputPin(GPIOC,GPIO_PIN_6)==0)
        {
                while(GPIO_ReadInputPin(GPIOC,GPIO_PIN_6)==0);
                Temperature -=1;
                ErrCount++;
        }       
  }
       

}


void delay(unsigned int time)
{
        while(time--);
}

void TransData(void)
{
        Hundreds=Temperature/100;
        Tens=(Temperature%100)/10;
        Units=Temperature%10;
}

void ErrTransData(void)
{
        Hundreds=ErrCount/100;
        Tens=(ErrCount%100)/10;
  Units=ErrCount%10;
}

void Display(void)
{
       
        GPIO_Init(GPIOC,GPIO_PIN_ALL,GPIO_MODE_OUT_PP_HIGH_FAST);//DISPLAY 7SEGMENT
        //GPIO_Init(GPIOD,GPIO_PIN_ALL,GPIO_MODE_OUT_PP_HIGH_FAST);//DISPLAY 3DIGIT
//        GPIO_Init(GPIOD,(GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5),GPIO_MODE_OUT_PP_HIGH_FAST);//DISPLAY 3DIGIT
//        GPIO_Init(GPIOE,GPIO_PIN_5,GPIO_MODE_OUT_PP_HIGH_FAST);//DISPLAY SEGMENT A
        GPIO_WriteLow(GPIOE,GPIO_PIN_5);

       
        if(Hundreds>0)
        {
                GPIO_Write(GPIOC,pcdis[Hundreds]);
                        if(pedis[Hundreds])
                                GPIO_WriteHigh(GPIOE,GPIO_PIN_5);
                                else
                                GPIO_WriteLow(GPIOE,GPIO_PIN_5);
                        }
                else
                {
                GPIO_Write(GPIOC,0x00);//百位消零
                GPIO_WriteLow(GPIOE,GPIO_PIN_5);//去除A節
}
                        GPIO_Write(GPIOD,0x10);//趨動百位數
                        delay(500);               
                        GPIO_WriteLow(GPIOC,GPIO_PIN_ALL);
                        delay(5);

        GPIO_Write(GPIOC,pcdis[Tens]);
        if(pedis[Tens])
        GPIO_WriteHigh(GPIOE,GPIO_PIN_5);
        else
         GPIO_WriteLow(GPIOE,GPIO_PIN_5);


                        GPIO_Write(GPIOD,0x08);//趨動十位數
                        delay(500);
                        GPIO_WriteLow(GPIOC,GPIO_PIN_ALL);
                        delay(5);
       

        GPIO_Write(GPIOC,pcdis[Units]);
        if(pedis[Units])//消除a節問題
        GPIO_WriteHigh(GPIOE,GPIO_PIN_5);
        else
         GPIO_WriteLow(GPIOE,GPIO_PIN_5);
                        GPIO_Write(GPIOD,0x04);//趨動個位數
                        delay(500);
                        GPIO_WriteLow(GPIOC,GPIO_PIN_ALL);//消除殘影
                        delay(5);
       
}


void GPIOinit(void)
{
        GPIO_Init(GPIOC,GPIO_PIN_ALL,GPIO_MODE_OUT_PP_HIGH_FAST);//DISPLAY 7SEGMENT
        GPIO_Init(GPIOD,GPIO_PIN_ALL,GPIO_MODE_OUT_PP_HIGH_FAST);//DISPLAY 3DIGIT
        GPIO_Init(GPIOE,GPIO_PIN_5,GPIO_MODE_OUT_PP_HIGH_FAST);//DISPLAY SEGMENT A
        GPIO_WriteLow(GPIOE,GPIO_PIN_5);
        GPIO_Init(GPIOA,GPIO_PIN_1|GPIO_PIN_3,GPIO_MODE_IN_PU_NO_IT);//INPUT +/- TIME
        GPIO_Init(GPIOB,GPIO_PIN_3,GPIO_MODE_IN_PU_NO_IT);//INPUT + FIRE POWER
       

}



void tim1init(void)
{
TIM1_TimeBaseInit(19,TIM1_COUNTERMODE_UP,50000,0);//2M/20=100khz 除50000次=2hz
TIM1_ITConfig(TIM1_IT_UPDATE,ENABLE);
TIM1_GenerateEvent(TIM1_EVENTSOURCE_UPDATE);
TIM1_Cmd(ENABLE);
}

void tim1svc(void)
{
        if(Start_Flag==1)
        {
   count1++;
   if(count1<10)
   ErrFlag=1;
         else
         ErrFlag=0;
  if (count1==120)
   {
    Temperature--;
                if(Temperature==0)
                {
                  Start_Flag=0;
                }
    count1=0;
    }
   }
        TIM1_ClearFlag(TIM1_FLAG_UPDATE);
}

@far @interrupt void TIM1_OVF_IRQ(void)
{
        tim1svc();
}

@far @interrupt void TIM6_OVF_IRQ(void)
{
        tim6svc();
}


void tim6init(void)
{
        TIM6_TimeBaseInit(TIM6_PRESCALER_32,250);//TIM6_PRESCALER_8 TIM6_TimeBaseInit
        TIM6_SetCounter(250);
        TIM6_ITConfig(TIM6_IT_UPDATE,ENABLE);//2Mhz/8/250
        //rim();
        TIM6_Cmd(ENABLE);
}

void tim6svc(void)
{
count6++;
if (count6==250)//250>>25
{
// GPIO_WriteHigh(GPIOC,GPIO_PIN_5);//LED3 off
count6=0;
if(Start_Flag)
GPIO_WriteHigh(GPIOC,GPIO_PIN_5);//. on
}
if(Temperature==1)
GPIO_WriteReverse(GPIOD,BUZZER);
        TIM6_ClearITPendingBit(TIM6_IT_UPDATE);
}

#ifdef USE_FULL_ASSERT

/**
  * @brief  Reports the name of the source file and the source line number
  *   where the assert_param error has occurred.
  * @param file: pointer to the source file name
  * @param line: assert_param error line source number
  * @retval : None
  */
void assert_failed(u8* file, u32 line)
{
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  /* Infinite loop */
  while (1)
  {
  }
}
#endif

/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/



中斷程式:
   /*        BASIC INTERRUPT VECTOR TABLE FOR STM8 devices
*        Copyright (c) 2007 STMicroelectronics
*/

typedef void @far (*interrupt_handler_t)(void);

struct interrupt_vector {
        unsigned char interrupt_instruction;
        interrupt_handler_t interrupt_handler;
};

@far @interrupt void NonHandledInterrupt (void)
{
        /* in order to detect unexpected events during development,
           it is recommended to set a breakpoint on the following instruction
        */
        return;
}

@far @interrupt void TIM1_OVF_IRQ(void);
@far @interrupt void TIM6_OVF_IRQ(void);


extern void _stext();     /* startup routine */

struct interrupt_vector const _vectab[] = {
        {0x82, (interrupt_handler_t)_stext}, /* reset */
        {0x82, NonHandledInterrupt}, /* trap  */
        {0x82, NonHandledInterrupt}, /* irq0  */
        {0x82, NonHandledInterrupt}, /* irq1  */
        {0x82, NonHandledInterrupt}, /* irq2  */
        {0x82, NonHandledInterrupt}, /* irq3  */
        {0x82, NonHandledInterrupt}, /* irq4  */
        {0x82, NonHandledInterrupt}, /* irq5  */
        {0x82, NonHandledInterrupt}, /* irq6  */
        {0x82, NonHandledInterrupt}, /* irq7  */
        {0x82, NonHandledInterrupt}, /* irq8  */
        {0x82, NonHandledInterrupt}, /* irq9  */
        {0x82, NonHandledInterrupt}, /* irq10 */
        {0x82, TIM1_OVF_IRQ}, /* irq11 每分鐘計數*/
        {0x82, NonHandledInterrupt}, /* irq12 */
        {0x82, NonHandledInterrupt}, /* irq13 */
        {0x82, NonHandledInterrupt}, /* irq14 */
        {0x82, NonHandledInterrupt}, /* irq15 */
        {0x82, NonHandledInterrupt}, /* irq16 */
        {0x82, NonHandledInterrupt}, /* irq17 */
        {0x82, NonHandledInterrupt}, /* irq18 */
        {0x82, NonHandledInterrupt}, /* irq19 */
        {0x82, NonHandledInterrupt}, /* irq20 */
        {0x82, NonHandledInterrupt}, /* irq21 */
        {0x82, NonHandledInterrupt}, /* irq22 */
        {0x82, TIM6_OVF_IRQ}, /* irq23 led閃爍 */
        {0x82, NonHandledInterrupt}, /* irq24 */
        {0x82, NonHandledInterrupt}, /* irq25 */
        {0x82, NonHandledInterrupt}, /* irq26 */
        {0x82, NonHandledInterrupt}, /* irq27 */
        {0x82, NonHandledInterrupt}, /* irq28 */
        {0x82, NonHandledInterrupt}, /* irq29 */
};

小經驗: STM8 MCU 有很多我使用的 STM8S903K3 這一顆因為腳數少(32PIN),所以定時器沒有 TIM4 ,而書本的範例 STM8S208RB(64PIN) 功能多上許多,當時花了許多時間終於找到問題!!
    這個與 8951不同 有 GPIO 所以很多地方需要單獨設定,有點不習慣!! 最不習慣的事就是 他的語法比較接近"人語",所以要參考的地方還真不少!!  學習時候一邊參考 STM8S/A Standard Peripherals Library 會讓你更了解這個 MCU的庫程式.

評分

13

查看全部評分

 樓主| 發表於 2014-6-25 11:54:13 | 顯示全部樓層
感謝幾位"老仙角"的鼓勵!! 吾當 焚膏繼晷  流血流汗 努力向前!!
發表於 2014-6-25 13:06:56 | 顯示全部樓層
antlu大,你這塊顯示37的板子是那個電器拆下來的?
不對,是337,你程式有蟲啦
發表於 2014-6-25 13:17:08 | 顯示全部樓層
你會不會覺得你每換另一種單晶,整個設備就全換了,像燒錄軟體,燒錄電路,模擬器之類的,
少則數千,動則上萬。口袋不深的人還真的玩不起。
發表於 2014-6-25 15:36:47 | 顯示全部樓層
本帖最後由 fatzeros 於 2014-6-25 03:48 PM 編輯
單晶片微電腦 發表於 2014-6-25 01:17 PM static/image/common/back.gif
你會不會覺得你每換另一種單晶,整個設備就全換了,像燒錄軟體,燒錄電路,模擬器之類的,
少則數千,動則 ...


如果不考慮模擬器的話,
以目前我覺得大宗使用的mcu來說,
STC51系列-->ATMEL AVR-->STM8S或是STM32。

其實燒錄軟體或是IDE等原廠都有免費提供:
STC ==> www.stcmcu.com 無原廠IDE
AVR ==> ATMEL STUDIO http://www.atmel.com/zh/cn/tools/atmelstudio.aspx?tab=overview
STM ==> ST TOOLSET http://www.st.com/stonline/stapp ... amp;resourcetype=SW

那麼燒錄硬體也不貴,價位都在梅花鹿以下,沒屋頂都買得到:
STC ==> http://goods.ruten.com.tw/item/show?21402207917263
AVR ==> USBASP http://search.ruten.com.tw/searc ... mp;k=USBASP&t=0
STM ==> STLINK http://search.ruten.com.tw/searc ... mp;k=STLINK&t=0
當然上面說的這些東東,在對岸買又是便宜不少!

再來說到開發板等模擬電路,
這個能自己作就自己作囉!

要不然就是使用舊有的開發板加上把新mcu單接拉線出來使用了!

現在自己玩玩可以很省錢的玩,
我跟阿乾兄的口袋都是破的,連深度都談不上啊!
但是要開發專案接case賺辛苦錢的,
必要的還是省不了啦!
 樓主| 發表於 2014-6-25 23:26:31 | 顯示全部樓層
單晶片微電腦 發表於 2014-6-25 01:17 PM static/image/common/back.gif
你會不會覺得你每換另一種單晶,整個設備就全換了,像燒錄軟體,燒錄電路,模擬器之類的,
少則數千,動則 ...

單晶片微電腦大:
   觀察細微喔!! 我這是因為 XIAOLABA大 PUSH我一下我就忍不住的丟出這個 雛型來,這好處是'拋磚引玉"!!
   這只是開始吧!! 到目前為止沒花多少錢啦!! 書本的錢很值得!!
發表於 2014-6-26 11:50:44 | 顯示全部樓層
本帖最後由 xiaolaba 於 2014-6-26 11:51 AM 編輯
antlu 發表於 2014-6-25 11:26 PM static/image/common/back.gif
單晶片微電腦大:
   觀察細微喔!! 我這是因為 XIAOLABA大 PUSH我一下我就忍不住的丟出這個 雛型來,這好處 ...


這已經很成功了.
大大, 你的牙膏管還真是耐壓, 俺再來擠多一下, 如何.
可惜俺沒時間玩, 所以還是忍耐這, 不接受你的ST8誘惑
 樓主| 發表於 2014-6-26 13:59:51 | 顯示全部樓層
xiaolaba 發表於 2014-6-26 11:50 AM static/image/common/back.gif
這已經很成功了.
大大, 你的牙膏管還真是耐壓, 俺再來擠多一下, 如何.
可惜俺沒時間玩, 所以還是忍耐這,  ...

xiaolaba大:
   後續的溫度控制就要運用到你上次提供的 PID 參數計算式了!! 第一步基本的顯示與按鍵輸入算是堪用,然後就是 A/D取溫度 以及 PWM 輸出,我猜想電路上面還會有60HZ 交流同步信號吧!!這樣控制TRIAC 才不會亂掉吧!! 走一步算一步慢慢來...
發表於 2014-6-26 16:33:07 | 顯示全部樓層
antlu大你溫度的範圍是多少?0-999?
 樓主| 發表於 2014-6-26 19:54:49 | 顯示全部樓層
單晶片微電腦 發表於 2014-6-26 04:33 PM static/image/common/back.gif
antlu大你溫度的範圍是多少?0-999?

最多到 450吧!! 要看看感溫器的條件!!當然也可以99度!!  就看要用在哪裡了!!
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

關閉

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

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

GMT+8, 2024-11-22 05:33 PM , Processed in 0.357728 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.