diff --git a/es/blatt4/uebung4-2/uebung4-2.ino b/es/blatt4/uebung4-2/uebung4-2.ino index 53b74bd..d8ca6fd 100644 --- a/es/blatt4/uebung4-2/uebung4-2.ino +++ b/es/blatt4/uebung4-2/uebung4-2.ino @@ -5,7 +5,6 @@ // hardware pins int ledPin = 13; int analogLevel = 0; - int slaveAddress = 4; /** @@ -14,12 +13,18 @@ int slaveAddress = 4; void setup() { // Configure pins Wire.begin(); - Wire.onReceive(receiveEvent); - + pinMode(ledPin, OUTPUT); + digitalWrite(ledPin, LOW); // initialize serial port Serial.begin(9600); } +void writeResult(bool result) +{ + Serial.print("Result: "); + Serial.println(result ? "on" : "off"); +} + /** * Loop function for main code */ @@ -28,23 +33,21 @@ void loop() { Wire.write(1); Wire.endTransmission(); delay(100); - Wire.beginTransmission(slaveAddress); - Wire.write('r'); - Wire.endTransmission(); + Wire.requestFrom(slaveAddress, 1); + if (Wire.available()) { + int x = Wire.read(); + writeResult((bool) x); + } delay(1900); Wire.beginTransmission(slaveAddress); Wire.write(0); Wire.endTransmission(); delay(100); - Wire.beginTransmission(slaveAddress); - Wire.write('r'); - Wire.endTransmission(); + Wire.requestFrom(slaveAddress, 1); + if (Wire.available()) { + int x = Wire.read(); + writeResult((bool) x); + } delay(1900); } -void receiveEvent(int readBytes) -{ - int x = Wire.read(); - Serial.print("Result: "); - Serial.println(x ? "on" : "off"); -} diff --git a/es/blatt4/uebung4-3/uebung4-3.ino b/es/blatt4/uebung4-3/uebung4-3.ino new file mode 100644 index 0000000..a42cdda --- /dev/null +++ b/es/blatt4/uebung4-3/uebung4-3.ino @@ -0,0 +1,150 @@ +#include +#include +// these variables describe the used hardware pins +// adjust them when you use other pins +// hardware pins +int az = 50; +int xout = A4; +int zout = A2; +int vref = A3; +int ledPin = 13; +int slaveAddress = 4; +// servo +Servo ourServo; +int servoPin = 11; +// used to achieve a 10 Hz frequency +// don't touch them +long rc = 1049999; +// flags for servo +bool volatile cwMaxReached = false; +bool volatile ccwMaxReached = false; +bool volatile lightLED = false; +bool volatile read_ready = false; + +// tmp variables +int volatile zAxis = 0; +int volatile ref = 0; +double volatile differenceZRef = 0; +double volatile rotationZ = 0; +int volatile currentServoPos = 0; +int volatile newServoPos = 0; + +/** +* Calculates the servo position. +* +* @param int currentServoPos +* @param int rotationZ +*/ +int calculate_new_servo_pos(int currentServoPos, int rotationZ) { + int newServoPos = currentServoPos + rotationZ; + // faktor 10 zu gross (weil messung grad/sec + + if (newServoPos > 159) { + newServoPos = 159; + cwMaxReached = true; + lightLED = true; + } + if (newServoPos < 25) { + newServoPos = 25; + ccwMaxReached = true; + lightLED = true; + } + return newServoPos; +} +/** +* Setup function for initial setup code +*/ +void setup() { + Wire.begin(); + + pmc_set_writeprotect(false); + pmc_enable_periph_clk(ID_TC1); + // configure hardware timer + TC_Configure(TC0, 1, TC_CMR_WAVE | TC_CMR_WAVSEL_UP_RC | TC_CMR_TCCLKS_TIMER_CLOCK2) ; + TC_SetRC(TC0, 1, rc); + TC0->TC_CHANNEL[1].TC_IER = TC_IER_CPCS; // IER = interrupt enable register + TC0->TC_CHANNEL[1].TC_IDR = ~TC_IER_CPCS; + NVIC_ClearPendingIRQ(TC1_IRQn); + NVIC_EnableIRQ(TC1_IRQn); + // start hardware timer + TC_Start(TC0, 1); + + pinMode(ledPin, OUTPUT); + digitalWrite(ledPin, LOW); + ourServo.attach(servoPin); + ourServo.write(90); + // initialize serial port + Serial.begin(9600); +} +/** +* Loop function for main code +*/ +void loop() { + if (read_ready) { + + // berechnung auf 5000/1024 umstellen - was hat volt mit der berechnung zu tun? warscheinlich steht das so im aufgabenblatt ? + Serial.print("rotationZ: "); + Serial.println(rotationZ); + + Serial.print("currentServoPos: "); + Serial.println(currentServoPos); + Serial.print("newServoPos: "); + Serial.println(newServoPos); + /* + if (lightLED) { + blink(); + }*/ + ourServo.write(newServoPos + 1); + read_ready = false; + } +} +/** +* Used to handle the timer. +*/ +void TC1_Handler() +{ + // request static for some magic behind the curtain + TC_GetStatus(TC0, 1); + read_ready = true; + requestValues(); + //zAxis = analogRead(zout); + //ref = analogRead(vref); + //differenceZRef = zAxis - ref; + differenceZRef = (differenceZRef * 5000) / 1024; + rotationZ = (differenceZRef / 9.1); + if (fabs(rotationZ) > 4) { + currentServoPos = ourServo.read(); + newServoPos = calculate_new_servo_pos(currentServoPos, rotationZ / 10); + } +} + +void requestValues() +{ + // request zAxis + Wire.requestFrom(slaveAddress, 4); + int result = 0; + int i = 1; + while (Wire.available()) { + uint8_t x = (uint8_t) Wire.read(); + result = result | ((x) << ((sizeof(int) - i)*8)); + i++; + } + differenceZRef = (double) result; + Serial.print("Got: "); + Serial.println(result); +} + +void blink(){ + digitalWrite(ledPin, HIGH); + delay(10); + digitalWrite(ledPin, LOW); + delay(10); + digitalWrite(ledPin, HIGH); + delay(10); + digitalWrite(ledPin, LOW); + delay(10); + digitalWrite(ledPin, HIGH); + delay(10); + digitalWrite(ledPin, LOW); + lightLED = false; +} diff --git a/es/blatt5/uebung5-1/uebung5-1.ino b/es/blatt5/uebung5-1/uebung5-1.ino new file mode 100644 index 0000000..f5a0788 --- /dev/null +++ b/es/blatt5/uebung5-1/uebung5-1.ino @@ -0,0 +1,126 @@ +#include + +// pins +int slaveSelectPin = 10; +int rstPin = 6; +int dcPin = 5; + +// constants +int divider = 84; +int maxBufferIndex = 288; + +// buffer +char screenBuffer[288]; + +void setup() +{ + Serial.begin(9600); + + // intialize SPI + SPI.begin(slaveSelectPin); + SPI.setClockDivider(slaveSelectPin, divider); + + // initialize pins + pinMode(dcPin, OUTPUT); + pinMode(rstPin, OUTPUT); + + // initial reset of display + resetDisplay(); + + // initialization of display + digitalWrite(dcPin, LOW); + SPI.transfer(slaveSelectPin, 0x21); + SPI.transfer(slaveSelectPin, 0x14); + SPI.transfer(slaveSelectPin, 0xb0); + SPI.transfer(slaveSelectPin, 0x20); + SPI.transfer(slaveSelectPin, 0x0c); + digitalWrite(dcPin, HIGH); + + // initialize screen buffer + for (int i = 0; i < maxBufferIndex; i++) { + screenBuffer[i] = 0x0; + } +} + +/** + * Loop function for main code + */ +void loop() +{ + for (int y = 0; y < 84; y++) { + for (int x = 0; x < 48; x++) { + setPixel(x, y, 1); + } + flushBuffer(); + delay(20); + } + //flushBuffer(); + //delay(20); + Serial.println("fertig"); + +} + +void resetDisplay() +{ + digitalWrite(rstPin, LOW); + delay(500); + digitalWrite(rstPin, HIGH); +} + +void flushBuffer() +{ + for (int i = 0; i < maxBufferIndex; i++) { + SPI.transfer(slaveSelectPin, screenBuffer[i]); + } +} + +/** + * Sets the pixel at the given location. + * @param x + * @param y + * @param value + */ +void setPixel(int x, int y, int value) +{ + int bank = x / 8; + int relativeRow = x - bank * 8; + int bankStartIndex = bank * 48; + int index = bankStartIndex + y; + char bitValue = 0x0; + + if (value == 1) { + bitValue = 0xff; + } + + char existingValue = screenBuffer[index]; + char pixelMask = 1 << relativeRow; + pixelMask = 0x0 | pixelMask; + char invMask = ~ pixelMask; + char newValue = pixelMask & bitValue; + + char finalExistingValue = existingValue & invMask; + char finalValue = finalExistingValue | newValue; + + Serial.print("bank:"); + Serial.println(bank); + Serial.print("relRow:"); + Serial.println(relativeRow); + Serial.print("index:"); + Serial.println(index); + Serial.print("value:"); + Serial.println(value); + Serial.print("existingValue:"); + Serial.println(existingValue, BIN); + Serial.print("finalExistingValue:"); + Serial.println(finalExistingValue, BIN); + Serial.print("pixelMask:"); + Serial.println(pixelMask, BIN); + Serial.print("invMask:"); + Serial.println(invMask, BIN); + Serial.print("newValue:"); + Serial.println(newValue, BIN); + Serial.print("finalValue:"); + Serial.println(finalValue, BIN); + Serial.println("-----"); + screenBuffer[index] = finalValue; +}