RC-Car/Beleuchtung/Beleuchtung/Beleuchtung.c
2020-09-17 10:08:59 +00:00

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();
}
}