/Modules/HumanInterfaces/nanoterm02A/SW/nanoterm02A/lcd.c
0,0 → 1,145
/* mija 2008
 
source file for lcd HITACHI 16x2,8x2,...
 
!!! must be set PINs,PORTs,DDR in lcd.h
ver.: 0.0 TESTED
*/
 
 
#include <avr/io.h>
#include <util/delay.h>
#include <avr/pgmspace.h>
#include "lcd.h"
 
#include <stdio.h>
 
//*************************************************************
 
#define H_D0 PORT_D0 |=_BV(PIN_D0)
#define L_D0 PORT_D0 &= ~(_BV(PIN_D0))
 
#define H_D1 PORT_D1 |=_BV(PIN_D1)
#define L_D1 PORT_D1 &= ~(_BV(PIN_D1))
 
#define H_D2 PORT_D2 |=_BV(PIN_D2)
#define L_D2 PORT_D2 &= ~(_BV(PIN_D2))
 
#define H_D3 PORT_D3 |=_BV(PIN_D3)
#define L_D3 PORT_D3 &= ~(_BV(PIN_D3))
 
#define H_E PORT_E |=_BV(PIN_E)
#define L_E PORT_E &= ~(_BV(PIN_E))
 
#define H_RS PORT_RS |=_BV(PIN_RS)
#define L_RS PORT_RS &= ~(_BV(PIN_RS))
 
//*************************************************************
 
// Definice konstant pro LCD display
//
#define LCD_CURSOR_ON_ 0x0E // kurzor jako blikajici radka pod znakem
#define LCD_CURSOR_OFF_ 0x0C // zadny kurzor
#define LCD_LINE_2 0x40 // adresa 1. znaku 2. radky
 
 
// Definice rezimu LCD displeje
//
 
uint8_t PROGMEM LCD_INIT_STRING[4] =
{
0x28, // intrfejs 4 bity, 2 radky, font 5x7
LCD_CURSOR_OFF_, // display on, kurzor off,
0x01, // clear displeje
0x06 // inkrement pozice kurzoru (posun kurzoru doprava)
};
 
void LCD_init_IO_PIN(void)
{
DDR_D0 |= _BV(PIN_D0);
DDR_D1 |= _BV(PIN_D1);
DDR_D2 |= _BV(PIN_D2);
DDR_D3 |= _BV(PIN_D3);
DDR_E |= _BV(PIN_E);
DDR_RS |= _BV(PIN_RS);
}
 
void LCD_init(void)
{
uint8_t a;
 
LCD_init_IO_PIN();
_delay_ms(20);
L_E;
L_RS;
for (a=0;a<3;a++)
{
_delay_ms(2);
LCD_send_nibble(0x3);
}
_delay_us(40);
LCD_send_nibble(0x2);
_delay_us(40);
for (a=0;a<3;a++)
{
LCD_send_command(pgm_read_byte(&(LCD_INIT_STRING[a])));
_delay_ms(2);
}
}
 
void LCD_putc(uint8_t data)
{
LCD_send_data(data);
}
 
void LCD_send_command(uint8_t data)
{
L_RS;
LCD_send(data);
H_RS;
}
 
void LCD_send_data(uint8_t data)
{
H_RS;
LCD_send(data);
}
 
void LCD_send(uint8_t data)
{
LCD_send_nibble(data >> 4);
LCD_send_nibble(data);
_delay_us(40);
}
 
void LCD_send_nibble(uint8_t data)
{
L_D0;L_D1;L_D2;L_D3;
if (data & 0x1) H_D0;
if (data & 0x2) H_D1;
if (data & 0x4) H_D2;
if (data & 0x8) H_D3;
H_E;
_delay_us(1);
L_E;
}
 
 
void LCD_clear(void)
{
LCD_send_command(1);
_delay_ms(2);
}
 
void LCD_gotoxy( uint8_t x, uint8_t y)
{
uint8_t Adr;
 
Adr=x-1;
if(y==2)
Adr+=LCD_LINE_2;
 
LCD_send_command(0x80|Adr);
}
/Modules/HumanInterfaces/nanoterm02A/SW/nanoterm02A/lcd.h
0,0 → 1,58
/* mija 2008
 
*.h file for defines lcd.c
 
data PIN_D0
PIN_D1
PIN_D2
PIN_D3
write PIN_E
commamnd/data PIN_RS
 
!!!!NOTE must be set PIN with PORT and DDR
*/
 
//*************************************************************
 
#define PIN_D0 PD2
#define PORT_D0 PORTD
#define DDR_D0 DDRD
 
#define PIN_D1 PD3
#define PORT_D1 PORTD
#define DDR_D1 DDRD
 
#define PIN_D2 PD4
#define PORT_D2 PORTD
#define DDR_D2 DDRD
 
#define PIN_D3 PD5
#define PORT_D3 PORTD
#define DDR_D3 DDRD
 
#define PIN_E PA0
#define PORT_E PORTA
#define DDR_E DDRA
 
#define PIN_RS PA1
#define PORT_RS PORTA
#define DDR_RS DDRA
 
//*************************************************************
 
void LCD_init(void);
void LCD_putc(uint8_t data);
void LCD_gotoxy( uint8_t x, uint8_t y);
void LCD_clear(void);
 
void LCD_send_data(uint8_t data);
void LCD_send_command(uint8_t data);
void LCD_send(uint8_t data);
void LCD_send_nibble(uint8_t data);
void LCD_init_IO_PIN(void);
 
//*************************************************************
 
 
 
 
/Modules/HumanInterfaces/nanoterm02A/SW/nanoterm02A/nanoterm02A.c
0,0 → 1,376
/* mija 2008
nanotern02A
f osc 1Mhz
timer1 PWM
 
ver.: 1.0
/n .. goto 1,1
/r .. goto 1,2
/f .. clear lcd
 
*/
 
//*************************************************************
 
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <avr/eeprom.h>
//#include <avr/sleep.h>
#include "lcd.h"
 
 
//*************************************************************
 
void line_feed(void);
void PWM_init(void);
void COMP_init(void);
ISR(ANA_COMP_vect);
int main(void);
 
//*************************************************************
 
#define TEXT1 "setup"
 
#define MAX_BUF 16
 
#define FIRST 40 // *16ms time next key
#define REPEAT 10 // *16ms time repeat key
 
#define LIGHT PB5 // tlacitko A
#define PORT_LIGHT PORTB // nutne definovat PORT,DDR,PIN
#define DDR_LIGHT DDRB
#define TL_A PD6 // tlacitko A
#define PORT_A PORTD // nutne definovat PORT,DDR,PIN
#define DDR_A DDRD
#define PIN_A PIND
 
#define TL_B PB0 // tlacitko B
#define PORT_B PORTB // nutne definovat PORT,DDR,PIN
#define DDR_B DDRB
#define PIN_B PINB
 
#define TL_C PB2 // tlacitko C
#define PORT_C PORTB // nutne definovat PORT,DDR,PIN
#define DDR_C DDRB
#define PIN_C PINB
 
#define TL_D PD3 // tlacitko D
#define PORT_D PORTB // nutne definovat PORT,DDR,PIN
#define DDR_D DDRB
#define PIN_D PINB
 
// eeprom
#define EE_SETUP 0x03
#define EE_VOLTAGE_LO 0x00
#define EE_VOLTAGE_HI 0x01
 
// key
#define KEY_0 0x8
#define KEY_1 0xC
#define KEY_2 0xE
#define KEY_3 0x4
#define KEY_4 0x6
#define KEY_5 0x7
#define KEY_6 0xA
#define KEY_7 0x2
#define KEY_8 0x3
#define KEY_9 0xB
#define KEY_cr 0x1
#define KEY_esc 0x9
 
//interni
#define A_INPUT (!(PIN_A & _BV(TL_A)))
#define A_PULLUP (PORT_A |= _BV(TL_A))
#define A_INIT (DDR_A &= ~(_BV(TL_A)))
 
#define B_INPUT (!(PIN_B & _BV(TL_B)))
#define B_PULLUP (PORT_B |= _BV(TL_B))
#define B_INIT (DDR_B &= ~(_BV(TL_B)))
 
#define C_INPUT (!(PIN_C & _BV(TL_C)))
#define C_PULLUP (PORT_C |= _BV(TL_C))
#define C_INIT (DDR_C &= ~(_BV(TL_C)))
 
#define D_INPUT (!(PIN_D & _BV(TL_D)))
#define D_PULLUP (PORT_D |= _BV(TL_D))
#define D_INIT (DDR_D &= ~(_BV(TL_D)))
 
#define LIGHT_ON (PORT_LIGHT |= _BV(LIGHT))
#define LIGHT_OFF (PORT_LIGHT &= ~(_BV(LIGHT)))
#define LIGHT_INIT (DDR_LIGHT |= _BV(LIGHT))
 
//flag
volatile uint8_t flag;
 
#define KEY_A 0
#define KEY_B 1
#define KEY_C 2
#define KEY_D 3
#define VOLTAGE 4
#define LIGHT_SET 5
#define LIGHT_T0 6
#define LIGHT_T1 7
 
#define FLAG_A_SET (flag |= _BV(KEY_A))
#define FLAG_A_CLR (flag &= ~(_BV(KEY_A)))
#define FLAG_A (flag & _BV(KEY_A))
 
#define FLAG_B_SET (flag |= _BV(KEY_B))
#define FLAG_B_CLR (flag &= ~(_BV(KEY_B)))
#define FLAG_B (flag & _BV(KEY_B))
 
#define FLAG_C_SET (flag |= _BV(KEY_C))
#define FLAG_C_CLR (flag &= ~(_BV(KEY_C)))
#define FLAG_C (flag & _BV(KEY_C))
 
#define FLAG_D_SET (flag |= _BV(KEY_D))
#define FLAG_D_CLR (flag &= ~(_BV(KEY_D)))
#define FLAG_D (flag & _BV(KEY_D))
 
#define FLAG_VOLTAGE_HI (flag |= _BV(VOLTAGE))
#define FLAG_VOLTAGE_LO (flag &= ~(_BV(VOLTAGE)))
#define FLAG_VOLTAGE (flag & (_BV(VOLTAGE)))
 
#define FLAG_LIGHT_ON (flag |= _BV(LIGHT_SET))
#define FLAG_LIGHT_OFF (flag &= ~(_BV(LIGHT_SET)))
#define FLAG_LIGHT (flag & _BV(LIGHT_SET))
 
#define FLAG_T0_SET (flag |= _BV(LIGHT_T0))
#define FLAG_T0_CLR (flag &= ~(_BV(LIGHT_T0)))
#define FLAG_T0 (flag & _BV(LIGHT_T0))
 
#define FLAG_T1_SET (flag |= _BV(LIGHT_T1))
#define FLAG_T1_CLR (flag &= ~(_BV(LIGHT_T1)))
#define FLAG_T1 (flag & _BV(LIGHT_T1))
 
//*************************************************************
 
uint8_t a,pos;
//uint8_t buf[8] = TEXT1;
uint8_t buf_rx[MAX_BUF];
volatile uint8_t rx_shift;
volatile uint8_t tik16ms;
uint8_t lcd_shift;
enum {LED_OFF,LED_5s,LED_10s,LED_15s,LED_20s,LED_25s,LED_30s,LED_ON};
 
//*************************************************************
 
void IO_init(void)
{
LIGHT_INIT;
A_PULLUP;
B_PULLUP;
C_PULLUP;
D_PULLUP;
}
 
void rs232_init(void)
{
//set baud rate fixed 9600 8N1 for fosc 1Mhz
UCSRA = _BV(U2X) ;
UBRRL = 12;
UCSRB = _BV(RXEN) | _BV(TXEN) | _BV(RXCIE);
}
 
void PWM_init(void)
{
TCNT1 = 0;
OCR1B = 0x1;
DDRB |= _BV(PB4);
TCCR1A |= _BV(COM1B1) | _BV(WGM10);
TCCR1B |= _BV(WGM12) | _BV(CS10);
}
 
void PWM_set(void)
{
if (ACSR & _BV(ACO))
{
//OCR1BL = 0x5f;
OCR1BL = eeprom_read_byte(EE_VOLTAGE_LO);
FLAG_VOLTAGE_LO;
}
else
{
//OCR1BL = 0x17;
OCR1BL = eeprom_read_byte(EE_VOLTAGE_HI);
FLAG_VOLTAGE_HI;
}
}
 
void COMP_init(void)
{
ACSR = _BV(ACBG) | _BV(ACIE);
DIDR = _BV(AIN1D);
}
 
void timer0_init(void)
{
TCCR0B = _BV(CS01) | _BV(CS00);
TIMSK |= _BV(TOIE0);
}
 
ISR(TIMER0_OVF_vect) //cca 16ms tik
{
if (A_INPUT) FLAG_A_SET;else FLAG_A_CLR;
if (B_INPUT) FLAG_B_SET;else FLAG_B_CLR;
if (C_INPUT) FLAG_C_SET;else FLAG_C_CLR;
if (D_INPUT) FLAG_D_SET;else FLAG_D_CLR;
if (FLAG_LIGHT) LIGHT_ON;
else LIGHT_OFF;
if (tik16ms) tik16ms--;
}
 
ISR(USART_RX_vect)
{
//while ( !(UCSRA & (_BV(RXC))) );
if (++rx_shift >= MAX_BUF) rx_shift = 0;
buf_rx[rx_shift]=UDR;
}
 
ISR(ANA_COMP_vect)
{
//if (ACSR & _BV(ACO)) OCR1BL = 0x5f;
//else OCR1BL = 0x17;
PWM_set();
}
 
void put(char data)
{
while (!( UCSRA & _BV(UDRE)));
UDR = data;
}
 
void send(uint8_t data)
{
switch (data)
{
case (KEY_0): put('0');break;
case (KEY_1): put('1');break;
case (KEY_2): put('2');break;
case (KEY_3): put('3');break;
case (KEY_4): put('4');break;
case (KEY_5): put('5');break;
case (KEY_6): put('6');break;
case (KEY_7): put('7');break;
case (KEY_8): put('8');break;
case (KEY_9): put('9');break;
case (KEY_cr): put('\n');break;
case (KEY_esc): put('\f');break;
}
}
 
void delay_ms(uint8_t time)
{
while (time--) _delay_ms(1);
}
 
void print_lcd(char *data)
{
while (*data) LCD_putc(*data++);
}
 
void set(void)
{
LCD_gotoxy(1,1);
print_lcd("con. 0/1");
LCD_gotoxy(1,2);
print_lcd(" led 2-9");
while (A_INPUT);
for(;;)
{
switch (flag & 0x0f)
{
case KEY_0: OCR1BL--;break;
case KEY_1: OCR1BL++;break;
case KEY_2: LIGHT_OFF;FLAG_LIGHT_OFF;break;
case KEY_3: LIGHT_ON;FLAG_LIGHT_ON;break;
case KEY_4: break;
case KEY_esc:
{
eeprom_write_byte(EE_SETUP,flag & 0xF0);
if (FLAG_VOLTAGE) eeprom_write_byte(EE_VOLTAGE_HI,OCR1BL);
else eeprom_write_byte(EE_VOLTAGE_LO,OCR1BL);
return;
}
}
delay_ms(50);
}
}
 
int main(void)
{
uint8_t save_flag;
IO_init();
LCD_init();
rs232_init();
PWM_init();
COMP_init();
timer0_init();
LIGHT_OFF;
print_lcd(TEXT1);
LCD_gotoxy(1,2);
print_lcd("cr+reset");
LCD_gotoxy(1,1);
 
flag = 0xfE0 & eeprom_read_byte(EE_SETUP);
 
sei();
if (A_INPUT) set();
pos=0;
rx_shift=0;
lcd_shift=0;
save_flag=0;
for(;;)
{
if (rx_shift != lcd_shift )
{
if (++lcd_shift >= MAX_BUF) lcd_shift = 0;
a=buf_rx[lcd_shift];
switch (a)
{
case ('\n'): LCD_gotoxy(1,1);pos=0;break;
case ('\r'): pos=8;break;
case ('\f'): LCD_clear();pos=0;break;
default :if(pos == 8)
{
LCD_gotoxy(1,2);
//delay_ms(10);
}
LCD_putc(a);
if (++pos > 15)
{
pos = 0;
LCD_gotoxy(1,1);
//delay_ms(10);
}
}
}
if (flag & 0x0F)
{
if ((flag & 0x0F) != save_flag)
{
save_flag = flag & 0x0F;
send(save_flag);
tik16ms=FIRST;
}
else
{
if (!tik16ms)
{
send(save_flag);
tik16ms = REPEAT;
}
}
}
else save_flag = 0;
}
return 0;
}
/Modules/HumanInterfaces/nanoterm02A/SW/nanoterm02A/nanoterm02A.hex
0,0 → 1,96
:1000000022C03BC03AC039C038C037C077C0C6C074
:1000100034C033C0E8C031C030C02FC02EC02DC0A6
:100020002CC02BC02AC030C126C128C118C131C183
:1000300019C11BC10BC12BC11BC123C10AC129C1DD
:100040000BC1280C010611241FBECFEDCDBF10E05F
:10005000A0E6B0E0ECEBF5E003C0C89531960D9258
:10006000A238B107D1F710E0A2E8B0E001C01D92BC
:10007000A839B107E1F77FD1A0C2C2CFBD9A969A45
:10008000C09AC29AC39A089582E08BB98CE089B96C
:1000900088E98AB908951DBC1CBC81E090E099BD37
:1000A00088BDBC9A8FB581628FBD8EB589608EBDCB
:1000B0000895459B0CC0A0E0B0E06BD2802D99273D
:1000C00088BD809194008F7E809394000895A1E074
:1000D000B0E05FD2802D992788BD80919400806127
:1000E00080939400089588E488B982E081B90895E6
:1000F00083E083BF89B7826089BF08951F920F9202
:100100000FB60F9211248F93869906C080919400A8
:1001100081608093940005C0809194008E7F8093CD
:100120009400B09906C080919400826080939400FE
:1001300005C0809194008D7F80939400B29906C091
:100140008091940084608093940005C08091940015
:100150008B7F80939400B39906C08091940088604F
:100160008093940005C080919400877F80939400D1
:100170008091940085FF02C0C59A01C0C598809106
:100180009500882329F080919500815080939500F7
:100190008F910F900FBE0F901F9018951F920F9286
:1001A0000FB60F9211248F939F93EF93FF9380913B
:1001B00096008F5F8093960080919600803110F0BA
:1001C00010929600809196009CB1E2E8F0E0E80F72
:1001D000F11D9083FF91EF919F918F910F900FBE32
:1001E0000F901F9018951F920F920FB60F92112427
:1001F0002F933F934F935F936F937F938F939F932F
:10020000AF93BF93EF93FF9354DFFF91EF91BF91B3
:10021000AF919F918F917F916F915F914F913F919E
:100220002F910F900FBE0F901F9018955D9BFECFE2
:100230008CB908959927AA27BB27F92FE82F319762
:10024000EE30F10530F5ED5EFF4F099480E3EEDF0F
:10025000089581E3EBDF089582E3E8DF089583E307
:10026000E5DF089584E3E2DF089585E3DFDF0895A5
:1002700086E3DCDF089587E3D9DF089588E3D6DFDE
:10028000089589E3D3DF08958AE0D0DF08958CE0F4
:10029000CDDF0895282F21502F3F41F0EAEFF0E005
:1002A0008E2F9F2F0197F1F72150D0F70895CF930C
:1002B000DF93D92FC82F8881882329F0219612D166
:1002C00088818823D9F7DF91CF91089561E081E09B
:1002D00016D180E690E0EBDF62E081E010D189E6A4
:1002E00090E0E5DF869BFECF8091940099278F7088
:1002F00090708930910529F18A30910534F4843069
:100300009105C1F00897A1F506C08C30910539F030
:100310000E9771F508C088B5815088BD29C088B591
:100320008F5F88BD25C0C598809194008F7D809394
:1003300094001EC0C59A80919400806280939400BE
:1003400017C080919400807FA3E0B0E0082E29D1EF
:100350008091940084FF06C088B5A1E0B0E0082E2B
:1003600020D1089588B5A0E0B0E0082E1AD10895F4
:1003700082E390DFB9CF1F9381DEC8D085DE8BDEAC
:10038000B2DEB6DEC59882E790E091DF62E081E000
:10039000B6D088E790E08BDF61E081E0B0D0A3E0E9
:1003A000B0E0F7D0802D807E809394007894869B77
:1003B0008DDF10929200109296001092930010E040
:1003C00001C010E080919600909193008917D1F1BF
:1003D000892F8F5F80939300803110F010929300EB
:1003E000E0919300FF27EE57FF4FE081E0939700E5
:1003F000EC3071F0ED3041F0EA3071F461E081E011
:100400007ED0109292001EC088E0809392001AC0A5
:100410006FD01092920016C080919200883019F42B
:1004200062E081E06CD0809197005CD08091920076
:100430008F5F80939200803128F01092920061E0EB
:1004400081E05DD08091940099278F709070892B06
:1004500009F4B7CF8091940099278F709070212F65
:1004600033278217930751F080919400182F1F7043
:10047000812FE0DE88E280939500A4CF80919500E3
:10048000882309F09FCF812FD5DE8AE080939500E5
:1004900099CF8A9A8B9A8C9A8D9AD09AD19A0895EC
:1004A0009298939894989598992780FD929A81FDB7
:1004B000939A82FD949A83FD959AD89A81E08A95C1
:1004C000F1F7D89808951F93182F82958F70E8DF61
:1004D000812FE6DF8DE08A95F1F71F910895D99A73
:1004E000F2DF0895FCDF0895D998EDDFD99A0895D9
:1004F00081E0FADF84EF91E00197F1F708958150F0
:10050000623009F4805C8068EFDF0895EF92FF921B
:100510000F931F93CF93DF93BCDF88E893E101979C
:10052000F1F7D898D99810E0C4EFD1E08C2F9D2F27
:100530000197F1F783E0B4DF1F5F1330B9F71DE0D7
:10054000812F8A95F1F782E0ABDF1A95F1F782E40B
:1005500090E0D92FC82F0F2EF4EFEF2EF1E0FF2EF1
:10056000F02D082F192F0D5F1F4FFD2FEC2FC89571
:10057000802DBADF9F2D8E2D0197F1F721960C1754
:100580001D0799F7DF91CF911F910F91FF90EF9089
:100590000895E199FECFBFBBAEBBE09A11960DB2B4
:1005A0000895E199FECFBFBBAEBB0DBA11960FB651
:0C05B000F894E29AE19A0FBE0895FFCF84
:1005BC00636F6E2E20302F3100206C656420322D3D
:1005CC00390073657475700063722B726573657492
:0205DC0000001D
:00000001FF