include defines include ctype не работаем символами include stdint inc

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
#include "defines.h"
//#include <ctype.h> не работаем с символами
#include <stdint.h>
//#include <stdio.h> нет стандартного в/в
#include <avr/io.h>
#include <avr/eeprom.h>
//#include <avr/interrupt.h> нет прерываний
#include <avr/wdt.h>
#include <util/delay.h>
#define locked (PINC & 0b00001000) //не сработал ли геркон блокировки?
#define pb_def 0b11011101 // состояние светодиодов по умолчанию (0=включен)
typedef uint8_t byte;
typedef uint16_t word;
typedef uint32_t dword;
typedef enum {
pos_undef=0,
pos_l=1,
pos_lmid=2,
pos_mid=3,
pos_rmid=4,
pos_r=5} TenPos;
typedef struct {
TenPos lpos; //текущая позиция "открытости"
word rpos; //текущее количество шагов в блоке поворота
byte ltime; //таймаут работы коллекторного двигателя, х100мс
} TVars;
TVars EEMEM eepVars = {pos_l, 940, 100};
static TVars ramVars;
//static byte bLED=0b01010101; //состояние светодиодов
static const word wSteps[4] = { 0b00001100,
0b00000110,
0b00000011,
0b00001001 }; //маска шагов
static void beep() //~100мс писк с частотой ~3200Гц.
{
for (word i=0; i<2010; i++)
{
PORTD INV_B(4);
_delay_us(150);
}
}
static byte scankb()
{
byte bLED=PORTB;
DDRB=0x00;
PORTB=0xff;
_delay_us(10);
byte ttPINB=PINB;
DDRB=0xff;
PORTB=bLED;
return (ttPINB);
}
static TenPos getlpos(void)
{
switch (PINC & 0b00000111) //попытка определить позицию по герконам
{
case 0b00000110: return pos_l;
case 0b00000101: return pos_mid;
case 0b00000011: return pos_r;
default: return pos_undef; //не определили
}
}
static void rotate(word rpos)
{
if (
(ramVars.rpos!=rpos)
&&
!(
(ramVars.lpos > pos_mid)
&&
((rpos<470) || (rpos>1410))
)
) //стоит ли вращаться?
{
int8_t direction=(ramVars.rpos < rpos) ?1 :-1;
PORTB SET_B(5);
PORTB CLR_B((5+direction));
beep();
while (ramVars.rpos!=rpos)
{
PORTD=wSteps[(ramVars.rpos % 4)];
_delay_ms(8);
ramVars.rpos+=direction;
wdt_reset();
}
PORTD=0;
eeprom_write_word(&eepVars.rpos, ramVars.rpos);
PORTB=pb_def;
}
}
static void move(TenPos lpos)
{
if ((lpos!=ramVars.lpos) && !locked) //стоит ли двигаться?
{
byte timer=0;
int8_t direction=(ramVars.lpos < lpos) ?1 :-1;
if ((ramVars.rpos<470)||(ramVars.rpos>1410)) rotate(470);
//ramVars.lpos+=direction; //gользователь инструкции не читает
beep();
PORTD |=1<<((ramVars.lpos < lpos) ? 7 : 6);
PORTB SET_B(1);
PORTB CLR_B((1+direction));
while((getlpos()!=lpos)&&(scankb()==0xff)&&(timer<ramVars.ltime))
{
timer++;
_delay_ms(100);
wdt_reset();
}
PORTD &=~(1<<((ramVars.lpos < lpos) ? 7 : 6));
PORTB=pb_def;
timer=getlpos();
if (timer!=pos_undef) ramVars.lpos=timer;
}
}
int main ( void )
{ //инициализация портов
DDRD =0b11111111; //0=вход, 1=выход
DDRB =0b11111111; //0=вход, 1=выход
DDRC =0b00000000; //0=вход, 1=выход
PORTD=0b00000000; //1=подтяжка, 0=отсутствие таковой
PORTB=pb_def; //1=подтяжка, 0=отсутствие таковой
PORTC=0b11011111; //1=подтяжка, 0=отсутствие таковой
// инициализация АЦП
ADMUX=(0<<REFS1)|(1<<REFS0)| //AVCC с конденсатором на AREF
(5 & 0x0f); //5-ый канал
ADCSRA= _BV(ADEN)| //включить АЦП
_BV(ADSC)| //запустить АЦП
_BV(ADFR)| //непрерывное преобразование
_BV(ADPS2)| //
_BV(ADPS1)| //-- Тактовая АЦП=clk/128
_BV(ADPS0); ///
//read eep
//eeprom_read_block((void*)&ramVars, (const void*)&eepVars, sizeof(ramVars)); //громоздкая функция
WDTCR= _BV(WDE)| //включаем "собачку"
_BV(WDP2)|
_BV(WDP1); //таймаут ~1с
ramVars.rpos=eeprom_read_word(&eepVars.rpos);
ramVars.lpos=eeprom_read_byte(&eepVars.lpos);
ramVars.ltime=eeprom_read_byte(&eepVars.ltime);
while (1) //основной цикл
{
byte tPINB=scankb();
if (tPINB!=0xff)
{
switch (tPINB)
{
case 0b11111110 : //open
move(pos_l);
break;
case 0b11111101 : //middle
move(pos_mid);
break;
case 0b11111011 : //close
move(pos_r);
break;
case 0b11110111 : //0
rotate(0);
break;
case 0b11101111 : //45
rotate(470);
break;
case 0b11011111 : //90
rotate(940);
break;
case 0b10111111 : //135
rotate(1410);
break;
case 0b01111111 : //180
rotate(1880);
break;
}; //switch
}; //if
_delay_ms(200);
wdt_reset();
};//while
return (0);
}
//----------------------------------------------------------------