Parcourir la source

Merge branch 'new/lcd/6'

DricomDragon il y a 5 ans
Parent
commit
417103b9a5

+ 1 - 0
dev-files/.gitignore

@@ -0,0 +1 @@
+*.pyc

BIN
dev-files/archive_directory.pyc


BIN
dev-files/code_builder.pyc


BIN
dev-files/common_definitions.pyc


BIN
dev-files/dev_platform.pyc


BIN
dev-files/download_and_install_gccarm.pyc


BIN
dev-files/interrupt_names_teensy_3_6.pyc


BIN
dev-files/makefile.pyc


BIN
dev-files/teensy_cli_loader_builder.pyc


BIN
dev-files/tool_directory.pyc


BIN
dev-files/udev_on_linux.pyc


+ 2 - 2
prog/clean.py

@@ -1,4 +1,4 @@
-#! /usr/bin/env python
+#!/usr/bin/env python
 # -*- coding: UTF-8 -*-
 
 #----------------------------------------------------------------------------------------------------------------------*
@@ -10,7 +10,7 @@ import sys, os, shutil
 #----------------------------------------------------------------- Get script absolute path
 scriptDir = os.path.dirname (os.path.abspath (sys.argv [0]))
 #----------------------------------------------------------------- Import common definitions
-pythonScriptDir = scriptDir + "/../../dev-files"
+pythonScriptDir = scriptDir + "/../dev-files"
 sys.path.append (pythonScriptDir)
 import common_definitions
 #-----------------------------------------------------------------

+ 284 - 0
prog/sources/lcd-wo-fault-mode.cpp

@@ -0,0 +1,284 @@
+#include "all-headers.h"
+
+#include <stddef.h>
+#include <stdbool.h>
+
+// http://esd.cs.ucr.edu/labs/interface/interface.html
+
+//   PORT CONFIGURATION                                                                                                *
+//   LCD D4 : Teensy D16
+//   LCD D5 : Teensy D15
+//   LCD D6 : Teensy D14
+//   LCD D7 : Teensy D19
+//   LCD RS : Teensy D18
+//   LCD E  : Teensy D17
+
+static const DigitalPort LCD_D4 = DigitalPort::D16 ;
+
+static const DigitalPort LCD_D5 = DigitalPort::D15 ;
+
+static const DigitalPort LCD_D6 = DigitalPort::D14 ;
+
+static const DigitalPort LCD_D7 = DigitalPort::D19 ;
+
+static const DigitalPort LCD_RS = DigitalPort::D18 ;
+
+static const DigitalPort LCD_E  = DigitalPort::D17 ;
+
+//   UTILITY ROUTINES — ANY MODE                                                                                                  *
+
+static void driveHighE (void) {
+	digitalWrite (LCD_E, true) ;
+}
+
+static void driveLowE (void) {
+	digitalWrite (LCD_E, false) ;
+}
+
+static void driveHighRS (void) {
+	digitalWrite (LCD_RS, true) ;
+}
+
+static void driveLowRS (void) {
+	digitalWrite (LCD_RS, false) ;
+}
+
+static void setD4 (const bool inValue) {
+	digitalWrite (LCD_D4, inValue) ;
+}
+
+static void setD5 (const bool inValue) {
+	digitalWrite (LCD_D5, inValue) ;
+}
+
+static void setD6 (const bool inValue) {
+	digitalWrite (LCD_D6, inValue) ;
+}
+
+static void setD7 (const bool inValue) {
+	digitalWrite (LCD_D7, inValue) ;
+}
+
+static void programLcd4BitDataBusOutput (const uint8_t inValue) {
+	setD4 ((inValue & 0x01) != 0) ;
+	setD5 ((inValue & 0x02) != 0) ;
+	setD6 ((inValue & 0x04) != 0) ;
+	setD7 ((inValue & 0x08) != 0) ;
+}
+
+//   UTILITY ROUTINES — INIT_MODE
+
+static void write4BitCommand_initMode (INIT_MODE_ const uint8_t inCommand) {
+	busyWaitDuring_initMode (MODE_ 1) ;
+	driveLowRS () ;
+	programLcd4BitDataBusOutput (inCommand) ;
+	driveHighE () ;
+	busyWaitDuring_initMode (MODE_ 1) ;
+	driveLowE () ;
+}
+
+static void write8bitCommand_initMode (INIT_MODE_ const uint8_t inCommand) {
+	busyWaitDuring_initMode (MODE_ 1) ;
+	driveLowRS () ;
+	programLcd4BitDataBusOutput ((uint8_t) (inCommand >> 4)) ;
+	driveHighE () ;
+	busyWaitDuring_initMode (MODE_ 1) ;
+	driveLowE () ;
+	busyWaitDuring_initMode (MODE_ 1) ;
+	programLcd4BitDataBusOutput (inCommand) ;
+	driveHighE () ;
+	busyWaitDuring_initMode (MODE_ 1) ;
+	driveLowE () ;
+}
+
+//   LCD INIT
+
+static void setupLCD (INIT_MODE) {
+	//--- Step 1: Configure ports
+	pinMode (LCD_D4, DigitalMode::OUTPUT) ;
+	pinMode (LCD_D5, DigitalMode::OUTPUT) ;
+	pinMode (LCD_D6, DigitalMode::OUTPUT) ;
+	pinMode (LCD_D7, DigitalMode::OUTPUT) ;
+	pinMode (LCD_RS, DigitalMode::OUTPUT) ;
+	pinMode (LCD_E,  DigitalMode::OUTPUT) ;
+	//--- Step 2: wait for 15 ms
+	busyWaitDuring_initMode (MODE_ 15) ;
+	//--- Step 3: write command 0x30
+	write4BitCommand_initMode (MODE_ 0x3) ;
+	//--- Step 4: wait for 4,1 ms (actually 5 ms)
+	busyWaitDuring_initMode (MODE_ 5) ;
+	//--- Step 5: write command 0x30 again
+	write4BitCommand_initMode (MODE_ 0x3) ;
+	//--- Step 6: wait for 100 µs (actually 1 ms)
+	busyWaitDuring_initMode (MODE_ 1) ;
+	//--- Step 7: write command 0x30 (third)
+	write4BitCommand_initMode (MODE_ 0x3) ;
+	//--- Step 8: write command 0x20 (4-bit mode)
+	write4BitCommand_initMode (MODE_ 0x2) ;
+	//--- Step 9: write command 'Set Interface Length' : 0 0 1 DL N F * *
+	//    DL : Data interface length : 0 (4 bits)
+	//    N : Number of Display lines : 1 (2 lines)
+	//    F : Character Font : 0 (5x7)
+	write8bitCommand_initMode (MODE_ 0x28) ;
+	//--- Step 10: write command 'Display Off'
+	write8bitCommand_initMode (MODE_ 0x08) ;
+	//--- Step 11: write command 'Clear Display'
+	write8bitCommand_initMode (MODE_ 0x01) ;
+	//--- Step 12: write command 'Set Cursor Move Direction' : 0 0 0 0 0 1 ID S
+	//    ID : Increment Cursor after Each Byte Written to Display : 1 (yes)
+	//    S : Shift Display When Byte Written : 0 (no)
+	write8bitCommand_initMode (MODE_ 0x06) ;
+	//--- Step 13: write command 'Move Cursor / Shift Display' : 0 0 0 1 SC RL * *
+	//    SC : Display Shift On : 1 (oui)
+	//    RL : Direction of Shift : 1 (to right)
+	write8bitCommand_initMode (MODE_ 0x1C) ;
+	//--- Step 14: write command 'Return Cursor and LCD to Home Position'
+	write8bitCommand_initMode (MODE_ 0x02) ;
+	//--- Step 15: write command 'Enable Display / Cursor' : 0 0 0 0 1 D C B
+	//    D : Turn Display On : 1 (yes)
+	//    C : Turn Cursor On : 0 (no)
+	//    B : Cursor Blink On : 0 (no)
+	write8bitCommand_initMode (MODE_ 0x0C) ;
+}
+
+MACRO_INIT_ROUTINE (setupLCD) ;
+
+//   UTILITY ROUTINES — USER MODE
+
+static void write8bitCommand (USER_MODE_ const uint8_t inCommand) {
+	busyWaitDuring (MODE_ 1) ;
+	driveLowRS () ;
+	programLcd4BitDataBusOutput ((uint8_t) (inCommand >> 4)) ;
+	driveHighE () ;
+	busyWaitDuring (MODE_ 1) ;
+	driveLowE () ;
+	busyWaitDuring (MODE_ 1) ;
+	programLcd4BitDataBusOutput (inCommand) ;
+	driveHighE () ;
+	busyWaitDuring (MODE_ 1) ;
+	driveLowE () ;
+}
+
+
+static void writeData (USER_MODE_ const uint8_t inData) {
+	busyWaitDuring (MODE_ 1) ;
+	driveHighRS () ;
+	programLcd4BitDataBusOutput (inData >> 4) ;
+	driveHighE () ;
+	busyWaitDuring (MODE_ 1) ;
+	driveLowE () ;
+	busyWaitDuring (MODE_ 1) ;
+	programLcd4BitDataBusOutput (inData) ;
+	driveHighE () ;
+	busyWaitDuring (MODE_ 1) ;
+	driveLowE () ;
+}
+
+//   PRINT ROUTINES — USER MODE
+
+void clearScreen (USER_MODE) {
+	write8bitCommand (MODE_ 0x01) ;
+}
+
+// Line 0 : 00 -> 19
+// Line 1 : 64 -> 83
+// Line 2 : 20 -> 39
+// Line 3 : 84 -> 103
+
+void gotoLineColumn (USER_MODE_ const uint32_t inLine, const uint32_t inColumn) {
+	static const uint8_t tab [4] = {0, 64, 20, 84} ;
+	if ((inLine < 4) && (inColumn < 20)) {
+		write8bitCommand (MODE_ tab [inLine] + inColumn + 0x80U) ;
+	}
+}
+
+void printString (USER_MODE_ const char * inString) {
+	if (NULL != inString) {
+		while ('\0' != *inString) {
+			writeData (MODE_ *inString) ;
+			inString ++ ;
+		}
+	}
+}
+
+void printChar (USER_MODE_ const char inChar) {
+	writeData (MODE_ inChar) ;
+}
+
+void printSpaces (USER_MODE_ const uint32_t inCount) {
+	uint32_t count = inCount ;
+	while (count > 0) {
+		printChar (MODE_ ' ') ;
+		count -- ;
+	}
+}
+
+void printUnsigned (USER_MODE_ const uint32_t inValue) {
+	uint32_t divisor = 1000 * 1000 * 1000 ; // 10**9
+	uint32_t value = inValue ;
+	bool isPrinting = false ;
+	while (divisor > 0) {
+		if (isPrinting || (value >= divisor)) {
+			printChar (MODE_ '0' + value / divisor) ;
+			value %= divisor ;
+			isPrinting = true ;
+		}
+		divisor /= 10 ;
+	}
+	if (!isPrinting) {
+		printChar (MODE_ '0') ;
+	}
+}
+
+void printUnsigned64 (USER_MODE_ const uint64_t inValue) {
+	char buffer [20] ;
+	buffer [19] = '\0' ;
+	buffer [18] = (inValue % 10) + '0' ;
+	uint32_t idx = 18 ;
+	uint64_t v = inValue / 10 ;
+	while (v != 0) {
+		idx -- ;
+		buffer [idx] = (v % 10) + '0' ;
+		v /= 10 ;
+	}
+	printString (MODE_ & buffer [idx]) ;
+}
+
+void printSigned (USER_MODE_ const int32_t inValue) {
+	if (inValue < 0) {
+		printChar (MODE_ '-') ;
+		printUnsigned (MODE_ (uint32_t) -inValue) ;
+	}else{
+		printUnsigned (MODE_ (uint32_t) inValue) ;
+	}
+}
+
+void printHex1 (USER_MODE_ const uint32_t inValue) {
+	const uint32_t v = inValue & 0xF ;
+	if (v < 10) {
+		printChar (MODE_ '0' + v) ;
+	}else{
+		printChar (MODE_ 'A' + v - 10) ;
+	}
+}
+
+void printHex2 (USER_MODE_ const uint32_t inValue) {
+	printHex1 (MODE_ inValue >> 4) ;
+	printHex1 (MODE_ inValue) ;
+}
+
+void printHex4 (USER_MODE_ const uint32_t inValue) {
+	printHex2 (MODE_ inValue >> 8) ;
+	printHex2 (MODE_ inValue) ;
+}
+
+void printHex8 (USER_MODE_ const uint32_t inValue) {
+	printHex4 (MODE_ inValue >> 16) ;
+	printHex4 (MODE_ inValue) ;
+}
+
+void printHex16 (USER_MODE_ const uint64_t inValue) {
+	printHex8 (MODE_ (uint32_t) (inValue >> 32)) ;
+	printHex8 (MODE_ (uint32_t) inValue) ;
+}
+

+ 30 - 0
prog/sources/lcd-wo-fault-mode.h

@@ -0,0 +1,30 @@
+#pragma once
+
+#include "software-modes.h"
+
+void clearScreen (USER_MODE) ;
+
+void gotoLineColumn (USER_MODE_ const uint32_t inLine, const uint32_t inColumn) ;
+
+void printString (USER_MODE_ const char * inString) ;
+
+void printChar (USER_MODE_ const char inChar) ;
+
+void printSpaces (USER_MODE_ const uint32_t inCount) ;
+
+void printUnsigned (USER_MODE_ const uint32_t inValue) ;
+
+void printUnsigned64 (USER_MODE_ const uint64_t inValue) ;
+
+void printSigned (USER_MODE_ const int32_t inValue) ;
+
+void printHex1 (USER_MODE_ const uint32_t inValue) ;
+
+void printHex2 (USER_MODE_ const uint32_t inValue) ;
+
+void printHex4 (USER_MODE_ const uint32_t inValue) ;
+
+void printHex8 (USER_MODE_ const uint32_t inValue) ;
+
+void printHex16 (USER_MODE_ const uint64_t inValue) ;
+

+ 22 - 0
prog/sources/setup-loop.cpp

@@ -11,10 +11,14 @@ bool actionDone[5];
 DigitalPort LED[5];
 DigitalPort BUTTON[5];
 
+// Counter
+uint32_t counter(0);
+
 void setup (USER_MODE) {
 	// Start
 	digitalWrite(L0_LED, true);
 
+	// Init buttons and LEDs
 	BUTTON[0] = P0_PUSH_BUTTON;
 	BUTTON[1] = P1_PUSH_BUTTON;
 	BUTTON[2] = P2_PUSH_BUTTON;
@@ -32,6 +36,9 @@ void setup (USER_MODE) {
 		buttonReleased[i] = digitalRead(BUTTON[i]);
 		actionDone[i] = false;
 	}
+
+	// Init LCD
+	printString(MODE_ "Welcome Jovian");
 }
 
 void loop (USER_MODE) {
@@ -55,6 +62,21 @@ void loop (USER_MODE) {
 		if (!buttonReleased[i] && !actionDone[i]) {
 			digitalToggle(LED[i]);
 			actionDone[i] = true;
+			counter ++;
+			
+			// Prevent persistent digit
+			if (counter >= 20) {
+				counter = 0;
+				gotoLineColumn(MODE_ 2, 12);
+				printChar(MODE_ ' ');
+			}
+
+			// Show action on LCD
+			gotoLineColumn(MODE_ 1, 13 - i);
+			printChar(MODE_ '1');
+
+			gotoLineColumn(MODE_ 2, 13 - counter / 10);
+			printUnsigned(MODE_ counter);
 		}
 	}
 }

+ 7 - 0
prog/sources/time.cpp

@@ -8,6 +8,13 @@ static void startSystick (BOOT_MODE) {
 
 MACRO_BOOT_ROUTINE (startSystick);
 
+void busyWaitDuring_initMode (INIT_MODE_ const uint32_t inDelayMS) {
+	const uint32_t COUNTFLAG_MASK = 1 << 16 ;
+	for (uint32_t i=0 ; i<inDelayMS ; i++) {
+		while ((SYST_CSR & COUNTFLAG_MASK) == 0) {} // Busy wait, polling COUNTFLAG
+	}
+}
+
 void busyWaitDuring (USER_MODE_ const uint32_t inDelayMS) {
 	const uint32_t COUNTFLAG_MASK = 1 << 16 ;
 	for (uint32_t i = 0; i < inDelayMS; i++) {

+ 2 - 0
prog/sources/time.h

@@ -2,5 +2,7 @@
 
 #include <stdint.h>
 
+void busyWaitDuring_initMode (INIT_MODE_ const uint32_t inDelayMS);
+
 void busyWaitDuring (USER_MODE_ const uint32_t inDelayMS);