shihaipeng04 发表于 2014-3-15 23:48:10

Super169 发表于 2014-3-15 23:35 static/image/common/back.gif
把 font8x16 刪去大部份, 只餘下最前 11 個 characters (即 最後為"*"), 是可以在 UNO 上行了 (當然, 只可以 ...

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

Super169 发表于 2014-3-16 00:25:56

本帖最后由 Super169 于 2014-3-16 00:27 编辑

shihaipeng04 发表于 2014-3-15 23:48 static/image/common/back.gif
我估计是 setfont的时候,还是要在内存里建一个临时的数组,好像又没有清除他的地方,所以再建另一个字体 ...

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

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

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

void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
    Serial.println("By variable:");
int i;      
for(i=0;i < 4;i++)
{
   Serial.print(i);
   Serial.print(":");
   Serial.print(font8x16);
   Serial.println(" ");
}

Serial.println("Fixed value:");
Serial.print(font8x16);
Serial.print(":");
Serial.print(font8x16);
Serial.print(":");
Serial.print(font8x16);
Serial.print(":");
Serial.print(font8x16);
Serial.println(" ");
}

void loop() {
// put your main code here, to run repeatedly:

}


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

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


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


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




請問這結果正常嗎?

shihaipeng04 发表于 2014-3-16 00:26:55

Super169 发表于 2014-3-16 00:25 static/image/common/back.gif
我快要瘋了, 那個 PROGMEM 好像有點怪.攪了老半天都是出錯, 終於把問題簡化了....

請幫忙試試以下 s ...

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

我研究 pgmspace的帖子

Super169 发表于 2014-3-16 00:33:43

shihaipeng04 发表于 2014-3-16 00:26 static/image/common/back.gif
pgmspace.h的非理论性研究 - Powered by Discuz!
http://www.geek-workshop.com/thread-8929-1-1.html
...

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

font8x16= 0



font8x16 = 8

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

但當 font8x16 不是 PROGMEM 時, 問題就解決了.

Super169 发表于 2014-3-16 00:42:39

shihaipeng04 发表于 2014-3-16 00:26 static/image/common/back.gif
pgmspace.h的非理论性研究 - Powered by Discuz!
http://www.geek-workshop.com/thread-8929-1-1.html
...

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

#include <avr/pgmspace.h>

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


void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
    Serial.println("By variable:");
int i, j;      
for(i=0;i < 4;i++)
{
   Serial.print(i);
   Serial.print(":");
   Serial.print(font8x16);
   Serial.print(":");
   j = pgm_read_byte(&font8x16);
   Serial.print(j);
   Serial.println(" ");
}

Serial.println("Fixed value:");
Serial.print(font8x16);
Serial.print(":");
Serial.print(font8x16);
Serial.print(":");
Serial.print(font8x16);
Serial.print(":");
Serial.print(font8x16);
Serial.println(" ");
}

void loop() {
// put your main code here, to run repeatedly:

}


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


用 pgm_read_byte 讀出的資料是正確, 但直接用 font8x16 就會出現錯誤資料....

Super169 发表于 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, 還需要努力一下.

Super169 发表于 2014-3-16 01:02:20

當加回 Fonts.c 時, 又出事了....當中的 #define PROGMEM 好像有問題.
這樣子 define PROGMEM, 是否會把 variable 中的 PROGMEM 變成無效?

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

shihaipeng04 发表于 2014-3-16 01:10:00

Super169 发表于 2014-3-16 01:02 static/image/common/back.gif
當加回 Fonts.c 時, 又出事了....當中的 #define PROGMEM 好像有問題.
這樣子 define PROGMEM, 是否會把 v ...

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

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

Super169 发表于 2014-3-16 02:14:20

shihaipeng04 发表于 2014-3-16 01:10 static/image/common/back.gif
最新发现,对于花屏的处理办法。

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

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

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



再 debug 一段時間, 就可以放出來了.

Super169 发表于 2014-3-16 02:27:30

8x16 的字型, 小階部份比 6x8 的差很多, 看圖中左上的 m 字, 並不是程式出錯, 而是字庫真的少了右邊的直線...

shihaipeng04 发表于 2014-3-16 02:36:06

Super169 发表于 2014-3-16 02:27 static/image/common/back.gif
8x16 的字型, 小階部份比 6x8 的差很多, 看圖中左上的 m 字, 並不是程式出錯, 而是字庫真的少了右邊的直線. ...

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

其实产品无所谓了,现在你的技术肯定是提高了。哈哈

Super169 发表于 2014-3-16 02:47:29

shihaipeng04 发表于 2014-3-16 02:36 static/image/common/back.gif
吼吼。恭喜恭喜。 还有个坏消息,据卖家说,过不了多久1,2周不到吧,他们会出个新版的真的实现I2C的屏来。 ...

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

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

Super169 发表于 2014-3-16 03:10:48

大致修改好了, 可以在 UNO 上同時使用幾個字型, 圖片也可以放到 flash 上.
美中不足是自己加圖時要放到庫內, 並修改當中設定.遲下或者多加一個 method, 可以接受外加圖片.

有興趣可以試試.


原程式來自 code-AR 大大的帖: IIC_without_ACK
感謝 code-AR 的分享, 基本上都是用回大大的設定, 只是改成直接使用 flash memory.
如在 Mega 之類有較多 SRAM 的控制卡上使用, 不一定要搬到 flash memory 的.

Super169 发表于 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 的一片?有沒有什麼地方要注意 (例如電壓/電流之類)才可以使用?

zh68a11 发表于 2020-8-2 17:19:01

真迷你,:)
页: 1 2 [3]
查看完整版本: 搞了2个oled的小屏幕玩玩