Skip to content
Snippets Groups Projects

updated comments to main.c

Merged Alexander Görlitz requested to merge master into main
1 file
+ 148
147
Compare changes
  • Side-by-side
  • Inline
+ 148
147
@@ -2,7 +2,14 @@
@@ -2,7 +2,14 @@
* @file main.c
* @file main.c
* @brief Dies ist eine Beschreibung der main.c Datei.
* @brief Dies ist eine Beschreibung der main.c Datei.
*
*
* Detaillierte Beschreibung der Datei.
* Diese Datei enthlt die Hauptfunktion und die Initialisierungsroutinen fr das System.
 
* Das System verwendet einen MSP430FR2355-Mikrocontroller, um verschiedene Hardware-Komponenten
 
* zu steuern, einschlielich eines Servos SG90, eines Ultraschallsensor HC-SR04 und eines LC-Displays HD44780.
 
*
 
* @authors
 
* - Alexander Grlitz
 
* - Aaron Kaipf
 
* - Christopher Seitz
*/
*/
/* --COPYRIGHT--,BSD
/* --COPYRIGHT--,BSD
@@ -35,58 +42,17 @@
@@ -35,58 +42,17 @@
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --/COPYRIGHT--*/
* --/COPYRIGHT--
//******************************************************************************
*/
// Software Trim on 1MHz DCO
//
// This example uses the following peripherals and I/O signals. You must
// review these and change as needed for your own board:
// - CS module
// - GPIO Port peripheral
//
// This example uses the following interrupt handlers. To use this example
// in your own application you must add these interrupt handlers to your
// vector table.
//
// TI sample project cs_ex1_DCO1MHzSWTrim
// Modified by S. Steddin
// 2020-06-22
//******************************************************************************
/*
/*
* Version 0.1
* Version 1.0.0
*
* Zweckbestimmung:
* Demonstration, wie der Ultraschallsensor SR04 zur Messung eines Abstandes
* ber das Launchpad angesteuert werden kann.
*
*
* Bestimmungsgemer Gebrauch:
* Bestimmungsgemer Gebrauch:
* 1. Ultraschallsensor gem Verdrahtungsplan mit dem Launchpad verbinden.
* 1. Launchpad ber USB-Buchse mit Spannung versorgen
* Der Sensor soll mit 5V versorgt werden; das an das Launchpad gesendete
* ECHO-Signal muss daher ber einen Spannungsteiler mit dem CCIA Pin verbunden
* verbunden werden, damit die maximal zulssigen 3,3V am DIO-Pin nicht ber-
* schritten werden.
* 2. Launchpad ber USB-Buchse mit Spannung versorgen
* 3. Sensor auf Objekt ausrichten, zu dem der Abstand gemessen werden soll
* 4. ber Breakpoint den errechneten Abstandswert auslesen.
*
*
* Funktionale Anforderungen:
* - Es soll der gesamte mgliche Messbereich des Sensors ausgentzt werden
* - Whrend der Laufzeit des US-Bursts soll die rote LED leuchten
* - Messwiederholrate 10Hz
*
* Nicht funktionale Anforderungen:
* - SMCLK: 1 MHz kalibriert
* - Timerclock 500 kHz
*
* Iterationsplan:
* - 0.1: clocksystem SMCLK 1 MHz + Definition des us_sensor API
* Version liefert noch keine Ergebnisse; nur das Rohgerst
* - 0.2: Messwert wird ber debugger ausgewertet
* - 0.3: Messwertausgabe ber Backchannel UART
* - 0.4: Messwertausgabe ber TI GUI-Monitor
*
*
* Ultraschallsensor Verdrahtung:
* Ultraschallsensor Verdrahtung:
 
*
* MSP430FR2355 5V---|
* MSP430FR2355 5V---|
* ----------------- ----|-------
* ----------------- ----|-------
* /|\| | |
* /|\| | |
@@ -100,55 +66,36 @@
@@ -100,55 +66,36 @@
* | | | GND
* | | | GND
* GND
* GND
*
*
*
* LCD und I2C Verdrahtung:
* LCD und I2C Verdrahtung:
* MSP430FR2355 4k7 4k7 PCF8574
* MSP430FR2355 PCF8574T
* master | |
* master
* ----------------- | |
* -----------------
* -|XIN P1.2/UCB0SDA|<-|----+->| SDA
* -|XIN P1.2/UCB0SDA|<-------->| SDA
* | | | |
* | | |
* -|XOUT | | |
* -|XOUT | |
* | P1.3/UCB0SCL|<-+------>|SCL
* | P1.3/UCB0SCL|<-------->|SCL
* LEDred<--|P1.0 | |
* LEDred<--|P1.0 | |
* 3,3V-->| Vcc
* 5V-->| Vcc
*
*
* Hinweis zu den pull-up Widerstnden:
* MSP430FR235x Demo - Timer1_B3, PWM TB1.1-2, Up Mode, DCO SMCLK
* Prfen, ob die Widerstnde bereits auf dem PCF8574 board installiert sind (Standard).
* Ggf. mssen diese entfernt werden, wenn das Display nicht mit 3,3V, sondern mit 5V
* betrieben werden soll. Anstelle der entfernten SMD-Widerstnde mssen dann externe
* pull-up Widerstnde installiert werden, die nicht mit Vcc des Displays (5V), sondern
* mit Vcc des Launchpads (3,3V) verbunden sind. Fr die Steuerung des I2C Buses sollten
* in diesem Fall 3,3 V knapp ausreichend sein (> 0,7*Vcc), jedoch wird das Display hierbei
* knapp auerhalb der Spezifikation betrieben.
*
*
*
*
*//*******************************************************************************
* Servo Verdrahtung:
// MSP430FR235x Demo - Timer1_B3, PWM TB1.1-2, Up Mode, DCO SMCLK
* MSP430FR2355
//
* ---------------
// Description: This program generates two PWM outputs on P2.0,P2.1 using
* /|\| |
// Timer1_B configured for up mode. The value in CCR0, 1000-1, defines the PWM
* | | |
// period and the values in CCR1 and CCR2 the PWM duty cycles. Using ~1MHz
* --|RST |
// SMCLK as TBCLK, the timer period is ~1ms with a 75% duty cycle on P2.0
* | |
// and 25% on P2.1.
* | P2.0/TB1.1|--> CCR1 - XX% PWM
// ACLK = n/a, SMCLK = MCLK = TBCLK = 1MHz
* | |
//
*
// Servo Verdahtung:
* Darren Lu
// MSP430FR2355
* Texas Instruments Inc.
// ---------------
* Oct. 2016
// /|\| |
* Built with IAR Embedded Workbench v6.50 & Code Composer Studio v6.2
// | | |
// --|RST |
// | |
// | P2.0/TB1.1|--> CCR1 - XX% PWM
// | |
//
//
// Darren Lu
// Texas Instruments Inc.
// Oct. 2016
// Built with IAR Embedded Workbench v6.50 & Code Composer Studio v6.2
//
*/
*/
 
#include "driverlib.h"
#include "driverlib.h"
#include "Board.h"
#include "Board.h"
#include "us_sensor.h"
#include "us_sensor.h"
@@ -163,8 +110,17 @@
@@ -163,8 +110,17 @@
// Der PCF8574 Baustein hat folgende 7-Bit Adresse: 0x3F (dez 63) : 0011 1111
// Der PCF8574 Baustein hat folgende 7-Bit Adresse: 0x3F (dez 63) : 0011 1111
// Somit ergibt sich fr Schreibzugriffe folgender Adresswert: 0111 1110 = 0x7E
// Somit ergibt sich fr Schreibzugriffe folgender Adresswert: 0111 1110 = 0x7E
// Die Driverlib erwartet jedoch die Angabe der tatschlichen 7-Bit Adresse, also 0x3F
// Die Driverlib erwartet jedoch die Angabe der tatschlichen 7-Bit Adresse, also 0x3F
#define SLAVE_ADDRESS 0x27 //#define SLAVE_ADDRESS 0x3F //fuer PCF8574AT bei nur 8574T dann 0x27
/**
 
* @brief I2C-Slave-Adresse fr den PCF8574 I/O Expander.
 
*
 
* Diese Definition legt die I2C-Slave-Adresse fr den PCF8574 I/O Expander fest.
 
* Je nach Version des PCF8574 (PCF8574T oder PCF8574AT) wird die entsprechende Adresse gewhlt.
 
* - PCF8574T: Adresse 0x27
 
* - PCF8574AT: Adresse 0x3F
 
*/
 
#define SLAVE_ADDRESS 0x27
 
///initialisiert die pins
void init_gpio(void);
void init_gpio(void);
void init_cs(void);
void init_cs(void);
@@ -176,37 +132,43 @@ void init_i2c(void);
@@ -176,37 +132,43 @@ void init_i2c(void);
void sleep(uint16_t ms);
void sleep(uint16_t ms);
void detectedSomething(int i, uint16_t pDistance);
void detectedSomething(int pPosition, uint16_t pDistance);
void configurePWM(int pwmSignal);
void configurePWM(int pwmSignal);
void startUp();
void startUp();
///main funktion fr Interactivitt
/**
 
* @brief Hauptfunktion fr die Interaktivitt.
 
*
 
* Diese Funktion initialisiert die Hardware, konfiguriert den PWM fr den Servo,
 
* startet den Ultraschallsensor und verarbeitet die Entfernungsmessungen, um
 
* erkannte Patienten anzuzeigen.
 
*/
void main (void)
void main (void)
{
{
uint16_t distance;
uint16_t distance;
char string1[17] = ""; //null-Terminierung belegt 17. Zeichen
char string1[17] = ""; //null-Terminierung belegt 17. Zeichen
char string2[17] = ""; //wichtig: den String auf ganzer Lnge definieren,
char string2[17] = ""; //wichtig: den String auf ganzer Lnge definieren,
//damit am an den letzten Stellen nicht noch der
//damit am an den letzten Stellen nicht noch der
//Rest von der letzten Ausgabe auftaucht.
//Rest von der letzten Ausgabe auftaucht.
WDT_A_hold(WDT_A_BASE); //Stop watchdog timer
WDT_A_hold(WDT_A_BASE); //Stop watchdog timer
//Servo
// Servo-Initialisierung
P2DIR |= BIT0; // P2.0 output
P2DIR |= BIT0; // P2.0 output
P2SEL0 |= BIT0; // P2.0 options select
P2SEL0 |= BIT0; // P2.0 options select
// Disable the GPIO power-on default high-impedance mode to activate
// Disable the GPIO power-on default high-impedance mode to activate
// previously configured port settings
// previously configured port settings
//Green LED
// Grne LED-Initialisierung
P6DIR |= 0x40; // Set P6.6 to output direction
P6DIR |= 0x40; // Set P6.6 to output direction
//Green LED End
// Grne LED-Initialisierung Ende
PM5CTL0 &= ~LOCKLPM5;
PM5CTL0 &= ~LOCKLPM5; // Port-Einstellungen freigeben
TB1CCR0 = 20000-1; // PWM Period
TB1CCR0 = 20000-1; // PWM Period
TB1CCTL1 = OUTMOD_7; // CCR1 reset/set
TB1CCTL1 = OUTMOD_7; // CCR1 reset/set
//Servo End
// Servo-Initialisierung Ende
init_gpio();
init_gpio(); // GPIO initialisieren
//LCD
//LCD
init_timer();
init_timer();
@@ -214,53 +176,53 @@ void main (void)
@@ -214,53 +176,53 @@ void main (void)
init_i2c();
init_i2c();
//LCD End
//LCD End
sr04_init();
sr04_init(); // HC-SR04-Ultraschallsensor initialisieren
__bis_SR_register(GIE); //Enable global interrupt
__bis_SR_register(GIE); // Globalen Interrupt aktivieren
sr04_start();
sr04_start(); // HC-SR04-Ultraschallsenso starten
lcd1602_init();
lcd1602_init(); // LCD initialisieren
lcd1602_backlight(true);
lcd1602_backlight(true); // LCD-Hintergrundbeleuchtung einschalten
lcd1602_write(1,string1);
lcd1602_write(1,string1);
lcd1602_write(2,string2);
lcd1602_write(2,string2);
int abstandsErkennung = 1500; //Der Abstand in den innerhalb das System etwas erkennen soll in mm
int abstandsErkennung = 1500; // Der Abstand in mm, innerhalb dessen das System etwas erkennen soll
 
int startGrad = 1000; // Der Wert 500 entspricht -45
 
int endGrad = 2000; // Der Wert 2500 entspricht 135
 
int pwmSteps = 66; // 90/16 Display-Ziffern = 5,625 pro Ziffer
 
// Bereich = 1000 PWM; 1000 PWM/90 = 62,5 PWM/ = pwmSteps
 
int pwmValue = 0; // Der PWM-Wert, der an den Servo gesendet wird
 
int i = 8; // Zhler fr die Schleife, startet bei 8, damit der Servo in der Mitte ist (45)
 
int detectionCounter = 0; // Zhler, um das Display zurckzusetzen
int startGrad = 1000; //Der Wert 500 entspricht -45
int endGrad = 2000; //Der Wert 2500 entspricht 135
int pwmSteps = 66; // 90/16Display digits = 5,625 pro Digit
//Range = 1000pwm; 1000pwm/90 = 62,5pwm/ = pwmSteps
int pwmValue = 0; //Der pwm Wert der an den Servo gesendet wird
int i = 8; //Zaehler fuer die Schleife, startet bei 8 damit der Servo in der mitte ist bei 45
int detectionCounter = 0; //Dieser counter ist dafuer da, damit das Display resettet wird
startUp();
startUp(); // Initialisierungsroutine ausfhren
while (1)
while (1)
{
{
// Countup from 1000 to 2000
// Aufwrts zhlen von 1000 bis 2000
for (i = i; startGrad + pwmSteps*i <= endGrad; i++) {
for (i = i; startGrad + pwmSteps*i <= endGrad; i++) {
pwmValue = startGrad + pwmSteps * i;
pwmValue = startGrad + pwmSteps * i;
configurePWM(pwmValue); // Set PWM to current value
configurePWM(pwmValue); // Setzt PWM auf den aktuellen Wert
distance = sr04_get_value();
distance = sr04_get_value();
if(distance<=abstandsErkennung){
if(distance<=abstandsErkennung){
detectedSomething(i, distance);
detectedSomething(i, distance);
detectionCounter = 0;
detectionCounter = 0;
}
}
__delay_cycles(250000); // Delay 1 second (assuming 1 MHz clock)
__delay_cycles(250000); // Sleep 0,25 sekunden (bei 1 MHz clock)
}
}
detectionCounter++;
detectionCounter++;
// Countdown from 2000 to 1000
// Abwrts zhlen von 2000 bis 1000
for (i = i-1; startGrad + pwmSteps*i >= startGrad;i--) {
for (i = i-1; startGrad + pwmSteps*i >= startGrad;i--) {
pwmValue = startGrad + pwmSteps * i;
pwmValue = startGrad + pwmSteps * i;
configurePWM(pwmValue); // Set PWM to current value
configurePWM(pwmValue); // Setzt PWM auf den aktuellen Wert
distance = sr04_get_value();
distance = sr04_get_value();
if(distance<=abstandsErkennung){
if(distance<=abstandsErkennung){
detectedSomething(i, distance);
detectedSomething(i, distance);
detectionCounter = 0;
detectionCounter = 0;
}
}
__delay_cycles(250000); // Delay 1 second (assuming 1 MHz clock)
__delay_cycles(250000); // Sleep 0,25 sekunden (bei 1 MHz clock)
}
}
detectionCounter++;
detectionCounter++;
@@ -274,50 +236,89 @@ void main (void)
@@ -274,50 +236,89 @@ void main (void)
}
}
}
}
void configurePWM(int pwmSignal){ //zwischen 1000 und 2000 offiziell, aber auch mglich zwischen 500-2500 somit 180 grad
/**
* @brief Konfiguriert das PWM-Signal.
TB1CCR1 = pwmSignal; // CCR1 PWM duty cycle
*
TB1CTL = TBSSEL__SMCLK | MC__UP | TBCLR; // SMCLK, up mode, clear TBR
* Diese Funktion konfiguriert das PWM-Signal mit einem angegebenen Wert. Der PWM-Signalwert
 
* kann offiziell zwischen 1000 und 2000 liegen, jedoch sind auch Werte zwischen 500 und 2500
 
* mglich, was einem Bereich von 180 Grad entspricht.
 
*
 
* @param pwmSignal Der PWM-Signalwert, zwischen 500 und 2500.
 
*/
 
void configurePWM(int pwmSignal){
 
// Setzen des PWM duty cycle fr CCR1
 
TB1CCR1 = pwmSignal;
 
// Konfiguration des Timers
 
TB1CTL = TBSSEL__SMCLK | MC__UP | TBCLR;
}
}
void startUp(){ //Start Methode beim hochfahren des MSP430, eine Prozedur die ausgefuehrt wird
P6OUT ^= 0x40; // Toggle P6.6 using exclusive-OR, es leuchtet die gruene LED
/**
 
* @brief Startet die Initialisierungsprozedur beim Hochfahren des MSP430.
 
*
 
* Diese Funktion fhrt eine Prozedur aus, die beim Hochfahren des MSP430 aufgerufen wird.
 
* Sie schaltet eine grne LED ein und fhrt eine Reihe von PWM-Konfigurationen und Verzgerungen durch,
 
* bevor sie die LED wieder ausschaltet.
 
*/
 
void startUp(){
 
// Toggle P6.6 using exclusive-OR, es leuchtet die grne LED
 
P6OUT ^= 0x40;
 
// Konfiguriere PWM mit einem Wert von 1500 und warte
configurePWM(1500);
configurePWM(1500);
__delay_cycles(1000000);
__delay_cycles(1000000);
 
// Konfiguriere PWM mit einem Wert von 500 und warte
configurePWM(500);
configurePWM(500);
__delay_cycles(1000000);
__delay_cycles(1000000);
 
// Konfiguriere PWM mit einem Wert von 2500 und warte
configurePWM(2500);
configurePWM(2500);
__delay_cycles(1000000);
__delay_cycles(1000000);
 
// Konfiguriere PWM mit einem Wert von 1500 und warte
configurePWM(1500);
configurePWM(1500);
__delay_cycles(1000000);
__delay_cycles(1000000);
P6OUT ^= 0x40; // Toggle P6.6 using exclusive-OR, gruene LED wird ausgeschalten
// Toggle P6.6 using exclusive-OR, grne LED wird ausgeschaltet
 
P6OUT ^= 0x40;
}
}
void detectedSomething(int i, uint16_t pDistance ){ //Diese Methode wird ausgefuehrt, wenn der SR04 etwas erkennt.
/**
P6OUT ^= 0x40; // Toggle P6.6 using exclusive-OR, es leuchtet die gruene LED
* @brief Diese Methode wird ausgefhrt, wenn der HC-SR04-Ultraschallsensor etwas erkennt.
 
*
 
* Diese Funktion wird aufgerufen, wenn der SR04-Sensor einen Patienten erkennt. Sie schaltet eine
 
* grne LED ein, zeigt die erkannte Entfernung und die Position auf einem LCD-Display an und
 
* schaltet die LED wieder aus.
 
*
 
* @param i Die Position des erkannten Objekts.
 
* @param pDistance Die gemessene Entfernung zum erkannten Objekt in Millimetern.
 
*/
 
void detectedSomething(int pPosition, uint16_t pDistance ){
 
// Toggle P6.6 using exclusive-OR, es leuchtet die grne LED
 
P6OUT ^= 0x40;
char array[17]; // Erstellen Sie ein char-Array mit einer Lnge von 17
// Erstellung eines char-Array mit einer Lnge von 17
// Initialisieren Sie das Array mit Leerzeichen oder einem anderen Zeichen
char array[17];
 
// Initialisierung des Arrays mit Leerzeichen
int j;
int j;
for (j = 0; j < 17; j++) {
for (j = 0; j < 17; j++) {
array[j] = ' ';
array[j] = ' ';
}
}
// Setzen Sie das Zeichen 'x' an die gewnschte Position
// Einsetzen des Buchstaben 'x' an die gewnschte Position
if (i >= 0 && i < 17) { // berprfen Sie, ob die Position im gltigen Bereich liegt
if (pPosition >= 0 && pPosition < 17) { // berprfen, ob die Position im gltigen Bereich liegt
if(i == 16){
if(pPosition == 16){
array[16-i] = 'x';
array[16-pPosition] = 'x';
}else{
}else{
array[16-i-1] = 'x';
array[16-pPosition-1] = 'x';
}
}
}
}
char string17[17];
char string17[17];
 
 
// Formatierung der Entfernung als Zeichenkette und Anzeige auf dem LCD
if(pDistance == 0){
if(pDistance == 0){
pDistance = 1500;
pDistance = 1500;
}
}
sprintf(string17, "%dmm ", pDistance); //z. B. Ausgabe: 1499mm
sprintf(string17, "%dmm ", pDistance); // z. B. Ausgabe: 1499mm
lcd1602_write(1,string17);
lcd1602_write(1,string17);
lcd1602_write(2,array);
lcd1602_write(2,array);
P6OUT ^= 0x40; // Toggle P6.6 using exclusive-OR, gruene LED wird ausgeschalten
// Toggle P6.6 using exclusive-OR, grne LED wird ausgeschaltet
 
P6OUT ^= 0x40;
}
}
Loading