找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
12
返回列表 發(fā)新帖
樓主: xxll
打印 上一主題 下一主題
收起左側(cè)

PIC單片機(jī)輸出不了占空比50%的方波——幫扶一把學(xué)單片機(jī)的60后

  [復(fù)制鏈接]
41#
ID:27513 發(fā)表于 2021-12-2 08:22 | 只看該作者
大家好,由于這幾天忙沒(méi)有及時(shí)跟帖。在這里謝謝大家對(duì)我學(xué)習(xí)的支持,尤其是@ 188610329 和@ Y_G_G 兩位網(wǎng)友老師。在你們細(xì)心的引導(dǎo)下,使我的問(wèn)題得到正確的答案:端口沒(méi)有正確的初始化!是我沒(méi)有認(rèn)真細(xì)心的閱讀說(shuō)明書(shū),造成的后果。只要在IO_init()函數(shù)內(nèi)加入ANSEL=0X00;與CMCON0=0x07;(尤其是CMCON0這個(gè)寄存器絕對(duì)不能不初始化)我的問(wèn)題基本就解決了……

GPIO端口.jpg (196.11 KB, 下載次數(shù): 220)

GPIO端口.jpg
回復(fù)

使用道具 舉報(bào)

42#
ID:27513 發(fā)表于 2021-12-2 08:45 | 只看該作者
taotie 發(fā)表于 2021-11-28 00:10
相差無(wú)幾
時(shí)鐘8Mhz,標(biāo)志判斷的內(nèi)容由死循環(huán)轉(zhuǎn)到中斷子程序中。
初值設(shè)置為225    ...

你的程序我也測(cè)試了,示波器上的波形不穩(wěn)定,一會(huì)正常一會(huì)跳變成窄寬不等的波形。還有你這種方式我個(gè)人覺(jué)得不妥,如果在主程序中加入按鍵掃描和指示燈閃爍,這種方式就更無(wú)法正常輸出頻率穩(wěn)定的方波了。你認(rèn)為呢?
回復(fù)

使用道具 舉報(bào)

43#
ID:27513 發(fā)表于 2021-12-2 11:05 | 只看該作者
這個(gè)波形圖是中斷子程序
void interrupt isr(void)   //中斷子程序
{
TMR0=224;
T0IF=0;
GP1=!GP1;
GP2=!GP1;
}
之圖

GP1正脈寬為24.8us,負(fù)脈寬為25.4us,正負(fù)之差0.6uS;GP2比GP1滯后3us
這時(shí)GP1與GP2合成的波形即示波器探頭接GP1地夾GP2


下面是網(wǎng)友 Y_G_G 提供的子程序波形圖
void interrupt isr(void)   //中斷子程序
                {
                TMR0=224; //定時(shí)器0置初值25us               
                T0IF=0;    //清中斷標(biāo)志                               
                if(ON)
                        {
                        GP2=0;       
                        GP1=1;
               
                        ON=0;
                        }

                else
                        {
                       
                        GP1=0;
                        GP2=1;
                        ON=1;                       
                        }



GP1正負(fù)脈寬差也是0.6us,但GP1與GP2合成波延時(shí)時(shí)差不明顯



下面是一款小產(chǎn)品上測(cè)得的波形它的正負(fù)脈寬差只有0.2us


合成波形很順滑沒(méi)有中間的延遲現(xiàn)象


到此我又有新的問(wèn)題要問(wèn)了:這個(gè)產(chǎn)品的波形是怎樣做到呢?

回復(fù)

使用道具 舉報(bào)

44#
ID:401564 發(fā)表于 2021-12-2 11:26 | 只看該作者
xxll 發(fā)表于 2021-12-2 11:05
這個(gè)波形圖是中斷子程序
void interrupt isr(void)   //中斷子程序
{

這GP1和GP0是在同一個(gè)端口的嗎?沒(méi)有看數(shù)據(jù)手冊(cè),不知道
不同端口的話,那是要兩條指令,那是肯定要有延時(shí)的
如果是同一個(gè)端口,那就是一條指令就行了if(ON)
                        {
                       PORTD=0x01;//假設(shè)是RD端口輸出
               
                        ON=0;
                        }

                else
                        {
                       
                        PORTD=0x02;
                        ON=1;                       
                        }
回復(fù)

使用道具 舉報(bào)

45#
ID:27513 發(fā)表于 2021-12-2 11:43 | 只看該作者
本帖最后由 xxll 于 2021-12-2 12:03 編輯
Y_G_G 發(fā)表于 2021-12-2 11:26
這GP1和GP0是在同一個(gè)端口的嗎?沒(méi)有看數(shù)據(jù)手冊(cè),不知道
不同端口的話,那是要兩條指令,那是肯定要有延時(shí)的 ...

不是同一端口,原來(lái)是GP0與GP1,現(xiàn)在改為GP1與GP2了,其實(shí)道理是一樣的廳
是我理解錯(cuò)了是同一個(gè)端口寄存器,因?yàn)橹挥?個(gè)引腳的單片機(jī)。
回復(fù)

使用道具 舉報(bào)

46#
ID:401564 發(fā)表于 2021-12-2 12:03 | 只看該作者
xxll 發(fā)表于 2021-12-2 11:43
不是同一端口,原來(lái)是GP0與GP1,現(xiàn)在改為GP1與GP2了,其實(shí)道理是一樣的

GPIO就是一個(gè)端口的好不好,直接賦值GPIO端口應(yīng)該就可以得到你要波形了{
                       GPIO=0x01;//GP0   GP1輸出,自己也可以改其它的IO,如果不想影響其它IO,可以用&
               
                        ON=0;
                        }

                else
                        {
                       
                        GPIO=0x02;
                        ON=1;                       
                        }
回復(fù)

使用道具 舉報(bào)

47#
ID:624769 發(fā)表于 2021-12-2 13:40 | 只看該作者
老哥,如果你要實(shí)現(xiàn) 產(chǎn)品副本.jpg 那樣的波形的話,你改寫(xiě)端口的指令必須修改。

void interrupt isr(void)   //中斷子程序
{
TMR0=224;
T0IF=0;
GPIO |= 0x06;      // 要用字節(jié)改寫(xiě) GPIO總線, 而不是用位改寫(xiě) IO
}
回復(fù)

使用道具 舉報(bào)

48#
ID:27513 發(fā)表于 2021-12-2 17:44 | 只看該作者
188610329 發(fā)表于 2021-12-2 13:40
老哥,如果你要實(shí)現(xiàn) 產(chǎn)品副本.jpg 那樣的波形的話,你改寫(xiě)端口的指令必須修改。

void interrupt isr(voi ...

你好,這個(gè)或運(yùn)算是如何實(shí)現(xiàn)的,我不懂啦。如0x06=0b00000110,若原GPIO=0b00000010或運(yùn)算后它不還是0b00000110嗎?
回復(fù)

使用道具 舉報(bào)

49#
ID:401564 發(fā)表于 2021-12-2 17:49 | 只看該作者
xxll 發(fā)表于 2021-12-2 17:44
你好,這個(gè)或運(yùn)算是如何實(shí)現(xiàn)的,我不懂啦。如0x06=0b00000110,若原GPIO=0b00000010或運(yùn)算后它不還是0b000 ...

GPIO |= 0x06;
這個(gè)是不行的,或指令不能輸出低電平的
你自己也要思考一下的嘛
肯定是要用&的嘛
回復(fù)

使用道具 舉報(bào)

50#
ID:624769 發(fā)表于 2021-12-2 17:56 來(lái)自觸屏版 | 只看該作者
Y_G_G 發(fā)表于 2021-12-2 17:49
GPIO |= 0x06;
這個(gè)是不行的,或指令不能輸出低電平的
你自己也要思考一下的嘛

打錯(cuò)了gpio^=0x06
回復(fù)

使用道具 舉報(bào)

51#
ID:27513 發(fā)表于 2021-12-2 17:58 | 只看該作者
Y_G_G 發(fā)表于 2021-12-2 17:49
GPIO |= 0x06;
這個(gè)是不行的,或指令不能輸出低電平的
你自己也要思考一下的嘛

我不說(shuō)過(guò)我是個(gè)門(mén)外漢嗎!與我也不會(huì)呀
回復(fù)

使用道具 舉報(bào)

52#
ID:624769 發(fā)表于 2021-12-2 18:03 來(lái)自觸屏版 | 只看該作者
xxll 發(fā)表于 2021-12-2 17:44
你好,這個(gè)或運(yùn)算是如何實(shí)現(xiàn)的,我不懂啦。如0x06=0b00000110,若原GPIO=0b00000010或運(yùn)算后它不還是0b000 ...

抱歉,是我的鍋,沒(méi)復(fù)驗(yàn)就發(fā)了。
應(yīng)該是
gpio ^= 0x06;   與或計(jì)算,即1變0,0變1。手機(jī)發(fā)帖排版大小寫(xiě)就不修改了。
回復(fù)

使用道具 舉報(bào)

53#
ID:139866 發(fā)表于 2021-12-2 18:04 | 只看該作者
xxll 發(fā)表于 2021-12-2 17:44
你好,這個(gè)或運(yùn)算是如何實(shí)現(xiàn)的,我不懂啦。如0x06=0b00000110,若原GPIO=0b00000010或運(yùn)算后它不還是0b000 ...

GPIO |= 0x06;//這個(gè)1,2位輸出高電平,不改變其他位
GPIO &= 0XF9;//這個(gè)1,2位輸出低電平,同樣不改變其他位
回復(fù)

使用道具 舉報(bào)

54#
ID:401564 發(fā)表于 2021-12-2 18:54 | 只看該作者
xxll 發(fā)表于 2021-12-2 17:58
我不說(shuō)過(guò)我是個(gè)門(mén)外漢嗎!與我也不會(huì)呀

門(mén)外漢不是理由
與或非編程基礎(chǔ)類(lèi)知道,不管是你半路出家還是科班出身,不管你專(zhuān)業(yè)人士還業(yè)余愛(ài)好,也不管你是長(zhǎng)期愛(ài)好還是一時(shí)性起
這基礎(chǔ)知道是肯定要學(xué)的,如果不想學(xué),那就不要搞單片機(jī)了
不是打擊你,而是沒(méi)有基礎(chǔ)的話,那這單片機(jī)玩起來(lái)實(shí)在太累了,還浪費(fèi)時(shí)間
從你這個(gè)問(wèn)題就可以看出來(lái)了,如果當(dāng)初,你多花一個(gè)小時(shí)的時(shí)間去看一下端口設(shè)置,那你就不會(huì)在這50%占空比上面花那么多的時(shí)間和精力
個(gè)人感覺(jué),很多時(shí)候,一個(gè)自己幾天甚至半個(gè)月都搞不定的東西,很有可能只是一個(gè)簡(jiǎn)單的東西而已,只是自己沒(méi)有嚴(yán)謹(jǐn)認(rèn)真的去看相關(guān)的資料而已
我之前就經(jīng)常碰到這樣的問(wèn)題,一個(gè)小小的東西,搞幾天都搞不好,怎么找都找不到問(wèn)題,最后干脆之前的代碼都不要,從頭再看資料,一步一步的來(lái),一下子就發(fā)現(xiàn)問(wèn)題了,而且,不過(guò)是一個(gè)很基礎(chǔ)很簡(jiǎn)的問(wèn)題而已,只是自己老是鉆牛角尖而已
所以,基礎(chǔ)很重要,不管你多大年紀(jì),不管你是出什么目的學(xué)單片機(jī),多看一下基礎(chǔ),不會(huì)有壞處
回復(fù)

使用道具 舉報(bào)

12
返回列表 發(fā)新帖

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表