main.c


1
/* Name: main.c
2
 * Author: <insert your name here>
3
 * Copyright: <insert your copyright message here>
4
 * License: <insert your license reference here>
5
 */
6
7
#include <avr/io.h>
8
#include <util/delay.h>
9
#include <avr/interrupt.h> 
10
#include "lcd_routines.h"
11
12
#define GREEN_LED  PD2
13
#define GREEN_LED_ON  ( PORTD &= ~(1<<GREEN_LED) )
14
#define  GREEN_LED_OFF  ( PORTD |= (1<<GREEN_LED) )
15
16
#define  SERVO  PD3
17
#define SERVO_ON  ( PORTD &= ~(1<<SERVO) )
18
#define  SERVO_OFF  ( PORTD |= (1<<SERVO) )
19
#define STEPSIZE  10
20
#define  TIMER1_START ( TCCR1B  |=(1<<CS11) | (1<<WGM13) | (1<<WGM12) )  // clk/8 + CTC-mode12 (ICR1)
21
#define TIMER1_STOP  ( TCCR1B = 0x00 )
22
#define  IMPULS_BREAK  40000  //(us)
23
#define  IMPULS_STEP_SIZE  10
24
25
#define  BUT_UP  PIND4
26
#define  BUT_DWN  PIND7
27
#define BUT_LF  PIND5
28
#define BUT_RI  PIND6
29
30
#define  SETUP_TIMEOUT  30  //After 20 x 100ms Setup start is gone
31
32
struct {
33
  unsigned bNormal:1;  // 1 bit for NORMAL Mode
34
  unsigned bSetup:1;  // 1 bit for SETUP Mode
35
  unsigned bDebug:1;  // 1 bit for DEBUG Mode
36
  unsigned bError:1;  // 1 bit for ERROR Mode
37
  unsigned bRS232:1;  // 1 Bit RS232 Enable 
38
  unsigned bADU:1;  // 1 Bit ADU Enable
39
  unsigned bI2C:1;  // 1 Bit I2C Enable
40
} Mode;
41
42
volatile unsigned int  centi_sec=0;
43
volatile unsigned short ucCompValue=1500;
44
45
/* timer0 overflow */
46
ISR(TIMER0_OVF_vect)   {
47
  /* wait state loop */
48
  if (!Mode.bNormal) {
49
    centi_sec++;
50
    TCNT0=0xB1;
51
52
    if ( (PIND & (1<<GREEN_LED)) ) {
53
      GREEN_LED_ON;
54
    }
55
    else {
56
      GREEN_LED_OFF;
57
    }
58
 
59
    if (centi_sec == SETUP_TIMEOUT) {
60
      Mode.bNormal=1;
61
      centi_sec=0;
62
      GREEN_LED_OFF;
63
    }    
64
  }
65
66
  /* setup state loop */
67
  if (Mode.bSetup) {
68
    TCNT0=0x3C;
69
    
70
    if ( (PIND & (1<<GREEN_LED)) ) {
71
      GREEN_LED_ON;
72
    }
73
    else {
74
      GREEN_LED_OFF;
75
    }
76
  }
77
78
}
79
80
/* timer1 compare */
81
ISR(TIMER1_COMPB_vect) {
82
  SERVO_OFF;
83
  OCR1B = ucCompValue;
84
}
85
86
/* timer1 overflow */
87
ISR(TIMER1_COMPA_vect)   {
88
  SERVO_ON;
89
  OCR1B = ucCompValue;
90
  OCR1A = IMPULS_BREAK;  //(20ms)
91
}
92
93
94
void vFIncreaseServo(void);
95
void vFDecreaseServo(void);
96
97
int main(void)
98
{  
99
    /* insert your hardware initialization here */
100
  PORTD |= (1<<PD2) | (1<<PD3);  //active pull-ups
101
  DDRD |= (1<<DDD2) | (1<<DDD3);  //pin as output
102
103
  DDRD &= ~( ( 1 << DDD6 ) | ( 1<<DDD7) );  //pin as inputs
104
105
  /* display setting */
106
    lcd_init();
107
  
108
  /* global interrupts on */
109
  sei();
110
  
111
  /* timer0 setting */
112
  TCNT0 =0xB1;  // timer0 start value (100ms)
113
  TIMSK |=(1<<TOIE0);  //timer0 overflow interrupt enabled
114
  TCCR0 |=(1<<CS00) |(1<<CS02);  //timer0 start
115
  
116
  /* timer1 for PWM (16bit) */
117
    /*8 MHz Chip clock, appr. 1° -> 0,004ms per clock  */
118
  TIMSK |=(1<<OCIE1A) | (1<<OCIE1B); //compare + overflow interr enable
119
  OCR1A = IMPULS_BREAK;  //(20ms) TOP
120
  OCR1B = ucCompValue;
121
  TCCR1A = 0x00;
122
  TCCR1B  |=(1<<CS11) | (1<<WGM12);
123
  SERVO_OFF;
124
  
125
  /* power on state */
126
    while(1)
127
  {
128
    /* wait state */
129
    while(!Mode.bNormal)
130
    {
131
      if ( !(PIND & (1<<BUT_DWN)) ) {
132
        TCCR0 =00;  // timer0 stop
133
        Mode.bSetup =1;    //setup state set
134
        Mode.bNormal =1;  //normal state set
135
        TCNT0=0x3C;  // new timer0 start value (250ms)
136
        TCCR0 |=(1<<CS00) |(1<<CS02);  // timer0 start
137
      }
138
      lcd_string("1");
139
    }
140
    
141
    /* setup state */
142
    while(Mode.bSetup)
143
    {
144
      if ( !(PIND & (1<<BUT_UP)) ) {
145
        TCCR0 =00;  // timer0 stop
146
        Mode.bSetup =0;
147
        Mode.bNormal =1;
148
      }
149
      
150
      lcd_string("2");
151
    }
152
    
153
    /* normal state */
154
    while(Mode.bNormal)
155
    {
156
      GREEN_LED_ON;
157
      lcd_string("3");
158
      
159
      if(TCCR1B == 0x00) {
160
161
      }
162
      
163
      /* increase compare low */
164
      if ( !(PIND & (1<<BUT_RI)) ) {
165
        vFIncreaseServo();
166
      }
167
      /* decrease compare low */
168
      if ( !(PIND & (1<<BUT_LF)) ) {
169
        vFDecreaseServo();
170
      }
171
172
    }
173
        
174
    }
175
  
176
  set_cursor(0,2);
177
  lcd_string("bye");
178
    return 0;   /* never reached */
179
}
180
181
void vFIncreaseServo(void) {
182
  if(ucCompValue < (2000 - STEPSIZE) )
183
    ucCompValue = ucCompValue + STEPSIZE;
184
}
185
186
void vFDecreaseServo(void) {
187
  if(ucCompValue > (1000 + STEPSIZE))
188
    ucCompValue = ucCompValue - STEPSIZE;
189
}