极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

123
返回列表 发新帖
楼主: shihaipeng04

搞了2个oled的小屏幕玩玩

[复制链接]
 楼主| 发表于 2014-3-15 23:48:10 | 显示全部楼层
Super169 发表于 2014-3-15 23:35
把 font8x16 刪去大部份, 只餘下最前 11 個 characters (即 最後為"*"), 是可以在 UNO 上行了 (當然, 只可以 ...

我估计是 setfont的时候,还是要在内存里建一个临时的数组,好像又没有清除他的地方,所以再建另一个字体的就爆仓了。
回复 支持 反对

使用道具 举报

发表于 2014-3-16 00:25:56 | 显示全部楼层
本帖最后由 Super169 于 2014-3-16 00:27 编辑
shihaipeng04 发表于 2014-3-15 23:48
我估计是 setfont的时候,还是要在内存里建一个临时的数组,好像又没有清除他的地方,所以再建另一个字体 ...


我快要瘋了, 那個 PROGMEM 好像有點怪.  攪了老半天都是出錯, 終於把問題簡化了....

請幫忙試試以下 sketch, 你認為結果會是怎樣?  

  1. uint8_t PROGMEM font8x16[] ={
  2.   0x08,0x10,0x20,0x10,
  3.   0x00,0x00,0xC0,0x30,0xC0,0x00,0x00,0x00,0x18,0x07,0x04,0x04,0x04,0x07,0x18,0x00,//A 33
  4. };

  5. void setup() {
  6.   // put your setup code here, to run once:
  7.   Serial.begin(9600);
  8.     Serial.println("By variable:");
  9.   int i;      
  10.   for(i=0;i < 4;i++)
  11.   {
  12.      Serial.print(i);
  13.      Serial.print(":");
  14.      Serial.print(font8x16[i]);
  15.      Serial.println(" ");
  16.   }

  17.   Serial.println("Fixed value:");
  18.   Serial.print(font8x16[0]);
  19.   Serial.print(":");
  20.   Serial.print(font8x16[1]);
  21.   Serial.print(":");
  22.   Serial.print(font8x16[2]);
  23.   Serial.print(":");
  24.   Serial.print(font8x16[3]);
  25.   Serial.println(" ");
  26. }

  27. void loop() {
  28.   // put your main code here, to run repeatedly:
  29.   
  30. }
复制代码



結果用不同方式讀出來的結果竟然會不同.

By variable:
0:0
1:0
2:2
3:0
Fixed value:
8:16:32:16


同樣是 font8x16[0], 如果用 font8x16[k] 會得到 0, 而 font8x16[0] 就可以得到正確的 8.


再試試剛去當中的 PROGMEM, 結果就正常了:
By variable:
0:8
1:16
2:32
3:16
Fixed value:
8:16:32:16




請問這結果正常嗎?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-16 00:26:55 | 显示全部楼层
Super169 发表于 2014-3-16 00:25
我快要瘋了, 那個 PROGMEM 好像有點怪.  攪了老半天都是出錯, 終於把問題簡化了....

請幫忙試試以下 s ...

pgmspace.h的非理论性研究 - Powered by Discuz!
http://www.geek-workshop.com/thread-8929-1-1.html

我研究 pgmspace的帖子
回复 支持 反对

使用道具 举报

发表于 2014-3-16 00:33:43 | 显示全部楼层
shihaipeng04 发表于 2014-3-16 00:26
pgmspace.h的非理论性研究 - Powered by Discuz!
http://www.geek-workshop.com/thread-8929-1-1.html
...

我還是攪不懂, 為什麼當 k=0 時,

font8x16[k]  = 0



font8x16[0] = 8

當中, font8x16 的第一個 byte 是 8 的, 只是用 variable 去 找是, 出錯了....
怎可能不用 variable 去讀取 array 中的資料?

但當 font8x16 不是 PROGMEM 時, 問題就解決了.
回复 支持 反对

使用道具 举报

发表于 2014-3-16 00:42:39 | 显示全部楼层
shihaipeng04 发表于 2014-3-16 00:26
pgmspace.h的非理论性研究 - Powered by Discuz!
http://www.geek-workshop.com/thread-8929-1-1.html
...

找到了, 原來如果是用 variable 作 index, 要用 pgm_read_byte 去讀取 (不明白...)
改成造樣就清楚了:

  1. #include <avr/pgmspace.h>

  2. uint8_t PROGMEM font8x16[] ={
  3.   0x08,0x10,0x20,0x10,
  4.   0x00,0x00,0xC0,0x30,0xC0,0x00,0x00,0x00,0x18,0x07,0x04,0x04,0x04,0x07,0x18,0x00,//A 33
  5. };


  6. void setup() {
  7.   // put your setup code here, to run once:
  8.   Serial.begin(9600);
  9.     Serial.println("By variable:");
  10.   int i, j;      
  11.   for(i=0;i < 4;i++)
  12.   {
  13.      Serial.print(i);
  14.      Serial.print(":");
  15.      Serial.print(font8x16[i]);
  16.      Serial.print(":");
  17.      j = pgm_read_byte(&font8x16[i]);
  18.      Serial.print(j);
  19.      Serial.println(" ");
  20.   }

  21.   Serial.println("Fixed value:");
  22.   Serial.print(font8x16[0]);
  23.   Serial.print(":");
  24.   Serial.print(font8x16[1]);
  25.   Serial.print(":");
  26.   Serial.print(font8x16[2]);
  27.   Serial.print(":");
  28.   Serial.print(font8x16[3]);
  29.   Serial.println(" ");
  30. }

  31. void loop() {
  32.   // put your main code here, to run repeatedly:
  33.   
  34. }
复制代码



結果是:
By variable:
0:0:8
1:0:16
2:2:32
3:0:16
Fixed value:
8:16:32:16


用 pgm_read_byte 讀出的資料是正確, 但直接用 font8x16[k] 就會出現錯誤資料....
回复 支持 反对

使用道具 举报

发表于 2014-3-16 00:46:09 | 显示全部楼层
本帖最后由 Super169 于 2014-3-16 00:51 编辑

找到這問題的答案, 就證明到 oledfont.c 當中的字庫, 原來一直都沒放到 flash 中了, 所以 font8x16 會出事.
因為 II_without_ACK 當中, 是沒有用 pgm_read_byte 去讀取資料, 如果資料是放在 PROGMEM 當中, 讀出的資料就會是錯了.

現在可以使用 8x16 font 了, 但字庫要放在 ino 當中, 並且加入一個 句 專用的 print function (就是改了用 pgm_read_byte 去讀取字庫).
但這樣就不能變成一個 library, 還需要努力一下.
回复 支持 反对

使用道具 举报

发表于 2014-3-16 01:02:20 | 显示全部楼层
當加回 Fonts.c 時, 又出事了....當中的 #define PROGMEM 好像有問題.
這樣子 define PROGMEM, 是否會把 variable 中的 PROGMEM 變成無效?

難道因為原作發覺直讀時資料出錯, 強力再 define PROGMEM, 結果把資料放回 SRAM, 才可以直讀?
這個 define PROGMEM 應該是沒必要的, 嘗試把讀 font 的也改成 pgm_read_byte, 或者可以把 font8x16 放入庫內.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-16 01:10:00 | 显示全部楼层
Super169 发表于 2014-3-16 01:02
當加回 Fonts.c 時, 又出事了....當中的 #define PROGMEM 好像有問題.
這樣子 define PROGMEM, 是否會把 v ...

最新发现,对于花屏的处理办法。

当更换的程序,比如之前的程序并不是针对屏幕的操作程序,往往更新了oled屏幕的程序后,会花屏。这个时候重启arduino不管用,拆掉屏幕,短路屏幕的vcc和gnd管脚(疑似屏幕上有电容,具体原因我也不知道),然后重新接线,一般屏幕是全黑的。重启arduino一般就正常了。
回复 支持 反对

使用道具 举报

发表于 2014-3-16 02:14:20 | 显示全部楼层
shihaipeng04 发表于 2014-3-16 01:10
最新发现,对于花屏的处理办法。

当更换的程序,比如之前的程序并不是针对屏幕的操作程序,往往更新了 ...

花畫面有很多可能, 有可能是硬件, 也可以是軟件.
如果一開始便花, 我也會嘗試再插一兩次.  再花的話, 就嘗試 re-load 一個已個正常的 sketch.

剛剛把文件修改了, 真正可用 PROGMEM 了, 現在多個不同的 fonts 可以共存, 而且都在 庫內完全定義好, 使用時不用理會.

20140316-01.jpg

再 debug 一段時間, 就可以放出來了.
回复 支持 反对

使用道具 举报

发表于 2014-3-16 02:27:30 | 显示全部楼层
8x16 的字型, 小階部份比 6x8 的差很多, 看圖中左上的 m 字, 並不是程式出錯, 而是字庫真的少了右邊的直線...
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-16 02:36:06 | 显示全部楼层
Super169 发表于 2014-3-16 02:27
8x16 的字型, 小階部份比 6x8 的差很多, 看圖中左上的 m 字, 並不是程式出錯, 而是字庫真的少了右邊的直線. ...

吼吼。恭喜恭喜。 还有个坏消息,据卖家说,过不了多久1,2周不到吧,他们会出个新版的真的实现I2C的屏来。据说会贵一点,但是卖家说能优惠提供几个研究用的样品。

其实产品无所谓了,现在你的技术肯定是提高了。哈哈
回复 支持 反对

使用道具 举报

发表于 2014-3-16 02:47:29 | 显示全部楼层
shihaipeng04 发表于 2014-3-16 02:36
吼吼。恭喜恭喜。 还有个坏消息,据卖家说,过不了多久1,2周不到吧,他们会出个新版的真的实现I2C的屏来。 ...

oh... 那...不知是好還是壞了.
有硬件 I2C 的, 可以省下兩個 IO, 總會是好事.

不知新的庫是否可直接使用, 希望今次不用太費神去修改吧.
回复 支持 反对

使用道具 举报

发表于 2014-3-16 03:10:48 | 显示全部楼层
大致修改好了, 可以在 UNO 上同時使用幾個字型, 圖片也可以放到 flash 上.
美中不足是自己加圖時要放到庫內, 並修改當中設定.  遲下或者多加一個 method, 可以接受外加圖片.

有興趣可以試試.
myOLED_SSD1306.zip (9.62 KB, 下载次数: 9)
回复 支持 反对

使用道具 举报

发表于 2014-3-16 04:01:52 | 显示全部楼层
請問你兩片都是 0.96 的嗎?
我也是買了兩片, 一片是 0.96雙色, 那一片是 1.3 的.
1.3 那片應該是 I2C 的, 用 A4/A5 接口, 但我那片不知什麼原因, 剛買回來時, 間中才有畫面, 而且只有全白.
把程式中畫面填滿的一句刪走, 突然就可以顥示了, 但間中又花畫面.
再測試了幾次, 突然不再有畫面了, 現在只有全黑一片....
店家說 1.3 比 0.96 更穩定, 但我的 0.96 已攪好了, 開始再研究 1.3 的一片, 但完全沒法顯示.

不知你有沒有買 1.3 的一片?  有沒有什麼地方要注意 (例如電壓/電流之類)才可以使用?  
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊 ( 浙ICP备09023225号 )

GMT+8, 2020-9-28 01:41 , Processed in 0.053633 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表