Browse Source

Merge pull request #4148 from thinkyhead/3drag_delay_anhardt

Fix up delays in ST7920_SWSPI_SND_8BIT
Scott Lahteine 9 years ago
parent
commit
815000ff32
1 changed files with 64 additions and 16 deletions
  1. 64
    16
      Marlin/ultralcd_st7920_u8glib_rrd.h

+ 64
- 16
Marlin/ultralcd_st7920_u8glib_rrd.h View File

@@ -27,9 +27,6 @@
27 27
 
28 28
 #if ENABLED(U8GLIB_ST7920)
29 29
 
30
-//set optimization so ARDUINO optimizes this file
31
-#pragma GCC optimize (3)
32
-
33 30
 #define ST7920_CLK_PIN  LCD_PINS_D4
34 31
 #define ST7920_DAT_PIN  LCD_PINS_ENABLE
35 32
 #define ST7920_CS_PIN   LCD_PINS_RS
@@ -43,20 +40,70 @@
43 40
 
44 41
 #include <U8glib.h>
45 42
 
43
+//set optimization so ARDUINO optimizes this file
44
+#pragma GCC optimize (3)
45
+
46
+#define DELAY_0_NOP  NOOP
47
+#define DELAY_1_NOP  __asm__("nop\n\t")
48
+#define DELAY_2_NOP  __asm__("nop\n\t" "nop\n\t")
49
+#define DELAY_3_NOP  __asm__("nop\n\t" "nop\n\t" "nop\n\t")
50
+#define DELAY_4_NOP  __asm__("nop\n\t" "nop\n\t" "nop\n\t" "nop\n\t")
51
+
52
+
53
+// If you want you can define your own set of delays in Configuration.h
54
+//#define ST7920_DELAY_1 DELAY_0_NOP
55
+//#define ST7920_DELAY_2 DELAY_0_NOP
56
+//#define ST7920_DELAY_3 DELAY_0_NOP
57
+
58
+#if F_CPU >= 20000000
59
+  #define CPU_ST7920_DELAY_1 DELAY_0_NOP
60
+  #define CPU_ST7920_DELAY_2 DELAY_0_NOP
61
+  #define CPU_ST7920_DELAY_3 DELAY_1_NOP
62
+#elif (MOTHERBOARD == BOARD_3DRAG) || (MOTHERBOARD == BOARD_K8200)
63
+  #define CPU_ST7920_DELAY_1 DELAY_0_NOP
64
+  #define CPU_ST7920_DELAY_2 DELAY_3_NOP
65
+  #define CPU_ST7920_DELAY_3 DELAY_0_NOP
66
+#elif (MOTHERBOARD == BOARD_MINIRAMBO)
67
+  #define CPU_ST7920_DELAY_1 DELAY_0_NOP
68
+  #define CPU_ST7920_DELAY_2 DELAY_4_NOP
69
+  #define CPU_ST7920_DELAY_3 DELAY_0_NOP
70
+#elif (MOTHERBOARD == BOARD_RAMBO)
71
+  #define CPU_ST7920_DELAY_1 DELAY_0_NOP
72
+  #define CPU_ST7920_DELAY_2 DELAY_0_NOP
73
+  #define CPU_ST7920_DELAY_3 DELAY_0_NOP
74
+#elif F_CPU == 16000000
75
+  #define CPU_ST7920_DELAY_1 DELAY_0_NOP
76
+  #define CPU_ST7920_DELAY_2 DELAY_0_NOP
77
+  #define CPU_ST7920_DELAY_3 DELAY_1_NOP
78
+#else
79
+  #error "No valid condition for delays in 'ultralcd_st7920_u8glib_rrd.h'"
80
+#endif
81
+
82
+#ifndef ST7920_DELAY_1
83
+  #define ST7920_DELAY_1 CPU_ST7920_DELAY_1
84
+#endif
85
+#ifndef ST7920_DELAY_2
86
+  #define ST7920_DELAY_2 CPU_ST7920_DELAY_2
87
+#endif
88
+#ifndef ST7920_DELAY_3
89
+  #define ST7920_DELAY_3 CPU_ST7920_DELAY_3
90
+#endif
91
+
92
+#define ST7920_SND_BIT \
93
+  WRITE(ST7920_CLK_PIN, LOW);        ST7920_DELAY_1; \
94
+  WRITE(ST7920_DAT_PIN, val & 0x80); ST7920_DELAY_2; \
95
+  WRITE(ST7920_CLK_PIN, HIGH);       ST7920_DELAY_3; \
96
+  val <<= 1
97
+
46 98
 static void ST7920_SWSPI_SND_8BIT(uint8_t val) {
47
-  uint8_t i;
48
-  for (i = 0; i < 8; i++) {
49
-    WRITE(ST7920_CLK_PIN,0);
50
-    #if F_CPU == 20000000
51
-      __asm__("nop\n\t");
52
-    #endif
53
-    WRITE(ST7920_DAT_PIN,val&0x80);
54
-    val<<=1;
55
-    WRITE(ST7920_CLK_PIN,1);
56
-    #if F_CPU == 20000000
57
-      __asm__("nop\n\t""nop\n\t");
58
-    #endif
59
-  }
99
+  ST7920_SND_BIT; // 1
100
+  ST7920_SND_BIT; // 2
101
+  ST7920_SND_BIT; // 3
102
+  ST7920_SND_BIT; // 4
103
+  ST7920_SND_BIT; // 5
104
+  ST7920_SND_BIT; // 6
105
+  ST7920_SND_BIT; // 7
106
+  ST7920_SND_BIT; // 8
60 107
 }
61 108
 
62 109
 #define ST7920_CS()              {WRITE(ST7920_CS_PIN,1);u8g_10MicroDelay();}
@@ -138,6 +185,7 @@ class U8GLIB_ST7920_128X64_RRD : public U8GLIB {
138 185
   U8GLIB_ST7920_128X64_RRD(uint8_t dummy) : U8GLIB(&u8g_dev_st7920_128x64_rrd_sw_spi) { UNUSED(dummy); }
139 186
 };
140 187
 
188
+#pragma GCC reset_options
141 189
 
142 190
 #endif //U8GLIB_ST7920
143 191
 #endif //ULCDST7920_H

Loading…
Cancel
Save