diff options
author | gdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4> | 2008-03-07 15:24:00 +0000 |
---|---|---|
committer | gdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4> | 2008-03-07 15:24:00 +0000 |
commit | d3ff29c1893323a3749e0c7f45a5d1541430929b (patch) | |
tree | f98fe2b1e30708c655bcd39781c2ea721c0ee581 /demos/AVR-ATmega128-GCC | |
parent | 959e29936fee8ac545f3ee0451a21a161f631680 (diff) | |
download | ChibiOS-d3ff29c1893323a3749e0c7f45a5d1541430929b.tar.gz ChibiOS-d3ff29c1893323a3749e0c7f45a5d1541430929b.tar.bz2 ChibiOS-d3ff29c1893323a3749e0c7f45a5d1541430929b.zip |
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@219 35acf78f-673a-0410-8e92-d51de3d6d3f4
Diffstat (limited to 'demos/AVR-ATmega128-GCC')
-rw-r--r-- | demos/AVR-ATmega128-GCC/Makefile | 2 | ||||
-rw-r--r-- | demos/AVR-ATmega128-GCC/board.h | 24 | ||||
-rw-r--r-- | demos/AVR-ATmega128-GCC/lcd.c | 97 | ||||
-rw-r--r-- | demos/AVR-ATmega128-GCC/lcd.h | 52 | ||||
-rw-r--r-- | demos/AVR-ATmega128-GCC/main.c | 15 | ||||
-rw-r--r-- | demos/AVR-ATmega128-GCC/readme.txt | 4 |
6 files changed, 178 insertions, 16 deletions
diff --git a/demos/AVR-ATmega128-GCC/Makefile b/demos/AVR-ATmega128-GCC/Makefile index e2b5dd8cc..34c228691 100644 --- a/demos/AVR-ATmega128-GCC/Makefile +++ b/demos/AVR-ATmega128-GCC/Makefile @@ -87,7 +87,7 @@ SRC = ../../ports/AVR/chcore.c ../../ports/AVR/avr_serial.c \ ../../src/chserial.c \
../../src/lib/evtimer.c \
../../test/test.c \
- board.c main.c
+ board.c lcd.c main.c
# List C++ source files here. (C dependencies are automatically generated.)
diff --git a/demos/AVR-ATmega128-GCC/board.h b/demos/AVR-ATmega128-GCC/board.h index a29ee8664..97b9c684d 100644 --- a/demos/AVR-ATmega128-GCC/board.h +++ b/demos/AVR-ATmega128-GCC/board.h @@ -38,22 +38,22 @@ #define VAL_PORTB 0xFF
/* D7 D6 D5 D4 PC3 E R/W RS
- * IN IN IN IN IN OUT OUT OUT
- * DDRC 0 0 0 0 0 1 1 1
+ * OUT OUT OUT OUT IN OUT OUT OUT
+ * DDRC 1 1 1 1 0 1 1 1
* PU PU PU PU PU VAL VAL VAL
- * PORTC 1 1 1 1 1 0 0 0
+ * PORTC 0 0 0 0 1 0 0 0
*/
-#define VAL_DDRC 0x03
-#define VAL_PORTC 0xF8
+#define VAL_DDRC 0xF7
+#define VAL_PORTC 0x08
/* PD7 PD6 PD5 PD4 TXD RXD PD1 PD0
* IN IN IN IN OUT IN IN IN
* DDRD 0 0 0 0 1 0 0 0
- * PU PU PU PU VAL HiZ HiZ HiZ
- * PORTD 1 1 1 1 1 0 0 0
+ * PU PU PU PU VAL HiZ PU PU
+ * PORTD 1 1 1 1 1 0 1 1
*/
#define VAL_DDRD 0x08
-#define VAL_PORTD 0xF8
+#define VAL_PORTD 0xFB
/* PE7 PE6 BZ2 BZ2 PE3 PE2 PE1 PE0
* IN IN OUT OUT IN IN OUT IN
@@ -67,12 +67,12 @@ /* TDI TDO TMS TCK PF3 PF2 PF1 PF0
* x x x x IN IN IN IN
* DDRF 0 0 0 0 0 0 0 0
- * PU PU PU PU PU PU PU PU
- * PORTF 1 1 1 1 1 1 1 1
+ * x x x x PU PU PU PU
+ * PORTF 0 0 0 0 1 1 1 1
*
*/
#define VAL_DDRF 0x00
-#define VAL_PORTF 0xFF
+#define VAL_PORTF 0x0F
/* x x x x x PG2 PG1 PG0
* x x x x x IN IN IN
@@ -99,6 +99,8 @@ #define PORTC_44780_D5 (1 << 5)
#define PORTC_44780_D6 (1 << 6)
#define PORTC_44780_D7 (1 << 7)
+#define PORTC_44780_DATA (PORTC_44780_D4 | PORTC_44780_D5 | \
+ PORTC_44780_D6 | PORTC_44780_D7)
#define PORTE_BUZZ1 (1 << 4)
#define PORTE_BUZZ2 (1 << 5)
diff --git a/demos/AVR-ATmega128-GCC/lcd.c b/demos/AVR-ATmega128-GCC/lcd.c new file mode 100644 index 000000000..eed0c896e --- /dev/null +++ b/demos/AVR-ATmega128-GCC/lcd.c @@ -0,0 +1,97 @@ +/*
+ ChibiOS/RT - Copyright (C) 2006-2007 Giovanni Di Sirio.
+
+ This file is part of ChibiOS/RT.
+
+ ChibiOS/RT is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ ChibiOS/RT is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <ch.h>
+
+#include <avr/io.h>
+
+#include "board.h"
+#include "lcd.h"
+
+static void e_pulse(void) {
+ volatile uint8_t i;
+
+ PORTC |= PORTC_44780_E;
+ for (i = 0; i < ELOOPVALUE; i++);
+ ;
+ PORTC &= ~PORTC_44780_E;
+}
+
+static void wait_not_busy(void) {
+
+ chThdSleep(2);
+}
+
+/*
+ * 44780 soft reset procedure.
+ */
+void lcdInit(void) {
+
+ PORTC = (PORTC & ~(PORTC_44780_DATA | PORTC_44780_RS | PORTC_44780_E | PORTC_44780_RW)) |
+ (LCD_CMD_INIT8 & PORTC_44780_DATA);
+ chThdSleep(50);
+ e_pulse();
+ chThdSleep(10);
+ e_pulse();
+ chThdSleep(2);
+ e_pulse();
+ wait_not_busy();
+ PORTC = (PORTC & ~(PORTC_44780_DATA | PORTC_44780_RS | PORTC_44780_E | PORTC_44780_RW)) |
+ (LCD_CMD_INIT4 & PORTC_44780_DATA);
+ e_pulse();
+ lcdCmd(LCD_CMD_INIT4);
+ lcdCmd(LCD_SET_DM | LCD_DM_DISPLAY_ON);
+ lcdCmd(LCD_SET_INCREMENT_MODE);
+}
+
+/*
+ * Sends a command byte to the 44780.
+ */
+void lcdCmd(uint8_t cmd) {
+
+ wait_not_busy();
+ PORTC = (PORTC | PORTC_44780_DATA) & (cmd | (0x0F & ~PORTC_44780_RS));
+ e_pulse();
+ PORTC = (PORTC | PORTC_44780_DATA) & ((cmd << 4) | (0x0F & ~PORTC_44780_RS));
+ e_pulse();
+}
+
+/*
+ * Writes a char on the LCD at the current position.
+ */
+void lcdPutc(char c) {
+ uint8_t b;
+
+ wait_not_busy();
+ b = c | 0x0F;
+ PORTC = (PORTC | PORTC_44780_DATA | PORTC_44780_RS) & (c | 0x0F);
+ e_pulse();
+ PORTC = (PORTC | PORTC_44780_DATA | PORTC_44780_RS) & ((c << 4) | 0x0F);
+ e_pulse();
+}
+
+/*
+ * Writes a string on the LCD at an absolute address.
+ */
+void lcdPuts(uint8_t pos, char *p) {
+
+ lcdCmd(LCD_SET_DDRAM_ADDRESS | pos);
+ while (*p)
+ lcdPutc(*p++);
+}
diff --git a/demos/AVR-ATmega128-GCC/lcd.h b/demos/AVR-ATmega128-GCC/lcd.h new file mode 100644 index 000000000..12ffd127e --- /dev/null +++ b/demos/AVR-ATmega128-GCC/lcd.h @@ -0,0 +1,52 @@ +/*
+ ChibiOS/RT - Copyright (C) 2006-2007 Giovanni Di Sirio.
+
+ This file is part of ChibiOS/RT.
+
+ ChibiOS/RT is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ ChibiOS/RT is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef _LCD_H_
+#define _LCD_H_
+
+#define ELOOPVALUE 10
+
+#define LCD_CLEAR 0x01
+
+#define LCD_RETURN_HOME 0x02
+
+#define LCD_SET_INCREMENT_MODE 0x06
+
+#define LCD_SET_DM 0x08
+#define LCD_DM_DISPLAY_ON 4
+#define LCD_DM_DISPLAY_OFF 0
+#define LCD_DM_CURSOR_ON 2
+#define LCD_DM_CURSOR_OFF 0
+#define LCD_DM_BLINK_ON 1
+#define LCD_DM_BLINK_OFF 0
+
+#define LCD_CMD_INIT4 0x28
+#define LCD_CMD_INIT8 0x38
+
+#define LCD_SET_DDRAM_ADDRESS 0x80
+
+#define LCD_LINE1 0
+#define LCD_LINE2 40
+
+void lcdInit(void);
+void lcdCmd(uint8_t cmd);
+void lcdPutc(char c);
+void lcdPuts(uint8_t pos, char *p);
+
+#endif /* _LCD_H_ */
diff --git a/demos/AVR-ATmega128-GCC/main.c b/demos/AVR-ATmega128-GCC/main.c index 29a19701b..53fe21b2d 100644 --- a/demos/AVR-ATmega128-GCC/main.c +++ b/demos/AVR-ATmega128-GCC/main.c @@ -24,6 +24,7 @@ #include <avr/io.h>
#include "board.h"
+#include "lcd.h"
void hwinit(void);
@@ -31,7 +32,8 @@ static WorkingArea(waThread1, 32); static msg_t Thread1(void *arg) {
while (TRUE) {
- PORTA ^= PORTA_RELAY;
+ if (!(PINA & PORTA_BUTTON2))
+ PORTA ^= PORTA_RELAY;
chThdSleep(1000);
}
return 0;
@@ -40,7 +42,7 @@ static msg_t Thread1(void *arg) { static void TimerHandler(eventid_t id) {
msg_t TestThread(void *p);
- if (!(PORTA & PORTA_BUTTON1))
+ if (!(PINA & PORTA_BUTTON1))
TestThread(&SER2);
}
@@ -60,6 +62,15 @@ int main(int argc, char **argv) { chSysInit();
/*
+ * This initialization requires the OS already active because it uses delay
+ * APIs inside.
+ */
+ lcdInit();
+ lcdCmd(LCD_CLEAR);
+ lcdPuts(LCD_LINE1, " ChibiOS/RT ");
+ lcdPuts(LCD_LINE2, " Hello World! ");
+
+ /*
* Event Timer initialization.
*/
evtInit(&evt, 500); /* Initializes an event timer object. */
diff --git a/demos/AVR-ATmega128-GCC/readme.txt b/demos/AVR-ATmega128-GCC/readme.txt index 1c6ab3c5d..7158463fb 100644 --- a/demos/AVR-ATmega128-GCC/readme.txt +++ b/demos/AVR-ATmega128-GCC/readme.txt @@ -8,8 +8,8 @@ The demo runs on an Olimex AVR-MT-128 board. ** The Demo **
-The demo currently just toggles the relay using a thread. It will be expanded
-in next releases.
+The demo currently just writes a hello world on the LCD and toggles the relay
+using a thread while button 2 is pressed.
By pressing the button 1 the test suite is activated, output on serial port 2.
** Build Procedure **
|