/* * Interrupt * Created: 2024 * * Pindescription Arduino Nano * No. Funkt. PIN-Micro Used as Resultierende * Board Controller Input/Output Pindefinition * 0 RX PD0 RX In / 0 * 1 TX PD1 TX In / 0 *****Siehe Init.h***** * 2 INT0 PD2 US_Echo In / 0 * 3 INT1 PD3 Encoder In / 0 * 4 T0In PD4 Colour In / 0 * 5 Digit PD5 BLnWH In / 0 Data Direction Register Port D * 6 Digit PD6 Push_2 In / 0 Taster vorne * 7 Digit PD7 US_Trig Out/ 1 -> DDRD = 0b10000000 (nach Init.h übertragen!) * * 8 Digit PB0 Motor-A Out/ 1 * 9 OC1A PB1 PWM-A Out/ 1 *10 OC1B PB2 PWM-B Out/ 1 *11 Digit PB3 Motor-B Out/ 1 *12 Digit PB4 Servo Out/ 1 Data Direction Register Port B *13 LED PB5 LED Out/ 1 -> DDRB = 0b00111111 * Port B 6 und 7 sind nicht änderbar *A0 Ana PC0 Dist-2 In / 0 *A1 Ana PC1 Dist-3 In / 0 *A2 Ana PC2 Dist-4 In / 0(evtl.) *A3 Digit PC3 Push_1 In/ 1 Start-Taster (LOP-Taster) *A4 Digit PC4 SDA In / 0 Data Direction Register Port C *A5 Digit PC5 SCL In / 0 -> DDRC = 0b00000000 *A6 Ana ADC6 Dist-0 Port C 6 und 7 sind immer Analogkanäle *A7 Ana ADC7 Dist-1 */ #define LED 13 //LED of the Arduino board is mounted at Pin 13 #define Trigger_US 7 //Ultraschalltriggerpin #define Echo 2 //Ultraschallechopin unsigned long US_Takt; //alle 40 Millisekunden US neu initialisieren unsigned long Echo_Time; //Laufzeit des Echos unsigned long Echo_Time_begin; //Anfang der US-Messung unsigned long Laufzeit; unsigned long LED_Takt; //alle 500ms toggelt die LED void setup() { pinMode(Trigger_US, OUTPUT); //Pin 4 als Ausgang festlegen pinMode(Echo, INPUT); //Pin 2 als Eingang festlegen attachInterrupt(digitalPinToInterrupt(Echo), US, FALLING); //Bekanntmachung: //Interrupt wird ausgelöst durch fallende Flanke an Pin "Echo" (Pin 2), es //soll dann die Funktion "US()" ausgeführt werden. pinMode(LED, OUTPUT); Serial.begin(74880); //Baud Rate /*Alternative Programmierung:*****************************************/ //Init(); //Initalize the MC /*Alternative Programmierung Ende*************************************/ } void loop() { Serial.print("\n"); //Neue Zeile while (1) {//Endlosschleife //millis() liefert die Zeit die seit dem Einschalten des... //...Arduino Boards vergangen ist, in MILLIsekunden if(millis()- US_Takt > 40) { //40 ms vorbei ? digitalWrite (Trigger_US, HIGH); //Pin 4 für... delayMicroseconds(10); //...10us (Microsekunden)... digitalWrite (Trigger_US, LOW);//...HI triggern (von 0V auf 5V) Echo_Time_begin = micros(); //Start der Zeitmessung des US-Signals //micros() liefert die Zeit die seit dem Einschalten des... //...Arduino Boards vergangen ist, in MIKROsekunden US_Takt = millis(); //aktuelle Zeit in ms abspeichern } Serial.println(Laufzeit); //Laufzeit des Signals anzeigen //Die Zeile 32 unbedingt beim Wettlauf auskommentieren, braucht viel Zeit! /***LED blinken "nebenbei"********/ if(millis()- LED_Takt > 500) { //500 ms vorbei ? digitalWrite(LED, digitalRead(LED) ^ 1); //Toggle LED LED_Takt = millis(); //aktuelle Zeit in ms abspeichern } } } //Interrupt: Fallende Flanke an Pin 2 //Hierher springt der Mikrocontroller, wenn die Flanke am Echo-Pin von +5V auf 0V(GND) fällt void US (void) { Echo_Time = micros(); //aktuelle Zeit in us abspeichern Laufzeit = ((Echo_Time - Echo_Time_begin) - 460) /58; } //Initialize the Microcontroller void Init (void) { //Port settings (in brackets: pin of the arduino uno board, see above too) //0 = Input, 1 = Output DDRB = 0b00111111; //PortB Pin 5 to Output, LED on Arduino Uno board (13) DDRD = 0b10000000; }