272 lines
5.9 KiB
C
272 lines
5.9 KiB
C
#include <avr/interrupt.h>
|
|
#include <avr/io.h>
|
|
|
|
#define L_NORM PA0
|
|
#define L_HORN PA1
|
|
#define L_DAYL PA2
|
|
#define B_LEFT PA3
|
|
#define B_RIGH PA4
|
|
#define R_NORM PA5
|
|
#define R_BREK PA6
|
|
#define R_TBRK PA7
|
|
|
|
// L_NORM L_HORN L_DAYL B_LEFT B_RIGH R_NORM R_BREK R_TBRK
|
|
volatile uint8_t ofdim[8] = { 40, 10, 10, 1, 1, 10, 5, 5};
|
|
volatile uint8_t ofdis[8] = { 0, 0, 0, 0, 0, 0, 0, 0};
|
|
volatile uint8_t ondim[8] = { 15, 5, 4, 10, 10, 2, 40, 40};
|
|
volatile uint8_t ondis[8] = { 0, 0, 0, 0, 0, 0, 0, 0};
|
|
volatile uint8_t bltia[8] = { 0, 0, 0, 40, 40, 0, 0, 100};
|
|
volatile uint8_t bltib[8] = { 0, 0, 0, 30, 30, 0, 0, 1};
|
|
volatile uint8_t bltis[8] = { 0, 0, 0, 0, 0, 0, 0, 0};
|
|
volatile uint8_t bltit[8] = { 0, 0, 0, 0, 0, 0, 0, 0};
|
|
|
|
volatile uint8_t isson = 0b00000000;
|
|
volatile uint8_t trfla = 0b00000000;
|
|
|
|
// PB1 PB2 PB3
|
|
volatile uint8_t servo[3] = { 5, 5, 5};
|
|
volatile uint8_t servc[3] = { 0, 0, 0};
|
|
//volatile uint8_t servi[3] = { 0, 0, 0};
|
|
//volatile uint8_t servt[3] = { 0, 0, 0};
|
|
|
|
volatile uint8_t seton = 0b00000000;
|
|
volatile uint8_t blink = 0b00000000;
|
|
|
|
void dimmen(uint8_t i) {
|
|
if(seton & (1<<i)) {
|
|
if (isson & (1<<i)) {
|
|
if(ondim[i] == ondis[i]) {
|
|
PORTA &= ~(1<<i);
|
|
ondis[i] = 0;
|
|
isson &= ~(1<<i);
|
|
} else {
|
|
ondis[i]++;
|
|
}
|
|
} else {
|
|
if(ofdim[i] == ofdis[i]) {
|
|
PORTA |= (1<<i);
|
|
ofdis[i] = 0;
|
|
isson |= (1<<i);
|
|
} else {
|
|
ofdis[i]++;
|
|
}
|
|
}
|
|
} else {
|
|
if (isson & (1<<i)) {
|
|
if(ondim[i] == ondis[i]) {
|
|
PORTA &= ~(1<<i);
|
|
ondis[i] = 0;
|
|
isson &= ~(1<<i);
|
|
} else {
|
|
ondis[i]++;
|
|
}
|
|
} else {
|
|
if(ofdim[i] == ofdis[i]) {
|
|
PORTA &= ~(1<<i);
|
|
ofdis[i] = 0;
|
|
isson |= (1<<i);
|
|
} else {
|
|
ofdis[i]++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
void blinken(uint8_t i) {
|
|
if(blink & (1<<i)) {
|
|
if(seton & (1<<i)) {
|
|
if(bltia[i] == bltis[i] && bltib[i] == bltit[i]) {
|
|
seton &= ~(1<<i);
|
|
bltis[i] = 0;
|
|
bltit[i] = 0;
|
|
} else {
|
|
if(bltia[i] == bltis[i]) {
|
|
bltit[i]++;
|
|
bltis[i] = 0;
|
|
} else {
|
|
bltis[i]++;
|
|
}
|
|
}
|
|
} else {
|
|
if(bltia[i] == bltis[i] && bltib[i] == bltit[i]) {
|
|
seton |= (1<<i);
|
|
bltis[i] = 0;
|
|
bltit[i] = 0;
|
|
} else {
|
|
if(bltia[i] == bltis[i]) {
|
|
bltit[i]++;
|
|
bltis[i] = 0;
|
|
} else {
|
|
bltis[i]++;
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
if(seton & (1<<i)) {
|
|
if(bltia[i] == bltis[i] && bltib[i] == bltit[i]) {
|
|
seton = seton;
|
|
bltis[i] = 0;
|
|
bltit[i] = 0;
|
|
} else {
|
|
if(bltia[i] == bltis[i]) {
|
|
bltit[i]++;
|
|
bltis[i] = 0;
|
|
} else {
|
|
bltis[i]++;
|
|
}
|
|
}
|
|
} else {
|
|
if(bltia[i] == bltis[i] && bltib[i] == bltit[i]) {
|
|
seton = seton;
|
|
bltis[i] = 0;
|
|
bltit[i] = 0;
|
|
} else {
|
|
if(bltia[i] == bltis[i]) {
|
|
bltit[i]++;
|
|
bltis[i] = 0;
|
|
} else {
|
|
bltis[i]++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
void ausgabe() {
|
|
for(uint8_t i = 0; i < 8; i++) {
|
|
dimmen(i);
|
|
blinken(i);
|
|
}
|
|
}
|
|
/*void eingabe() {
|
|
for(uint8_t i = 0; i < 3; i++) {
|
|
if (PINB & (1<<i) ) { //Ein
|
|
if(trfla & (1<<i)) {
|
|
servc[i]++;
|
|
} else {
|
|
trfla |= (1<<i);
|
|
servc[i] = 0;
|
|
}
|
|
} else {
|
|
if(trfla & (1<<i)) {
|
|
trfla &= ~(1<<i);
|
|
servt[i] = servt[i] + servc[i];
|
|
if(servi[i] >= 5) {
|
|
servo[i] = servt[i];
|
|
servt[i] = 0;
|
|
servi[i] = 0;
|
|
} else {
|
|
servi[i]++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}*/
|
|
void verarbeitung() {
|
|
if(servo[0] >= 50 && servo[0] < 60) {
|
|
ofdim[0] = 8;
|
|
ondim[0] = 3;
|
|
ofdim[1] = 8;
|
|
ondim[1] = 3;
|
|
seton |= ((1<<L_NORM) | (1<<L_HORN) | (1<<R_NORM));
|
|
} else if(servo[0] >= 60) {
|
|
ofdim[0] = 1;
|
|
ondim[0] = 20;
|
|
ofdim[1] = 1;
|
|
ondim[1] = 20;
|
|
seton |= ((1<<L_NORM) | (1<<L_HORN) | (1<<R_NORM));
|
|
} else {
|
|
seton &= ~((1<<L_NORM) | (1<<L_HORN) | (1<<R_NORM));
|
|
}
|
|
//Servo 2 (Blinker):
|
|
if(servo[1] <= 43) {
|
|
if(!(blink & (1<<B_LEFT))) {
|
|
seton |= (1<<B_LEFT);
|
|
}
|
|
blink |= (1<<B_LEFT);
|
|
blink &= ~(1<<B_RIGH);
|
|
seton &= ~(1<<B_RIGH);
|
|
} else if(servo[1] >= 50){
|
|
if(!(blink & (1<<B_RIGH))) {
|
|
seton |= (1<<B_RIGH);
|
|
}
|
|
blink |= (1<<B_RIGH);
|
|
blink &= ~(1<<B_LEFT);
|
|
seton &= ~(1<<B_LEFT);
|
|
} else if(servo[2] > 34) {
|
|
blink &= ~((1<<B_LEFT) | (1<<B_RIGH));
|
|
seton &= ~((1<<B_LEFT) | (1<<B_RIGH));
|
|
}
|
|
//Servo 3 (Bremse):
|
|
if(servo[2] <= 45 && servo[2] > 34) {
|
|
seton |= ((1<<R_BREK) | (1<<R_TBRK));
|
|
blink &= ~(1<<R_TBRK);
|
|
} else if(servo[2] <= 34) {
|
|
seton |= (1<<R_BREK);
|
|
blink |= (1<<R_TBRK);
|
|
if(!(blink & (1<<B_RIGH))) {
|
|
seton |= ((1<<B_LEFT) | (1<<B_RIGH));
|
|
bltis[3] = 0;
|
|
bltis[4] = 0;
|
|
bltit[3] = 0;
|
|
bltit[4] = 0;
|
|
}
|
|
blink |= ((1<<B_LEFT) | (1<<B_RIGH));
|
|
} else {
|
|
seton &= ~((1<<PA6) | (1<<PA7));
|
|
blink &= ~(1<<PA7);
|
|
}
|
|
}
|
|
|
|
ISR (TIM0_OVF_vect)
|
|
{
|
|
/* Interrupt Aktion alle
|
|
(8000000/1)/256 Hz = 31250 Hz
|
|
bzw.
|
|
1/31250 s = 0,032 ms
|
|
*/
|
|
/*if(PORTA & (1<<L_NORM)) {
|
|
PORTA &= ~(1<<L_NORM);
|
|
} else {
|
|
PORTA |= (1<<L_NORM);
|
|
}*/
|
|
//asm volatile ("nop");
|
|
for(uint8_t i = 0; i < 3; i++) {
|
|
if (PINB & (1<<i) ) {
|
|
if(trfla & (1<<i)) {
|
|
servc[i]++;
|
|
} else {
|
|
trfla |= (1<<i);
|
|
servc[i] = 0;
|
|
}
|
|
} else {
|
|
if(trfla & (1<<i)) {
|
|
trfla &= ~(1<<i);
|
|
servo[i] = servc[i];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
int main (void) {
|
|
cli();
|
|
DDRA = 0xFF; //A komplett auf Ausgang
|
|
PORTA = 0x00; //A komplett Auschalten
|
|
DDRB = 0x00; //B komplett auf Eingang
|
|
PORTB = (1<<PB0) | (1<<PB1) | (1<<PB2); //Alle Pullups weg
|
|
TCCR0B |= (1<<CS00);
|
|
TIMSK0 |= (1<<TOIE0);
|
|
|
|
//TCCR0B |= (1<<CS02) | (1<<CS00);
|
|
sei();
|
|
|
|
seton |= (1<<L_DAYL);
|
|
|
|
|
|
while(1) {
|
|
//eingabe();
|
|
verarbeitung();
|
|
ausgabe();
|
|
}
|
|
}
|