Schaltungsbeschreibung der Roboter - Carl-Engler
Transcription
Schaltungsbeschreibung der Roboter - Carl-Engler
Roboter-Steuerungen Mikrocontroller 6 Robotersteuerungen mit Mikrocontroller (C-Programme) 6.1 Roboter stoppt beim Hinderniss, sonst Geradeausfahrt /*------------------------------------------------------------------------+ | File: Roboter0.c | | Autor: Bubbers Klasse: TGJ1 | | Controller: AT89C5131 (Atmel) | | Datum: 09.02.09 Version: 1.0 | +-------------------------------------------------------------------------+ | Beschreibung: | | Geradeausfahrt wenn kein Sensor low meldet: d.h. kein Hindernis | | Stopp wenn mindestens ein Sensor ein Hindernis meldet | | Achtung! Alle Schalter an P1 auf H !!!!!!!!! | +------------------------------------------------------------------------*/ #include <at89c5131.h> // Registeradressen Atmel AT89C5131 // Brückentreiber zur Steuerung // Motoren an P2: 0 0 0 0 ML1 // vor 0b00001010 // links 0b00000110 // rechts 0b00001001 // stopp 0b00000000 // // // // // // der Motoren an P2 ML2 MR1 MR2 beide Motoren vor Motor rechts vor, Motor Links zurück Motor rechts zurück, Motor links vor beide Motoren stopp Sensoren an P1: SL P1_3 Infrarot-Sensoren Links Lowaktiv! SML P1_2 Mitte-Links SMR P1_1 Mitte-Rechts SR P1_0 / Rechts Kontroll-Leds an P0: Zur Anzeige der Sensorsignale void main (void) //------ Hauptprogramm --------------------------------{ P2 = 0; // Grundzustand while(1) { P0 = P1; // Sensorsignale anzeigen // Stopp wenn einer der Sensoren ein Hinderniss anzeigt (0): if ((P1_3==0) || (P1_2==0) || (P1_1==0) || (P1_0==0)) P2 = 0; else P2 = 0b00001010; // sonst vorwaerts }// Ende while(1) }// Ende main // Folgende Alternative testen: // if (!P1_3 || !P1_2 || !P1_1 || !P1_0) P2 = 0; 6.1.1 Vom Compiler erzeugtes Assemblerprogramm: Carl-Engler-Schule, Bub 1 Roboter-Steuerungen-Controller.odt Roboter-Steuerungen Mikrocontroller 6.1.2 Programm-Abarbeitung sichtbar machen im Debugger • • • • • • Debugger starten Fenster Ports P1 (Sensoren) und P2 (Motoren) sichtbar machen Programm auf C-Ebene debuggen Fenster Disassembly-Code sichtbar machen Programm auf Assembler-Ebene debuggen Die Programm-Abarbeitung erfolgt zeitlich nacheinander! Einzelschritt: Step into C-Programm AssemblerProgramm Disassembly code Ports Watches: einzelne Portbits Carl-Engler-Schule, Bub Fenster zeigen: Doppelklick 2 Roboter-Steuerungen-Controller.odt Roboter-Steuerungen Mikrocontroller 6.1.3 Struktogramm (zum Vergleich: Programm-Ablauf-Plan) Robotersteuerung stopp Anfangszustand: stopp wiederhole ja P1_3 = 0? ja nein P1_2 = 0? ja ja P1_3 = 0? nein P1_1 = 0? ja nein P1_0 = 0? stopp nein ja P1_2 = 0? nein ja P1_1 = 0? nein nein ja vorwärts P1_0 = 0? nein vorwärts stopp 6.1.4 Zum Vergleich: Denkweise Digitaltechnik if ((SL==0) || (SML==0) || (SMR==0) || (SR==0)) motoren = stopp; SL SML SMR SR 6.1.5 Motor ≥1 Gleichzeitig Abfrage der Portpins (→ Programm roboter1.c) if ((P1 & 0b00001111) != 0b00001111) motoren = stopp; P1: P1_7 P1_6 P1_5 P1_4 P1_3 P1_2 P1_1 P1_0 1 0 0 1 1 1 0 1 & & & & & & & & 0 0 0 0 1 1 0 1 Carl-Engler-Schule, Bub 3 0 0 0 0 1 1 1 1 ≠ 00001111 → stopp Roboter-Steuerungen-Controller.odt Roboter-Steuerungen Mikrocontroller 6.2 Roboter stoppt beim Hinderniss, sonst Geradeausfahrt /*-----------------------------------------------------------------------+ | File: Roboter1.c | | Autor: Bubbers Klasse: TGJ1 | | Controller: AT89C5131 (Atmel) | | Datum: 09.02.09 Version: 1.0 | +-------------------------------------------------------------------------+ | Beschreibung: | | Geradeausfahrt wenn kein Sensor low meldet: d.h. kein Hindernis | | Stopp wenn mindestens ein Sensor ein Hindernis meldet | | Achtung! Alle Schalter an P1 auf H !!!!!!!!! | +------------------------------------------------------------------------*/ #include <at89c5131.h> sfr at P2 motoren; sfr at P1 sensoren; sfr at P0 leds; // // // // // sbit sbit sbit sbit SL; SML; SMR; SR; // Infrarot-Sensoren // // // vor links rechts stopp 0b00001010 0b00000110 0b00001001 0b00000000 at at at at P1_3 P1_2 P1_1 P1_0 #define #define #define #define Registeradressen Atmel AT89C5131 Brückentreiber zur Steuerung der Motoren an P2 x x x x ML1 ML2 MR1 MR2 P1 ist der Eingabeport Zur Anzeige der Sensorsignale // // // // beide Motor Motor beide Links Lowaktiv! Mitte-Links Mitte-Rechts Rechts Motoren vor rechts vor, Motor Links zurück rechts zurück, Motor links vor Motoren stopp void main (void) { motoren = stopp; // Grundzustand while(1) { leds = sensoren; // Sensorsignale anzeigen // Stopp wenn einer der Sensoren ein Hinderniss anzeigt (0): // ???? else motoren = vor; // sonst vorwaerts }// Ende while(1) }// Ende main 6.2.1 // // // // Aufgaben: nacheinander folgende Alternativen testen: if ((SL==0) || (SML==0) || (SMR==0) || (SR==0)) motoren = stopp; if (!SL || !SML || !SMR || !SR) motoren = stopp; if ((sensoren & 0b00001111) != 0b00001111) motoren = stopp; • • • Worin besteht der Unterschied? Nennen Sie Vor-und Nachteile der verschiedenen Versionen. Sehen Sie sich auch die erzeugt Assembler-Programme an um die Unterschiede zu verstehen. Carl-Engler-Schule, Bub 4 Roboter-Steuerungen-Controller.odt Roboter-Steuerungen Mikrocontroller 6.3 Roboter weicht Hinderniss aus /*----------------------------------------------------------------------------+ | File: Roboter2.c | | Autor: Bubbers Klasse: TGJ1 | | Controller: AT89C5131 (Atmel) | | Datum: 09.02.09 Version: 1.0 | +------------------------------------------------------------------------------+ | Beschreibung: | | einfache Robotersteuerung ohne Zeitverzögerung | | Geradeausfahrt wenn kein Sensor low meldet: | | d.h. kein Hindernis | | sonst rechts oder links ausweichen, | | Sensoren links dominant, weil zuerst abgefragt | | Achtung! Alle Schalter an P1 auf H !!!!!!!!! | +-----------------------------------------------------------------------------*/ #include <at89c5131.h> sfr at P2 motoren; sfr at P1 sensoren; sfr at P0 leds; // // // // // sbit sbit sbit sbit SL; SML; SMR; SR; // Infrarot-Sensoren // // // vor links rechts stopp 0b00001010 0b00000110 0b00001001 0b00000000 at at at at P1_3 P1_2 P1_1 P1_0 #define #define #define #define Registeradressen Atmel AT89C5131 Brückentreiber zur Steuerung der Motoren an P2 x x x x ML1 ML2 MR1 MR2 P1 ist der Eingabeport Zur Anzeige der Sensorsignale void main (void) { motoren = stopp; while(1) { leds = sensoren; // // // // beide Motor Motor beide Links Lowaktiv! Mitte-Links Mitte-Rechts Rechts Motoren vor rechts vor, Motor Links zurück rechts zurück, Motor links vor Motoren stopp // Grundzustand // Sensorsignale anzeigen }// Ende while(1) }// Ende main 6.4 Nehmen Sie den Roboter „an die Leine“: Der Roboter folgt einem Holzstab, den Sie vor die Sensoren halten. 6.5 Der Roboter folgt einer schwarzen Linie. Verwenden Sie die Sensoren auf der Unterseite. 6.6 Der Roboter folgt einer schwarzen Linie, stoppt aber bei einem Hinderniss. 6.7 Der Roboter folgt einer schwarzen Linie oder einem Holzstab vor den oberen Sensoren. (Holzstab ist dominat.) Carl-Engler-Schule, Bub 5 Roboter-Steuerungen-Controller.odt