Bonjour à tous ,
Mon problème du jour est le suivant :
Je teste un petit de jeu fait à partir :
- Arduino UNO
- OLED 128x64 de type SSD1306 I2C ( A5 et A4 )
- Un bouton poussoir (D6)
que l'on va appeler PROGA
1) si je téléverse ce programme celui ne démarre pas, l’écran reste éteint
2) si je téléverse un autre programme totalement différent appelé PROGB avec les mêmes raccordements
ce dernier démarre normalement et l’écran s'affiche correctement
3) si je téléverse à nouveau le PROGA celui-ci se compile et consent à fonctionner normalement
4) si je coupe l'alimentation , je suis obligé de recommencer toute la procédure
j'ai renouvelé l'opération des dizaines de fois, changer les UNO (3) , changer les écrans OLED
j'ai toujours le même problème ..?
Je soupçonne fortement le traitement des entrées I2C mais sans pourvoir en identifier la raison
j'y ai aussi adjoint des résistances de 10k sur SDA et SCL
c'est pourquoi en désespoir de cause je fais appel à vos conseils
A toute fin utile
le PROGA est issu de ce modèle :
https://www.hackster.io/AlexIII/t-re...ex-game-2ed11f
je joins l'ensemble du croquis du PROGA composé de quelques sous-croquis ....
notamment celui-ci qui concerne le traitement de l'écran OLED
Le PROGA se compile normalement avec quelques erreurs comme :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123 /* * Project name: T-rex-duino * Description: T-rex game from Chrome brower rewritten for Arduino * Project page: https://github.com/AlexIII/t-rex-duino * Author: github.com/AlexIII * E-mail: endoftheworld@bk.ru * License: MIT */ #ifndef _SH1106_H_ #define _SH1106_H_ #define SH1106_I2C_SCL_CLOCK 800000UL #define SH1106_I2C_ADDR 0b01111000 #define SH1106_COMMAND 0x00 #define SH1106_DATA 0x40 #define SH1106_COLS_USED 128 #define SH1106_PAGES 8 #ifndef LCD_SSD1306 #define SH1106_COLS_TOTAL 130 #else #define SH1106_COLS_TOTAL SH1106_COLS_USED #endif template<class I2C_TYPE> class SH1106 { I2C_TYPE &i2c; const uint16_t screenBufferSize; public: enum AddressingMode { HorizontalAddressingMode = 0x00, VerticalAddressingMode = 0x01, PageAddressingMode = 0x02, }; SH1106(I2C_TYPE &i2c, const uint16_t screenBufferSize): i2c(i2c), screenBufferSize(screenBufferSize) {} void begin() { uint8_t col = 0; uint8_t page = 0; } void fillScreen(const uint8_t* buffer) { reinit(); sendd(buffer, screenBufferSize); } void fillScreen(const uint8_t* buffer, const uint16_t size, const uint8_t stride = 0) { //stride is not supported reinit(); sendd(buffer, size); } void setInverse(const bool v) { inverted = v; reinit(); } //Only PageAddressingMode works for SH1106 //Here we're emulating HorizontalAddressingMode programmatically void setAddressingMode(const AddressingMode addressingMode) {} private: /* lcd control */ void reinit() { i2c.deinit(); i2c.init(SH1106_I2C_SCL_CLOCK); sendc(0xAF); //display on sendc(inverted? 0xA7 : 0xA6); //inversion } /* send bytes */ void sendc(const uint8_t cmd) { i2c.start(SH1106_I2C_ADDR); i2c.write(SH1106_COMMAND); i2c.write(cmd); i2c.stop(); } void sendc(const uint8_t cmd1, const uint8_t cmd2) { i2c.start(SH1106_I2C_ADDR); i2c.write(SH1106_COMMAND); i2c.write(cmd1); i2c.write(cmd2); i2c.stop(); } void sendc(const uint8_t cmd1, const uint8_t cmd2, const uint8_t cmd3) { i2c.start(SH1106_I2C_ADDR); i2c.write(SH1106_COMMAND); i2c.write(cmd1); i2c.write(cmd2); i2c.write(cmd3); i2c.stop(); } void sendd(const uint8_t* d, uint16_t sz) { const uint8_t blackPx = inverted? 0xFF : 0; while(sz) { //page cycle sendc(0xB0 + page); //set page address to i (0..7) sendc(0x00 + (col&0x0F)); //Sets 4 lower bits of column address sendc(0x10 + (col>>4)); //Sets 4 higher bits of column address i2c.start(SH1106_I2C_ADDR); i2c.write(SH1106_DATA); while(sz) { //column cycle i2c.write(*d++); --sz; if(++col >= SH1106_COLS_USED) { while(col++ < SH1106_COLS_TOTAL) i2c.write(blackPx); col = 0; break; } } i2c.stop(); if(col == 0 && ++page >= SH1106_PAGES) page = 0; } } uint8_t col = 0; uint8_t page = 0; bool inverted = false; }; #endif
In file included from ...\T-Rex-duino - Clone Arduino du jeu\t-rex-duino-1.1\t-rex-duino\t-rex-duino.ino:105:0:
...\T-Rex-duino - Clone Arduino du jeu\t-rex-duino-1.1\t-rex-duino\SH1106.h: In instantiation of 'void SH1106<I2C_TYPE>::fillScreen(const uint8_t*, uint16_t, uint8_t) [with I2C_TYPE = I2C; uint8_t = unsigned char; uint16_t = unsigned int]':
...\T-Rex-duino - Clone Arduino du jeu\t-rex-duino-1.1\t-rex-duino\t-rex-duino.ino:201:93: required from here
...\T-Rex-duino - Clone Arduino du jeu\t-rex-duino-1.1\t-rex-duino\SH1106.h:48:86: warning: unused parameter 'stride' [-Wunused-parameter]
void fillScreen(const uint8_t* buffer, const uint16_t size, const uint8_t stride = 0) { //stride is not supported
^
...\T-Rex-duino - Clone Arduino du jeu\t-rex-duino-1.1\t-rex-duino\SH1106.h: In instantiation of 'void SH1106<I2C_TYPE>::setAddressingMode(SH1106<I2C_TYPE>::AddressingMode) [with I2C_TYPE = I2C]':
..\T-Rex-duino - Clone Arduino du jeu\t-rex-duino-1.1\t-rex-duino\t-rex-duino.ino:274:53: required from here
..\T-Rex-duino - Clone Arduino du jeu\t-rex-duino-1.1\t-rex-duino\SH1106.h:59:47: warning: unused parameter 'addressingMode' [-Wunused-parameter]
void setAddressingMode(const AddressingMode addressingMode) {}
^~~~~~~~~~~~~~
...\T-Rex-duino - Clone Arduino du jeu\t-rex-duino-1.1\t-rex-duino\SH1106.h: In instantiation of 'void SH1106<I2C_TYPE>::begin() [with I2C_TYPE = I2C]':
...\T-Rex-duino - Clone Arduino du jeu\t-rex-duino-1.1\t-rex-duino\t-rex-duino.ino:287:13: required from here
...\T-Rex-duino - Clone Arduino du jeu\t-rex-duino-1.1\t-rex-duino\SH1106.h:40:13: warning: unused variable 'col' [-Wunused-variable]
uint8_t col = 0;
^~~
...\T-Rex-duino - Clone Arduino du jeu\t-rex-duino-1.1\t-rex-duino\SH1106.h:41:13: warning: unused variable 'page' [-Wunused-variable]
uint8_t page = 0;
^~~~
Le croquis utilise 12872 octets (39%) de l'espace de stockage de programmes. Le maximum est de 32256 octets.
Les variables globales utilisent 449 octets (21%) de mémoire dynamique, ce qui laisse 1599 octets pour les variables locales. Le maximum est de 2048 octets.
en vous remerciant
pascal
Partager