2007-02-11 19:03:00 +00:00
|
|
|
|
#include "board.h"
|
|
|
|
|
|
|
|
|
|
static int beepFreq = 0;
|
|
|
|
|
|
|
|
|
|
Board::Board() {
|
|
|
|
|
// Pin 1-6 sind ausg<73>nge, 0 und 7 eing<6E>nge
|
|
|
|
|
DDRA = (1 << PA1) | (1 << PA2) | (1 << PA3) | (1 << PA4) | (1 << PA5) | (1 << PA6);
|
|
|
|
|
PORTA = 0; // Alle Low, kein Pollup
|
|
|
|
|
|
|
|
|
|
// Alle Ausg<73>nge
|
|
|
|
|
DDRB = (1 << PB0) | (1 << PB1) | (1 << PB2) | (1 << PB3) | (1 << PB4) | (1 << PB5) | (1 << PB6) | (1 << PB7);
|
|
|
|
|
PORTB = (1 << PB1); // Alle Low bis PB1 , kein Pollup
|
|
|
|
|
|
2007-02-13 20:12:00 +00:00
|
|
|
|
// Alle Ausg<73>nge bis auf PC4/PC5 (Maussensor SDA)
|
|
|
|
|
DDRC = (1 << PC0) | (1 << PC1) | (1 << PC2) | (1 << PC3) | (1 << PC6) | (1 << PC7);
|
2007-02-11 19:03:00 +00:00
|
|
|
|
PORTC = 0; // Alle Low, kein Pollup
|
|
|
|
|
|
|
|
|
|
// Alle Ausg<73>nge bis auf PD0+1(I2C) + 2+3(RS232)
|
2007-02-17 00:35:01 +00:00
|
|
|
|
DDRD = (1 << PD3) | (1 << PD4) | (1 << PD5) | (1 << PD6) | (1 << PD7);
|
2007-02-11 19:03:00 +00:00
|
|
|
|
PORTD = (1 << PD0) | (1 << PD1); // Pollup-Widerstand an PD0+1 aktivieren
|
|
|
|
|
|
|
|
|
|
// PE5 ist eingang
|
|
|
|
|
DDRE = (1 << PE0) | (1 << PE1) | (1 << PE2) | (1 << PE3) | (1 << PE4) | (1 << PE6) | (1 << PE7);
|
|
|
|
|
PORTE = 0; // Alle Low, kein Pollup
|
|
|
|
|
|
|
|
|
|
// Alle Eing<6E>nge mit Pollup
|
|
|
|
|
DDRF = 0;
|
|
|
|
|
PORTF = (1 << PF0) | (1 << PF1) | (1 << PF2) | (1 << PF3) | (1 << PF4) | (1 << PF5) | (1 << PF6) | (1 << PF7);
|
|
|
|
|
|
|
|
|
|
// Alle Ausg<73>nge, PG0 und PG1 high
|
|
|
|
|
DDRG = (1 << PG0) | (1 << PG1) | (1 << PG2) | (1 << PG3) | (1 << PG4);
|
|
|
|
|
PORTG = (1 << PG0) | (1 << PG1);
|
|
|
|
|
|
2007-02-15 19:03:00 +00:00
|
|
|
|
// aktiviere Kanal A+B auf PWM1 mit 8Bit
|
|
|
|
|
TCCR1A = (1<< COM1A1) | (1<< COM1B1) | (1<< WGM10);
|
2007-02-17 00:35:01 +00:00
|
|
|
|
TCCR1B = (1<<ICNC1) | (1<<CS11); // | (1<<CS12) | (1<<CS10); // set clock/prescaler 1/1024 -> enable counter
|
2007-02-11 19:03:00 +00:00
|
|
|
|
|
|
|
|
|
// aktiviere Kanal A+B auf PWM3 mit 8Bit
|
2007-02-15 19:03:00 +00:00
|
|
|
|
TCCR3A = (1<< COM3A1) | (1<< COM3B1) | (1<< WGM10);
|
2007-02-17 00:35:01 +00:00
|
|
|
|
TCCR3B = (1<<ICNC3) | (1<<CS31); // | (1<<CS32) | (1<<CS30); // set clock/prescaler 1/1024 -> enable counter
|
2007-02-11 19:03:00 +00:00
|
|
|
|
|
|
|
|
|
// Schalte Motoren auf 0
|
|
|
|
|
motor(0,0);
|
|
|
|
|
motor(1,0);
|
|
|
|
|
motor(2,0);
|
|
|
|
|
motor(3,0);
|
|
|
|
|
|
2007-02-15 19:03:00 +00:00
|
|
|
|
// Kicker-richtung einstellen
|
|
|
|
|
PORTE &= ~(1 << PE6); // Pin2 low
|
|
|
|
|
PORTA |= (1 << PA2); // Pin1 high
|
|
|
|
|
|
2007-02-17 00:35:01 +00:00
|
|
|
|
// Dribbler-richtung einstellen
|
|
|
|
|
DRIBBLER_PORT |= DRIBBLER_A; // Pin1 high
|
|
|
|
|
DRIBBLER_PORT &= ~DRIBBLER_B; // Pin2 low
|
|
|
|
|
|
|
|
|
|
|
2007-02-11 19:03:00 +00:00
|
|
|
|
|
|
|
|
|
// aktiviere interrupt
|
|
|
|
|
sei();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Board::~Board() {
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Gibt einen Analogen Wert zur<75>ck
|
|
|
|
|
int Board::GetADC(uint8_t channel) {
|
|
|
|
|
uint8_t i;
|
|
|
|
|
uint16_t result = 0;
|
|
|
|
|
|
|
|
|
|
// Den ADC aktivieren und Teilungsfaktor auf 64 stellen
|
|
|
|
|
ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1);
|
|
|
|
|
|
|
|
|
|
// Kanal des Multiplexers waehlen
|
|
|
|
|
ADMUX = channel;
|
|
|
|
|
// Interne Referenzspannung verwenden (also 2,56 V)
|
|
|
|
|
ADMUX |= (1<<REFS1) | (1<<REFS0);
|
|
|
|
|
|
|
|
|
|
// Den ADC initialisieren und einen sog. Dummyreadout machen
|
|
|
|
|
ADCSRA |= (1<<ADSC);
|
|
|
|
|
while(ADCSRA & (1<<ADSC));
|
|
|
|
|
|
|
|
|
|
// Jetzt 3x die analoge Spannung and Kanal channel auslesen
|
|
|
|
|
// und dann Durchschnittswert ausrechnen.
|
|
|
|
|
for(i=0; i<3; i++) {
|
|
|
|
|
// Eine Wandlung
|
|
|
|
|
ADCSRA |= (1<<ADSC);
|
|
|
|
|
// Auf Ergebnis warten...
|
|
|
|
|
while(ADCSRA & (1<<ADSC));
|
|
|
|
|
|
|
|
|
|
result += ADCW;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ADC wieder deaktivieren
|
|
|
|
|
ADCSRA &= ~(1<<ADEN);
|
|
|
|
|
|
|
|
|
|
result /= 3;
|
|
|
|
|
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
2007-02-14 17:47:03 +00:00
|
|
|
|
// Gibt den Wert vom Abstandsensor zur<75>ck
|
|
|
|
|
int Board::GetAbstand(int i) {
|
|
|
|
|
int result = -1;
|
|
|
|
|
if((i < 0) || (i > 3)) return result; // Ung<6E>ltige Nummern rausfiltern
|
|
|
|
|
|
|
|
|
|
// Sende zun<75>chst einen Impuls aus
|
|
|
|
|
ABSTAND_DDR |= (1 << i); // Konfiguriere Pin als Ausgang
|
|
|
|
|
ABSTAND_PORT |= (1 << i); // Und setze ihn auf High
|
|
|
|
|
usleep(10); // Warte jetzt 10us
|
|
|
|
|
ABSTAND_PORT &= ~(1 << i); // Und setze den Pin wieder auf Low
|
|
|
|
|
ABSTAND_DDR &= ~(1 << i); // Konfiguriere Pin als Eingang
|
|
|
|
|
|
|
|
|
|
// Jetzt warten wir auf die Antwort vom Sensor
|
|
|
|
|
while(!(ABSTAND_PIN & i)) {} // w<>hrend er low ist nichts machen
|
|
|
|
|
while(ABSTAND_PIN & i) { // Und w<>hrend er high ist
|
|
|
|
|
result++; //schleifendurchl<68>ufe z<>henlen (unsauber, ich wei<65>)
|
|
|
|
|
asm volatile("nop"); // ein ganz bisschen warten
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Die Zahl der Schleifendurchl<68>ufe geben wir dann zur<75>ck
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
2007-02-11 19:03:00 +00:00
|
|
|
|
void Board::beep(int freq) {
|
|
|
|
|
beepFreq = freq;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Board::ledOff() {
|
|
|
|
|
PORTB |= (1 << PB1); // set bit
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Board::ledOn() {
|
|
|
|
|
PORTB &= ~(1 << PB1); // clear bit
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Board::led(bool status) {
|
|
|
|
|
if(status) ledOn();
|
|
|
|
|
else ledOff();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void Board::motor(int i, int speed)
|
|
|
|
|
{
|
|
|
|
|
if((i < 0) || (i > 3)) return;
|
|
|
|
|
const int OFFSET = 40; // Motor does not work with very low ratio
|
|
|
|
|
const int PWM_MAX = 255;
|
2007-02-13 19:43:03 +00:00
|
|
|
|
int pwm = 0; // PWM-Speed
|
2007-02-11 19:03:00 +00:00
|
|
|
|
|
2007-02-13 19:43:03 +00:00
|
|
|
|
if(speed != 0) pwm = abs(speed)+OFFSET;
|
2007-02-11 19:03:00 +00:00
|
|
|
|
if(pwm > PWM_MAX) pwm = PWM_MAX;
|
|
|
|
|
|
2007-02-13 19:43:03 +00:00
|
|
|
|
if(i == 0) {
|
2007-02-11 19:03:00 +00:00
|
|
|
|
MOTOR0_PWM = pwm;
|
|
|
|
|
if(speed > 0)
|
|
|
|
|
{
|
2007-02-13 19:43:03 +00:00
|
|
|
|
MOTOR0_PORT |= MOTOR0_A;//In 1 ein
|
|
|
|
|
MOTOR0_PORT &= ~MOTOR0_B;//In 2 aus
|
2007-02-11 19:03:00 +00:00
|
|
|
|
}
|
|
|
|
|
else if(speed < 0)
|
|
|
|
|
{
|
2007-02-13 19:43:03 +00:00
|
|
|
|
MOTOR0_PORT |= MOTOR0_B;//In 2 ein
|
|
|
|
|
MOTOR0_PORT &= ~MOTOR0_A;//In 1 aus
|
2007-02-11 19:03:00 +00:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2007-02-13 19:43:03 +00:00
|
|
|
|
MOTOR0_PORT |= MOTOR0_B;//In 2 ein
|
|
|
|
|
MOTOR0_PORT |= MOTOR0_A;//In 1 ein
|
2007-02-11 19:03:00 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
2007-02-13 19:43:03 +00:00
|
|
|
|
else if(i == 1) {
|
2007-02-11 19:03:00 +00:00
|
|
|
|
MOTOR1_PWM = pwm;
|
|
|
|
|
if(speed > 0)
|
|
|
|
|
{
|
2007-02-13 19:43:03 +00:00
|
|
|
|
MOTOR1_PORT |= MOTOR1_A;//In 1 ein
|
|
|
|
|
MOTOR1_PORT &= ~MOTOR1_B;//In 2 aus
|
2007-02-11 19:03:00 +00:00
|
|
|
|
}
|
|
|
|
|
else if(speed < 0)
|
|
|
|
|
{
|
2007-02-13 19:43:03 +00:00
|
|
|
|
MOTOR1_PORT |= MOTOR1_B;//In 2 ein
|
|
|
|
|
MOTOR1_PORT &= ~MOTOR1_A;//In 1 aus
|
2007-02-11 19:03:00 +00:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2007-02-13 19:43:03 +00:00
|
|
|
|
MOTOR1_PORT |= MOTOR1_B;//In 2 ein
|
|
|
|
|
MOTOR1_PORT |= MOTOR1_A;//In 1 ein
|
2007-02-11 19:03:00 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if(i == 2)
|
|
|
|
|
{
|
|
|
|
|
MOTOR2_PWM = pwm;
|
|
|
|
|
if(speed > 0)
|
|
|
|
|
{
|
2007-02-13 19:43:03 +00:00
|
|
|
|
MOTOR2_PORT |= MOTOR2_A;//In 1 ein
|
|
|
|
|
MOTOR2_PORT &= ~MOTOR2_B;//In 2 aus
|
2007-02-11 19:03:00 +00:00
|
|
|
|
}
|
|
|
|
|
else if(speed < 0)
|
|
|
|
|
{
|
2007-02-13 19:43:03 +00:00
|
|
|
|
MOTOR2_PORT |= MOTOR2_B;//In 2 ein
|
|
|
|
|
MOTOR2_PORT &= ~MOTOR2_A;//In 1 aus
|
2007-02-11 19:03:00 +00:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2007-02-13 19:43:03 +00:00
|
|
|
|
MOTOR2_PORT |= MOTOR2_B;//In 2 ein
|
|
|
|
|
MOTOR2_PORT |= MOTOR2_A;//In 1 ein
|
2007-02-11 19:03:00 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2007-02-15 19:03:00 +00:00
|
|
|
|
void Board::kicker() {
|
|
|
|
|
KICKER_AN
|
|
|
|
|
usleep(KICKER_USLEEP);
|
|
|
|
|
KICKER_AUS
|
|
|
|
|
}
|
|
|
|
|
|
2007-02-17 00:35:01 +00:00
|
|
|
|
void Board::dribblerOn() {
|
|
|
|
|
DRIBBLER_AN
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Board::dribblerOff() {
|
|
|
|
|
DRIBBLER_AUS
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Board::dribbler(bool status) {
|
|
|
|
|
if(status) dribblerOn();
|
|
|
|
|
else dribblerOff();
|
|
|
|
|
}
|
|
|
|
|
|
2007-02-11 19:03:00 +00:00
|
|
|
|
//PWM routine f<>r den Beeper
|
|
|
|
|
ISR (TIMER0_OVF_vect)
|
|
|
|
|
{
|
|
|
|
|
static int counter = 255;
|
|
|
|
|
|
|
|
|
|
if(counter > beepFreq/2) PORTG |= (1<<BEEPER_PIN);
|
|
|
|
|
else PORTG &= ~(1<<BEEPER_PIN);
|
|
|
|
|
|
|
|
|
|
if (counter==0) counter = 255;
|
|
|
|
|
else counter--;
|
|
|
|
|
}
|