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

Documents pareils