Benutzer-Werkzeuge

Webseiten-Werkzeuge


projektesose2016:schrottbot:dokumentation

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen gezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
projektesose2016:schrottbot:dokumentation [2016/08/18 00:19]
diebitsch [Programmierung: Elektronik]
projektesose2016:schrottbot:dokumentation [2016/08/25 10:55] (aktuell)
fbonowski
Zeile 1: Zeile 1:
 +<note important>​
 +**Abschließende Bewertung Felix**
 +
 +  * Guter Aufbau
 +  * Schöne Bilder
 +  * Gut verständliche Texte
 +  * Keine Formeln bei der Erklärung von Schwingkreis und Navigation.
 +  * Keine Schaltpläne und keine Erklärung z.B. der Ansteuerung des Elektromagneten
 +  * Beschreibung des Schwingkreises bleibt etwas an der Oberfläche.
 +
 +**Sehr gut mit minimalen Abstrichen**
 +
 +</​note>​
 ====== Dokumentation ====== ====== Dokumentation ======
  
Zeile 57: Zeile 70:
 CPU-Cyclen mit Metall: ca. 171000 CPU-Cyclen mit Metall: ca. 171000
  
-Bei den ersten Versuchen mit dem Metalldetektor,​ damals noch eine Improvisierte Drahtrolle, ergab sich aber schnell ein neues Problem: Der Unterschied in CPU-Cyclen war anfangs kaum messbar und selbst bei unmittelbarer Nähe des Metalls zu Spule einfach zu gering. Deshalb mussten wir den Umweg über einen Comperator nehmen. ​Der Comperator bekommt die Schwingung des Schwingkreises eingespeist und vergleicht ​den Wert der Spannung mit 0V. Anschließend gibt er ein klar erkennbares Signal aus und ermöglicht uns somit auch mit der relativ schnell abklingen Schwingung des Schwingkreises zu arbeiten.+Bei den ersten Versuchen mit dem Metalldetektor,​ damals noch eine Improvisierte Drahtrolle, ergab sich aber schnell ein neues Problem: Der Unterschied in CPU-Cyclen war anfangs kaum messbar und selbst bei unmittelbarer Nähe des Metalls zu Spule einfach zu gering. Deshalb mussten wir den Umweg über einen Comperator nehmen. ​Dieser macht macht ledigtlich Schwingungen mit sehr kleiner Amplitude für den Arduino einfacher messbar.
 <​note>​ <​note>​
 **Kommentar Felix:** **Kommentar Felix:**
Zeile 66: Zeile 79:
  
  
-{{:​projektesose2016:​schrottbot:​ds1z_quickprint1.png?​300|}}//+{{:​projektesose2016:​schrottbot:​ds1z_quickprint1.png?​300|}}
  
 Auf dieser Abbildung erkennt man eine Messung unseres Metalldetektors visualisiert an einem Oszilloskop. Die dunkelblaue Linie ist das Signal vom Aduino, welches zu beginn der Schwingung von 5V auf 0V geschaltet wird. Die hellblaue Linie ist die durch das vom Aduino kommende Signal angeregte Schwingung, welche relativ schnell abflaut. Die gelbe Linie hingegen ist der Output des Comperators – eine gut auswertbare und stabile Rechteckspannung. Auf dieser Abbildung erkennt man eine Messung unseres Metalldetektors visualisiert an einem Oszilloskop. Die dunkelblaue Linie ist das Signal vom Aduino, welches zu beginn der Schwingung von 5V auf 0V geschaltet wird. Die hellblaue Linie ist die durch das vom Aduino kommende Signal angeregte Schwingung, welche relativ schnell abflaut. Die gelbe Linie hingegen ist der Output des Comperators – eine gut auswertbare und stabile Rechteckspannung.
  
-{{:​projektesose2016:​schrottbot:​metallhisto.png?​direct |}}//+ 
 +---- 
 + 
 + 
 +{{:​projektesose2016:​schrottbot:​metallhisto.png?​direct&​300 ​|}} 
  
 Diese Abbildung zeigt den Unterschied zwischen Messungen mit Metall neben der Spule und ohne. Wie man sieht sind die Werte erfreulich weit auseinander und somit leicht auszuwerten und im Programm zu trennen. Diese Abbildung zeigt den Unterschied zwischen Messungen mit Metall neben der Spule und ohne. Wie man sieht sind die Werte erfreulich weit auseinander und somit leicht auszuwerten und im Programm zu trennen.
  
-{{:​projektesose2016:​schrottbot:​detektor.jpg?​300|}}+ 
 +---- 
 + 
 + 
 +{{:​projektesose2016:​schrottbot:​detektor.jpg?​direct&​200 ​|}}
  
 Diese Abbildung zeigt unseren ursprünglichen Testaufbau mit der improvisierten Spule. Diese Abbildung zeigt unseren ursprünglichen Testaufbau mit der improvisierten Spule.
  
-{{:​projektesose2016:​schrottbot:​fastpulseinicr.zip|}}+----
  
-Das ist das Testprogramm um die Spule zu testen. 
  
 {{:​projektesose2016:​schrottbot:​20160804_145943.jpg?​300|}} {{:​projektesose2016:​schrottbot:​20160804_145943.jpg?​300|}}
  
 +Das ist das Testprogramm um die Spule zu testen: {{:​projektesose2016:​schrottbot:​fastpulseinicr.zip|}}
  
 ===== Abschätzung des Aufwandes:​===== ===== Abschätzung des Aufwandes:​=====
Zeile 136: Zeile 157:
  
  
-===== Bilder:​===== 
- 
-Schrottbott:​ 
- 
-{{:​projektesose2016:​schrottbot:​thumb_img_8701_1024.jpg?​300|}} 
-{{:​projektesose2016:​schrottbot:​thumb_img_8702_1024.jpg?​300|}} 
-{{:​projektesose2016:​schrottbot:​thumb_img_8703_1024.jpg?​300|}} 
-{{:​projektesose2016:​schrottbot:​thumb_img_8700_1024.jpg?​300|}} 
-{{:​projektesose2016:​schrottbot:​thumb_img_8699_1024.jpg?​300|}} 
-{{:​projektesose2016:​schrottbot:​thumb_img_8698_1024.jpg?​300|}} 
-{{:​projektesose2016:​schrottbot:​thumb_img_8697_1024.jpg?​300|}} 
-{{:​projektesose2016:​schrottbot:​thumb_img_8696_1024.jpg?​300|}} 
- 
- 
-=====Code:​===== 
- 
-<code c> 
-// Unser Roboter Schrottbot soll selbstständig durch einen Raum fahren 
-// Dabei soll er mithilfe eines Metalldetektors metallene Gegenstände auf dem Boden finden und diese mit einem Elektromagneten aufsammeln und in einen Auffangbehäter fallen lassen. 
- 
-#include <​Servo.h>​ 
-#include "​inputCaptureBlocking.h"​ 
- 
-Servo myservo; 
- 
-// Pin_Belegung Servo 
-const int servoPin = 6; 
- 
- 
-// Werte des Metalldetektors 
-const int inputCapturePin = 8;     // Digital-Pin 8 ist mit der hardware des Aduino Nano verbunden und muss deswegen zwingend verwendet werden 
-const int outPin ​         = A1;     // Gibt das Signal an, das den Schwingkreis anstößt 
-unsigned long curPulseLength = 0;   // Variable zum Speichern der Anzahl der Schwingungen des Schwingkreises 
-unsigned long wert = 0;             // Variblae für Bilden von einem Mittelwert von curPulseLength 
- 
- 
-// Variablen fürs Durchzählen von Schleifen 
-int zahl = 0; 
-int l = 0; 
- 
- 
-// Festlegung der Pins für die Ansteurung der Räder 
-const int fahrenRight = 3; 
-const int directionRight = 2; 
- 
-const int fahrenLeft = 5; 
-const int directionLeft = 4; 
- 
- 
-// Variablen für die Entfernungsmessungen 
-long laenge; 
-long abstandLinks;​ 
-long abstandMitte;​ 
-long abstandRechts;​ 
- 
- 
-// Pin-Belegung für die Entfernungsmesser 
-const int linksEcho = 12; 
-const int linksTrigger = 11; 
- 
-const int mitteEcho = 10; 
-const int mitteTrigger = 9; 
- 
-const int rechtsEcho = 7; 
-const int rechtsTrigger = A3; 
- 
- 
-// Elektromagnet Pin 
-const int magnetPin = 13; 
- 
- 
- 
-void setup() { 
- 
-  delay(500); 
- 
-  // Pins für den ersten Entfernungsmesser (links in Fahrtrichtung) 
-  pinMode(linksTrigger,​ OUTPUT); //​Trigger-Pin als Output definieren 
-  pinMode(linksEcho,​ INPUT); // Echo als Input defnieren 
- 
-  // Pins für den zweiten Entfernungsmesser (mittig in Fahrtrichtung) 
-  pinMode(mitteTrigger,​ OUTPUT); //Trig-PIn als Output definieren 
-  pinMode(mitteEcho,​ INPUT); // Echo als Input defnieren 
- 
-  // Pins für den dritten Entfernungsmesser (rechts in Fahrtrichtung) 
-  pinMode(rechtsTrigger,​ OUTPUT); //Trig-PIn als Output definieren 
-  pinMode(rechtsEcho,​ INPUT); // Echo als Input defnieren 
- 
-  // Serielle kommunikation für Anzeige der Abstände 
-  Serial.begin(115200);​ 
- 
-  // Festlegung der Pins für die Räder 
-  pinMode(fahrenRight,​ OUTPUT); 
-  pinMode(directionRight,​ OUTPUT); 
- 
-  pinMode(fahrenLeft,​ OUTPUT); 
-  pinMode(directionLeft,​ OUTPUT); 
- 
-  // Metalldetektor 
-  pinMode(outPin,​ OUTPUT); 
-  pinMode(inputCapturePin,​ INPUT); 
-  myservo.attach(6,​ 800, 2100); 
-} 
- 
- 
-//​Hauptprogramm:​ Der Roboter fährt eine Zick-Zacklinie mit festgelegter Länge in eine Richtung des Raumes um alles Metall im Raum zu finden und aufzusammeln 
-void loop() { 
-  lang(); ​            //​fährt eine lange Strecke geradeaus 
-  linksdreh(); ​       //macht eine Linksdrehung um 90° 
-  kurz(); ​            //​fährt eine kurze Strecke geradeaus 
-  linksdreh();​ 
-  lang(); 
-  rechtsdreh(); ​      //​macht eine Rechtsdrehung um 90° 
-  kurz(); 
-  rechtsdreh();​ 
-} 
- 
- 
-//Früheres Hauptprogramm,​ nun in eine Funktion ausgelagert um die Verschiedenne Bewegungen im neuen Hauptprogramm zu ermöglichen 
-void lang() { 
-  for (int t = 0; t < 1112;) {                //führt das Programm 1112 mal aus (dieser Zähler wird nur erhöht wenn der Roboter geradeaus fährt, nicht wenn er Metall einsammlet oder Rückwärts fährt). 1112 Steps vorwärts = 40cm. 
-    wert = 0;                                 //​setzt wert auf 0 
-    finden(); ​                                //​führt die Funktion finden aus 
-    for (int m = 0; m < 10; m++) {            //bildet aus 10 Messungen mit dem Wert "​curPulseLength"​ den Mittelwert "​wert"​ 
-      wert = wert + curPulseLength;​ 
-    } 
-    wert = wert / 10; 
-    if (wert > 169700) {                      //wenn der Mittelwert "​wert"​ einen bestimmten Mindestwert überschreitet,​ so wird das aus "​Metall gefunden"​ gezählt. Die Anzahl an Durchläufen mit gefunden Metall wird in der Variable "​Zahl"​ gespeichert. 
-      zahl++; 
-    } 
-    if (zahl < 10) {                          //wenn der Roboter weniger als 10 mal Metall gefunden hat fährt er einfach geradeaus und erhöht den Zähler der Anfänglichen for-Schleife 
-      linksFahren(); ​                         //dreht das linke Rad 
-      rechtsFahren(); ​                        //​dreht das rechte Rad 
-      t++; 
-    } 
-    else {                                    //sobald 10 mal Metall gefunden wurde (10 mal um unnötige Aussführungen dieses Programmteils durch flasche Detektierung des Metalldetektors zu vermeiden) wird der zweite Teil des Programms ausgeführt 
-      l = 0; 
-      while (l < 135) { 
-        RlinksFahren(); ​                      //​fährt 135 Stücke rückwärts um in Position zum Aufsammeln zu kommen 
-        RrechtsFahren();​ 
-        l++; 
-        t--; 
-      } 
-      einsammeln(); ​                          //​führt die Aufsammeln-Funktion aus 
-      zahl = 0;                               //​setzt die Anzahl an Durchläufen mit gefunden Metall zurück auf 0 
-    } 
-  } 
-} 
- 
- 
-//Die Funktion "​kurz"​ funktioniert analog zur Funktion "​lang",​ wird aber nur 56 mal statt 1112 mal ausgeführt. 
-void kurz() { 
-  for (int t = 0; t < 56;) { 
-    //​einsammeln();​ 
- 
-    wert = 0; 
-    finden(); 
-    for (int m = 0; m < 10; m++) { 
-      wert = wert + curPulseLength;​ 
-    } 
-    wert = wert / 10; 
-    if (wert > 169700) { 
-      zahl++; 
-    } 
-    if (zahl < 10) { 
-      linksFahren();​ 
-      rechtsFahren();​ 
-      t++; 
-    } 
-    else { 
-      while (l < 135) { 
-        RlinksFahren();​ 
-        RrechtsFahren();​ 
-        l++; 
-        t--; 
-      } 
-      einsammeln();​ 
-      zahl = 0; 
-      l = 0; 
-    } 
-  } 
-} 
- 
- 
-//diese Funtion dreht den Roboter um 90° nach rechts (Räder werden in entgegengesetzte Richtungen gedreht) 
-void rechtsdreh() { 
-  for (int o = 0; o < 475; o++) { 
-    RlinksFahren();​ 
-    rechtsFahren();​ 
-  } 
-} 
- 
- 
-//diese Funtion dreht den Roboter um 90° nach links (Räder werden in entgegengesetzte Richtungen gedreht) 
-void linksdreh() { 
-  for (int o = 0; o < 475; o++) { 
-    linksFahren();​ 
-    RrechtsFahren();​ 
-  } 
-} 
- 
- 
-// Abstände der drei Entfernungsmesser werden in der Funktion "​abstandMessung"​ gemessen (Diese Funktion wird in unserem finalen Programm nicht verwendet) 
-int abstandMessung() { 
- 
-  // abstandLinks 
-  digitalWrite(linksTrigger,​ LOW); //Input auf LOw setzen und 2Mikrosekunden warten 
-  delayMicroseconds(2);​ 
-  digitalWrite(linksTrigger,​ HIGH); //Input für 5 Sekunden auf HIgh setzen, um Messung im Ultrschallgerät auszulösen 
-  delayMicroseconds(5);​ 
-  digitalWrite(linksTrigger,​ LOW); // Dann wiedr ausschalten 
- 
-  laenge = pulseIn(linksEcho,​ HIGH); // Erhalte Messergebnis vom Input in Pulsweitenmodulation 
- 
-  abstandLinks = (laenge * 34) / 2000; 
- 
-  digitalWrite(mitteTrigger,​ LOW); //Input auf LOw setzen und 2Mikrosekunden warten 
-  delayMicroseconds(2);​ 
-  digitalWrite(mitteTrigger,​ HIGH); //Input für 5 Sekunden auf HIgh setzen, um Messung im Ultrschallgerät auszulösen 
-  delayMicroseconds(5);​ 
-  digitalWrite(mitteTrigger,​ LOW); // Dann wiedr ausschalten 
- 
-  laenge = pulseIn(mitteEcho,​ HIGH); // Erhalte Messergebnis vom Input in Pulsweitenmodulation 
- 
-  abstandMitte = (laenge * 34) / 2000; 
- 
-  digitalWrite(rechtsTrigger,​ LOW); //Input auf LOw setzen und 2Mikrosekunden warten 
-  delayMicroseconds(2);​ 
-  digitalWrite(rechtsTrigger,​ HIGH); //Input für 5 Sekunden auf HIgh setzen, um Messung im Ultrschallgerät auszulösen 
-  delayMicroseconds(5);​ 
-  digitalWrite(rechtsTrigger,​ LOW); // Dann wieder ausschalten 
- 
-  laenge = pulseIn(rechtsEcho,​ HIGH); // Erhalte Messergebnis vom Input in Pulsweitenmodulation 
- 
-  abstandRechts = (laenge * 34) / 2000; 
- 
-  return abstandLinks;​ 
-  //  return abstandMitte;​ 
-  //  return abstandRechts;​ 
-} 
- 
-//​Nachfoldend sind die Funktionen fürs Vor- und Rückwärtsfahren für das linke und das rechte Rad 
- 
-//dreht das linke Rad vorwärts 
-void linksFahren() { 
-  digitalWrite(directionLeft,​ LOW); 
-  digitalWrite(fahrenLeft,​ HIGH); 
-  delayMicroseconds(10);​ 
-  digitalWrite(fahrenLeft,​ LOW); 
-  delay(5); 
- 
-} 
- 
- 
-//dreht das rechte Rad vorwärts 
-void rechtsFahren() { 
-  digitalWrite(directionRight,​ HIGH); 
-  digitalWrite(fahrenRight,​ HIGH); 
-  delayMicroseconds(10);​ 
-  digitalWrite(fahrenRight,​ LOW); 
-  delay(5); 
- 
-} 
- 
- 
-//dreht das linke Rad rückwärts 
-void RlinksFahren() { 
-  digitalWrite(directionLeft,​ HIGH); 
-  digitalWrite(fahrenLeft,​ HIGH); 
-  delayMicroseconds(10);​ 
-  digitalWrite(fahrenLeft,​ LOW); 
-  delay(5); 
- 
-} 
- 
- 
-//dreht das rechte Rad rückwärts 
-void RrechtsFahren() { 
-  digitalWrite(directionRight,​ LOW); 
-  digitalWrite(fahrenRight,​ HIGH); 
-  delayMicroseconds(10);​ 
-  digitalWrite(fahrenRight,​ LOW); 
-  delay(5); 
- 
-} 
- 
- 
-// Bewegt Rohr mithilfe des Servos nach vorne 
-// Schaltet den Elektromagneten ein und sammelt somit das Metall unter sich ein. 
-// Bewegt Magneten über Auffangbehälter und schaltet Magneten ab, sodass Metall in Auffangbehälter landet. 
- 
-void einsammeln() { 
-  myservo.detach(); ​                              //​Servo wird ab- und dann wieder angeschaltet da er Durch die Messung des MEtalldetektors automatisch deaktiviert wird 
-  myservo.attach(6,​ 800, 2100); 
-  for (int u = 0; u < 40; u++) {                  //der Roboter dreht sich ein Stück um mit dem Elektromagnet näher am Metall zu sein 
-    RlinksFahren();​ 
-    rechtsFahren();​ 
-  } 
-  for (int x = 180; x > 0; x--) {                 //​bewegt Rohr nach oben (Servo Position 0) 
-    myservo.write(x);​ 
-    delay(20); 
-  } 
-  digitalWrite(magnetPin,​ HIGH); ​                //​schlatet den Elektromagnet ein 
-  for (int u = 0; u < 160; u++) {                //beweget den Roboter nach links und rechts um die Reichweite des Elektromagents zu erhöhen 
-    RlinksFahren();​ 
-    rechtsFahren();​ 
-  } 
-  for (int u = 0; u < 320; u++) { 
-    linksFahren();​ 
-    RrechtsFahren();​ 
-  } 
-  for (int u = 0; u < 160; u++) { 
-    RlinksFahren();​ 
-    rechtsFahren();​ 
-  } 
-  delay(1000); ​                                   //wartet 5 Sekunden 
-  for (int x = 0; x < 180; x++) {                 //​bewegt Rohr nach oben (Servo Position 180) 
-    myservo.write(x);​ 
-    delay(20); 
-  } 
-  digitalWrite(magnetPin,​ LOW);                   //​schaltet den Elektromagneten aus 
-  delay(1000);​ 
-  for (int u = 0; u < 40; u++) {                  //dreht sich wieder zurück in die Anfangsposition 
-    linksFahren();​ 
-    RrechtsFahren();​ 
-  } 
-} 
- 
- 
-//wertet Informationen des Metalldetektors aus und gibt die Anzahl an CPU-Cyclen wärend 10 Schwingen des Schwingkreises in der Variablen "​curPulseLength"​ zurück 
-unsigned long finden() { 
-  digitalWrite(outPin,​ HIGH); ​                    //​stößt den Schwingkreis an 
-  delay(2); 
-  digitalWrite(outPin,​ LOW); 
-  curPulseLength = measrePulseByICP(); ​           //misst die Anzahl an CPU-Cyclen während 10 Schwingungen des Schwingkreises und schreibt diese in die Variable "​curPulseLength"​ 
-  delay(2); 
-  return curPulseLength; ​                         //returnt "​curPulseLength"​ 
-} 
- 
- 
-</​code>​ 
- 
- 
-<code c> 
-//dieser Quelltext ist nicht von der Gruppe Schrottbot sondern von Felix 
-//der Quelltext wurde lediglich für unsere Zwecke leicht angepasst 
- 
- 
- 
-#pragma once 
-/* 
-   ​Measure Times using AVR Timer1 Input Capture 
- 
-   Timer One counts CPU-Cycles. 
-   After enabling "Input Capture",​ it will save the current cycle count in the ICR1 Register whenever a Rising/​Falling Signal flank is detected on pin 8 
-   This will break the servo library 
- 
-*/ 
- 
-#include "​Arduino.h"​ 
- 
-// some bit-masking shortcuts 
-#define sbi(ADDRESS,​BIT) ((ADDRESS) |= (1<<​(BIT))) 
-#define cbi(ADDRESS,​BIT) ((ADDRESS) &= ~(1<<​(BIT))) 
-#define outp(VAL,​ADRESS) ((ADRESS) = (VAL)) 
-#define inp(VAL) (VAL) 
- 
-unsigned long measrePulseByICP() { 
-  int n = 5;                                                                                                                 //​maximale anzahl an messungen 
-  noInterrupts();​ // we don't want to be disturbed ​                                                                           Präampel 
-  // prepare timer 1 for input capture 
-  TCCR1A = 0 ; 
-  TCCR1B = (1 << ICNC1) +   // Normal counting mode 
-           (1 << CS10) +    // set prescaler to 1 
-           (1 << ICES1); ​   // trigger on rising edge 
-  TIMSK1 = 0;               // disable all Timer1 related interrupts 
-  TIFR1 =  (1 << TOV1) + (1 << ICF1); // clear the interrupt pending flags. Bizarre: The interrupt pending flags are set to ZERO by writing ONE to it (!!!) 
-  TCNT1 = 0;     // reset the timer counter so we start counting at zero 
-  unsigned int zeitamanfang = 0;                                                                                               //​anzahl an CPU_cycelm am anfang der messung 
-  unsigned int zeitamende = 0;                                                                                                 //​anzahl der CPU-cyclen am ende der messung 
- 
- 
-  unsigned int timerOverFlowCount = 0; // number of overflows since the pulse has started ​                                      ​deklarierte Variablen 
- 
-  // here we could do anything that we need to create that pulse... 
- 
- 
-  register uint8_t tifrCached = TIFR1; ​   // read all flags at once to prevent race conditions 
- 
-  // now we wait for the voltage at the pin to rise and count timer overflows while we do so.                                 ​wartet auf rising edge flag 
-  //​digitalWrite(4,​ HIGH); 
-  while (!(tifrCached & (1 << ICF1))) {// repeat while input capture edge detect flag is not set 
-    if (tifrCached & (1 << TOV1)) {  // check if the timer overflow bit is set 
-      TIFR1 =  (1 << TOV1); ​         // clear overflow flag 
-    } 
-    tifrCached = TIFR1; ​              // read all flags at once to prevent race conditions 
-  } 
-  TIFR1 =  (1 << ICIE1); ​ // clear input edge detect flag 
-  zeitamanfang = ICR1;   // remember the timer value when the pin changed to HIGH                                           ​schreib CPU-Zählerstand 
-  // digitalWrite(4,​ LOW); 
-  for (int i = 0; i < n; i++) {                                                                                            //​wiederholt die messung der nulldurchgänge 10 mal 
-    tifrCached = TIFR1; ​              // read all flags at once to prevent race conditions 
-    while (!(tifrCached & (1 << ICF1))) {// repeat while input capture edge detect flag is not set 
-      if (tifrCached & (1 << TOV1)) {  // check if the timer overflow bit is set 
-        timerOverFlowCount++; ​          // count timer overflows... 
-        TIFR1 =  (1 << TOV1); ​         // clear overflow flag 
-      } 
-      tifrCached = TIFR1; ​              // read all flags at once to prevent race conditions 
- 
-    } 
-    TIFR1 =  (1 << ICIE1); ​ // clear input edge detect flag 
-  } 
-  zeitamende = ICR1; 
- 
- 
-  interrupts(); ​                       // let the rest of the µC do it's work again... 
- 
-  // now we can calculate the amount of CPU-cylces between rising and falling edge... 
-  // due to unsigned int arithmetics,​ we can just substract timer values regardless of overflows and add a bitshiftet overflow count. 
-  unsigned long pulseCycles = (unsigned long)(zeitamende - zeitamanfang) | (unsigned long)timerOverFlowCount << 16; // combine the number of overflows with the timer value when the flanc was detected. 
-  // Serial.println(timerOverFlowCount);​ 
-  // Serial.println(zeitamende);​ 
-  // Serial.println(zeitamanfang);​ 
-  // Serial.println(pulseCycles);​ 
-  return pulseCycles;​ 
-} 
- 
-</​code>​ 
  
 +=====Code=====
  
 +Dies ist unser gesamter Quellcode.
  
 {{:​projektesose2016:​schrottbot:​Schrottbot.zip|}} {{:​projektesose2016:​schrottbot:​Schrottbot.zip|}}
projektesose2016/schrottbot/dokumentation.1471472361.txt.gz · Zuletzt geändert: 2016/08/18 00:19 von diebitsch