久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

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

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

GPIO端口.jpg
回復

使用道具 舉報

42#
ID:27513 發表于 2021-12-2 08:45 | 只看該作者
taotie 發表于 2021-11-28 00:10
相差無幾
時鐘8Mhz,標志判斷的內容由死循環轉到中斷子程序中。
初值設置為225    ...

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

使用道具 舉報

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

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


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

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



GP1正負脈寬差也是0.6us,但GP1與GP2合成波延時時差不明顯



下面是一款小產品上測得的波形它的正負脈寬差只有0.2us


合成波形很順滑沒有中間的延遲現象


到此我又有新的問題要問了:這個產品的波形是怎樣做到呢?

回復

使用道具 舉報

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

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

                else
                        {
                       
                        PORTD=0x02;
                        ON=1;                       
                        }
回復

使用道具 舉報

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

不是同一端口,原來是GP0與GP1,現在改為GP1與GP2了,其實道理是一樣的廳
是我理解錯了是同一個端口寄存器,因為只有8個引腳的單片機。
回復

使用道具 舉報

46#
ID:401564 發表于 2021-12-2 12:03 | 只看該作者
xxll 發表于 2021-12-2 11:43
不是同一端口,原來是GP0與GP1,現在改為GP1與GP2了,其實道理是一樣的

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

                else
                        {
                       
                        GPIO=0x02;
                        ON=1;                       
                        }
回復

使用道具 舉報

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

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

使用道具 舉報

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

void interrupt isr(voi ...

你好,這個或運算是如何實現的,我不懂啦。如0x06=0b00000110,若原GPIO=0b00000010或運算后它不還是0b00000110嗎?
回復

使用道具 舉報

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

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

使用道具 舉報

50#
ID:624769 發表于 2021-12-2 17:56 來自手機 | 只看該作者
Y_G_G 發表于 2021-12-2 17:49
GPIO |= 0x06;
這個是不行的,或指令不能輸出低電平的
你自己也要思考一下的嘛

打錯了gpio^=0x06
回復

使用道具 舉報

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

我不說過我是個門外漢嗎!與我也不會呀
回復

使用道具 舉報

52#
ID:624769 發表于 2021-12-2 18:03 來自手機 | 只看該作者
xxll 發表于 2021-12-2 17:44
你好,這個或運算是如何實現的,我不懂啦。如0x06=0b00000110,若原GPIO=0b00000010或運算后它不還是0b000 ...

抱歉,是我的鍋,沒復驗就發了。
應該是
gpio ^= 0x06;   與或計算,即1變0,0變1。手機發帖排版大小寫就不修改了。
回復

使用道具 舉報

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

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

使用道具 舉報

54#
ID:401564 發表于 2021-12-2 18:54 | 只看該作者
xxll 發表于 2021-12-2 17:58
我不說過我是個門外漢嗎!與我也不會呀

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

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美精品一级 | 麻豆国产一区二区三区四区 | 国产成人精品一区 | 亚洲激情av | 久久美国 | 亚洲成人三区 | 日本天天操 | 亚洲国产精品一区二区三区 | 国产福利在线 | 中文字幕在线视频网站 | 美女天天干天天操 | 欧美电影免费网站 | 国产精品久久久久久高潮 | 黄色免费看 | 狠狠色综合网站久久久久久久 | 福利电影在线 | 亚洲视频 欧美视频 | 天天草天天射 | 狠狠操天天干 | 欧美日韩国产在线观看 | 亚洲区一区二 | 免费av在线网站 | 久久久一区二区三区 | 色一情一乱一伦一区二区三区 | 中文字幕欧美一区二区 | 日本在线黄色 | 欧美一级大黄 | 日韩免费视频 | 亚洲精品视频在线播放 | 在线91| 日本精品视频一区二区三区四区 | 欧美高清视频 | 一区中文 | 国产精品日韩一区 | 日韩一区二区成人 | 国产aaaaav久久久一区二区 | 精品亚洲国产成av人片传媒 | 国产精品18hdxxxⅹ在线 | 亚洲精品3| 成人一级黄色毛片 | 激情久久网 |