Hallo
Ich habe ein Programmausschnitt erhalten wo mir bei meinem Projekt
helfen soll. Leider verstehe ich nicht genau was in den abschnitt
passiert. Ich weiß nur das eine RS232 Schnittstelle eingelesen wird.
Hoffe mir kann da einer helfen und sagen was da genau im Prgramm
passiert. Ich bedanke mich schin mal im voraus. : )
//Variable erstellen;
bit Takt = 0, RS232Empfang = 0, RS232Sendet = 0, WRS232 = 0;
bit TasterAlt =1;
bit TasterMerker = 1;
sbit LEDRS232Empfangen = P0^5;
void it_RS232 (void) interrupt 4 // Serieller Interrupt hat die
Nummer 4
{ // Interrupt ES (TI und RI) wird beim Stop-Bit
ausgelöst
if (RI) // Senden-Interrupt TI ausgelöst
{
RS232EmpBuffer = SBUF & 0x7f; // empfangenes Byte speichern
LEDRS232Empfangen = !LEDRS232Empfangen;
RI = 0; // Interrupt ES zurücksetzen
RS232Empfang = 1; // Merker für RS232-Empfang
// Interrupt ES zurücksetzen
}
else TI = 0; // kann nur noch Empfang-Interrupt RI sein
}
void DisplayAusgabe(void)
{
printlcd(buf1,1);
printlcd(buf2,2);
}
void RS232EmpfangAuswerten(void)
{
RS232Empfang = 0; // RS232Empfangsmerker zurücksetzen
if (WRS232)
{
RS232EmpfangsText[RS232Zaehler] = RS232EmpBuffer; //
empfangenes Zeichen in den Empfangsstring
RS232EmpfangsText[RS232Zaehler+1] = 0;
RS232Zaehler++;
if (RS232Zaehler >= 9)
{
//sprintf(buf1,"%s",RS232EmpfangsText);
Waagenwert = atof(RS232EmpfangsText);
sprintf(buf1,"%7.1lf ",Waagenwert);
DisplayAusgabe();
WRS232 = 0;
}
}
if (RS232EmpBuffer == '+')
{
WRS232 = 1;
RS232Zaehler = 0;
}
}
// Funktion wartet auf das Drücken von P0^0 und merkt sich, dass P0^0
gedrückt wurde
void irq_Timer1(void) interrupt 3 //wird alle 32ms aufgerufen
{
if ( (Taster != TasterAlt) && !Taster ) //erst beim Drücken des
Taster P0^0
{
TasterMerker = !TasterMerker;
}
TasterAlt = Taster;
}
void Initialisierung(void)
{
BDRCON = 0x1c; // SPD=0 RBCK=1, TBCK=1 BRR=1 (Seite 76) für
1200Baud
PCON = 0x10; // SMOD1=0 keinen Teiler 2 (Seite 75) für
1200Baud
REN = 1; // im SCON: Empfang erlauben (Seite 72)
SM1 = 1; // Mode 1 8-bit UART
BRL = 202; // BaudRatenSelektion 1200 Baud (X2 = 0)
(Seite73)
sprintf(buf2,"1200Baud");
// Interrupt-Einstellungen
ES = 1; // RS232 Interrupt freigeben
ET2 = 1;
TMOD = 0x11; // Timer0 und Timer1 auf 16 Bit
ET1 = 1; // Interruptfreigabe für Timer 1
EX0 = 1; // Interruptfreigabe für P3.2
IT0 = 1; // Flankentriggerung für P3.2
EA = 1; // allgemeine Interruptfreigabe
TR1 = 1; // Timer 1 wird gestartet
// *** allgemeine Initialisierung
initlcd(); // LCD-Display initialisieren
testlcd(); // LCD-Display testen und löschen
//sprintf(buf1,"Empfang ");
//DisplayAusgabe();
Ende
1 | //Variable erstellen;
|
2 | bit Takt = 0, RS232Empfang = 0, RS232Sendet = 0, WRS232 = 0; |
3 | bit TasterAlt =1; |
4 | bit TasterMerker = 1; |
5 | sbit LEDRS232Empfangen = P0^5; |
6 | |
7 | |
8 | |
9 | void it_RS232 (void) interrupt 4 // Serieller Interrupt hat die |
10 | Nummer 4 |
11 | { // Interrupt ES (TI und RI) wird beim Stop-Bit |
12 | ausgelöst |
13 | if (RI) // Senden-Interrupt TI ausgelöst |
14 | {
|
15 | RS232EmpBuffer = SBUF & 0x7f; // empfangenes Byte speichern |
16 | LEDRS232Empfangen = !LEDRS232Empfangen; |
17 | RI = 0; // Interrupt ES zurücksetzen |
18 | RS232Empfang = 1; // Merker für RS232-Empfang |
19 | // Interrupt ES zurücksetzen
|
20 | }
|
21 | else TI = 0; // kann nur noch Empfang-Interrupt RI sein |
22 | }
|
23 | void DisplayAusgabe(void) |
24 | {
|
25 | printlcd(buf1,1); |
26 | printlcd(buf2,2); |
27 | }
|
28 | void RS232EmpfangAuswerten(void) |
29 | {
|
30 | RS232Empfang = 0; // RS232Empfangsmerker zurücksetzen |
31 | if (WRS232) |
32 | {
|
33 | RS232EmpfangsText[RS232Zaehler] = RS232EmpBuffer; // |
34 | empfangenes Zeichen in den Empfangsstring |
35 | RS232EmpfangsText[RS232Zaehler+1] = 0; |
36 | RS232Zaehler++; |
37 | if (RS232Zaehler >= 9) |
38 | {
|
39 | //sprintf(buf1,"%s",RS232EmpfangsText);
|
40 | Waagenwert = atof(RS232EmpfangsText); |
41 | sprintf(buf1,"%7.1lf ",Waagenwert); |
42 | DisplayAusgabe(); |
43 | WRS232 = 0; |
44 | }
|
45 | }
|
46 | if (RS232EmpBuffer == '+') |
47 | {
|
48 | WRS232 = 1; |
49 | RS232Zaehler = 0; |
50 | }
|
51 | }
|
52 | // Funktion wartet auf das Drücken von P0^0 und merkt sich, dass P0^0
|
53 | gedrückt wurde |
54 | void irq_Timer1(void) interrupt 3 //wird alle 32ms aufgerufen |
55 | {
|
56 | if ( (Taster != TasterAlt) && !Taster ) //erst beim Drücken des |
57 | Taster P0^0 |
58 | {
|
59 | TasterMerker = !TasterMerker; |
60 | }
|
61 | TasterAlt = Taster; |
62 | }
|
63 | void Initialisierung(void) |
64 | {
|
65 | BDRCON = 0x1c; // SPD=0 RBCK=1, TBCK=1 BRR=1 (Seite 76) für |
66 | 1200Baud |
67 | PCON = 0x10; // SMOD1=0 keinen Teiler 2 (Seite 75) für |
68 | 1200Baud |
69 | REN = 1; // im SCON: Empfang erlauben (Seite 72) |
70 | SM1 = 1; // Mode 1 8-bit UART |
71 | BRL = 202; // BaudRatenSelektion 1200 Baud (X2 = 0) |
72 | (Seite73) |
73 | sprintf(buf2,"1200Baud"); |
74 | |
75 | // Interrupt-Einstellungen
|
76 | ES = 1; // RS232 Interrupt freigeben |
77 | ET2 = 1; |
78 | TMOD = 0x11; // Timer0 und Timer1 auf 16 Bit |
79 | ET1 = 1; // Interruptfreigabe für Timer 1 |
80 | EX0 = 1; // Interruptfreigabe für P3.2 |
81 | IT0 = 1; // Flankentriggerung für P3.2 |
82 | EA = 1; // allgemeine Interruptfreigabe |
83 | TR1 = 1; // Timer 1 wird gestartet |
84 | // *** allgemeine Initialisierung
|
85 | initlcd(); // LCD-Display initialisieren |
86 | testlcd(); // LCD-Display testen und löschen |
87 | //sprintf(buf1,"Empfang ");
|
88 | //DisplayAusgabe();
|
Da wären noch ein paar Hinweise gut: - Controller - Compiler - das Programm enthält keine main -> nicht lauffähig
Was genau willst Du denn wissen? Der Codeschnipsel ist doch bereits sehr gut kommentiert, und die Funktionsnamen sind auch "sprechende" deutsche Bezeichnungen... Sollte doch - selbst für einen blutigen C-Anfänger - kein allzu großes Problem sein, halbwegs zu verstehen, was da passiert.
Hi
Ich habe die main nicht rein gemacht weil ich die ja vertsehe. Bei mir
ist das problem mit dem Abschnitt. Aber ich kann mal das ganze Programm
Posten.
Hier das Vollständige Programm.
/* Technikerarbeit-Messgerät für Dampfqualität.c
*********************************************************
* Prototyp: Das Messgerät soll die Interne Dampfqualität des
Sterilisatonsraumes messen, und mit einer Berechnungsformel den Wert des
Dampfqualitäts ausgeben.
*
*********************************************************************/
#include <at89c5131.h> // Registeradressen
#include <cbs5131.h> // CBS-Platinentreiber
#include <stdio.h> // für sprintf
#include <string.h> // für strlen
#include <stdlib.h> // für atof
//P0_0 = Taster -> "Start der Messung"
//P0_1 = Ventil1 -> "Ventil Kühlwasser"
//P0_2 = Ventil2 -> "Entlüftungs Ventil"
//P0_3 = Ventil3 -> "Ventil Heißdampf"
//P0_4 = Ventil4 -> "Ventil Entleerung"
//P0_5 = Sensor1 -> "Sensor Signal Waage Nullt"
//P0_6 = Sensor2 -> "Sensor Waage nimmt Messwert"
//P0_7 = Sensor3 -> "Sensor Messwert wurde aufgenommen und Berechnung
des Messwert"
sbit Taster = P3^5; //um ändern auf P1^7 wird
in Taster umdeklariert
sbit Test = P1^7;
sbit Ventil1 = P1^6; //P0^1 wird in Ventil1 umdeklariert
sbit Ventil2 = P1^5; //P0^2 wird in Ventil2 umdeklariert
sbit Ventil3 = P1^4; //P0^3 wird in Ventil3 umdeklariert
sbit Ventil4 = P1^3; //P0^4 wird in Ventil4 umdeklariert
sbit Sensor1 = P1^2; //P0^5 wird in Sensor1 umdeklariert
sbit Sensor2 = P1^1; //P0^6 wird in Sensor2 umdeklariert
sbit Sensor3 = P1^0; //P0^7 wird in Sensor3 umdeklariert
// globale Variable
unsigned char z = 0,RS232EmpBuffer, RS232Zaehler = 0;
idata unsigned char RS232EmpfangsText[17], buf1[17], buf2[17];
double Waagenwert =0, Waagenwert1 =0, Waagenwert2=0, Gesamtgasanteil=0,
Gasanteil1=0, Gasanteil2=0, Prozentwert=0, Mittelwert =0;
double Gas = 20;
//Variable erstellen;
bit Takt = 0, RS232Empfang = 0, RS232Sendet = 0, WRS232 = 0;
bit TasterAlt =1;
bit TasterMerker = 1;
sbit LEDRS232Empfangen = P0^5;
void it_RS232 (void) interrupt 4 // Serieller Interrupt hat die
Nummer 4
{ // Interrupt ES (TI und RI) wird beim Stop-Bit
ausgelöst
if (RI) // Senden-Interrupt TI ausgelöst
{
RS232EmpBuffer = SBUF & 0x7f; // empfangenes Byte speichern
LEDRS232Empfangen = !LEDRS232Empfangen;
RI = 0; // Interrupt ES zurücksetzen
RS232Empfang = 1; // Merker für RS232-Empfang
// Interrupt ES zurücksetzen
}
else TI = 0; // kann nur noch Empfang-Interrupt RI sein
}
void DisplayAusgabe(void)
{
printlcd(buf1,1);
printlcd(buf2,2);
}
void RS232EmpfangAuswerten(void)
{
RS232Empfang = 0; // RS232Empfangsmerker zurücksetzen
if (WRS232)
{
RS232EmpfangsText[RS232Zaehler] = RS232EmpBuffer; //
empfangenes Zeichen in den Empfangsstring
RS232EmpfangsText[RS232Zaehler+1] = 0;
RS232Zaehler++;
if (RS232Zaehler >= 9)
{
//sprintf(buf1,"%s",RS232EmpfangsText); kommentiert zum
testen 20.04.2011
Waagenwert = atof(RS232EmpfangsText);
sprintf(buf1,"%7.1lf ",Waagenwert);
DisplayAusgabe();
WRS232 = 0;
}
}
if (RS232EmpBuffer == '+')
{
WRS232 = 1;
RS232Zaehler = 0;
}
}
// Funktion wartet auf das Drücken von P0^0 und merkt sich, dass P0^0
gedrückt wurde
void irq_Timer1(void) interrupt 3 //wird alle 32ms aufgerufen
{
if ( (Taster != TasterAlt) && !Taster ) //erst beim Drücken des
Taster P0^0
{
TasterMerker = !TasterMerker;
}
TasterAlt = Taster;
}
void Initialisierung(void)
{
BDRCON = 0x1c; // SPD=0 RBCK=1, TBCK=1 BRR=1 (Seite 76) für
1200Baud
PCON = 0x10; // SMOD1=0 keinen Teiler 2 (Seite 75) für
1200Baud
REN = 1; // im SCON: Empfang erlauben (Seite 72)
SM1 = 1; // Mode 1 8-bit UART
BRL = 202; // BaudRatenSelektion 1200 Baud (X2 = 0)
(Seite73)
sprintf(buf2,"1200Baud");
// Interrupt-Einstellungen
ES = 1; // RS232 Interrupt freigeben
ET2 = 1;
TMOD = 0x11; // Timer0 und Timer1 auf 16 Bit
ET1 = 1; // Interruptfreigabe für Timer 1
EX0 = 1; // Interruptfreigabe für P3.2
IT0 = 1; // Flankentriggerung für P3.2
EA = 1; // allgemeine Interruptfreigabe
TR1 = 1; // Timer 1 wird gestartet
// *** allgemeine Initialisierung
initlcd(); // LCD-Display initialisieren
testlcd(); // LCD-Display testen und löschen
//sprintf(buf1,"Empfang ");
//DisplayAusgabe();
RS232Empfang = 0; // Wichtig hier, sonst erstes Zeichen falsch
Ventil1=0; //Kühlwasser
Ventil2=0; //Entlüftung
Ventil3=0; //Heißdampf
Ventil4=0; //Entleerung
Sensor1=0; //Signal Wagge Nullt
Sensor2=0; //Signal Wagge Messwert
Sensor3=0; //Signal Messwert aufgenommen und Berechnung des
Messwert
Taster = 1;
Test = 0;
}
void main (void)
{
Initialisierung();
while (1) // Endlosschleife
{
if(TasterMerker==0)
{
z++; //zähler plus 1
TasterMerker = 1;
}
//Auswahlmenü durch Switch und Case
//Je nach der größe von r wird ein Case ausgeführt
switch (z)
{
case 1:
if(Sensor1==1) //Sensor1 wird ereicht
{
Ventil2=0; //Entlüftung schließt
Ventil3=0; //Heißdampf
printlcd (" Waage Nullen ",1); // Ausgabe an Zeile 1 des LCDs
}
else
Ventil1=1; //Kühlwasser
Ventil2=1; //Entlüftung
Ventil3=1; //Heißdampf
Ventil4=0; //Entleerung
printlcd (" CASE1 ",1); // Ausgabe an Zeile 1 des LCDs
printlcd (" ",2); // Ausgabe an Zeile 2 des LCDs
break;
case 2:
Ventil3=1;
printlcd (" CASE2 ",1); // Ausgabe an Zeile 1 des LCDs
printlcd (" ",2); // Ausgabe an Zeile 1 des LCDs
if(Sensor2==1) //Sensor2 wird erreicht
{
Ventil3=0;
RS232EmpfangAuswerten();
Waagenwert1 = Waagenwert;
printlcd ("Bitte Waage Nullen",2); // Ausgabe an Zeile 2 des
LCDs
}
break;
case 3:
Ventil3=1;
printlcd (" CASE3 ",1); // Ausgabe an Zeile 1 des LCDs
printlcd (" ",2); // Ausgabe an Zeile 1 des LCDs
if (Sensor3==1) //Sensor3 wird erreicht
{
Ventil3=0;
RS232EmpfangAuswerten();
Waagenwert2 = Waagenwert;
printlcd ("Taster betätigen",2); // Ausgabe an Zeile 2 des LCDs
}
break;
case 4:
Ventil3=0; //Heißdampf schließt
Ventil4=1; //Entleerung öffnet
Ventil2=1; //Entlüftung öffnet
Ventil1=0; //Kühlwasser schließt
//Berechnung
Gasanteil1=Gas/Waagenwert1; //Gasanteil = Gas /
Waagenwert1
Gasanteil2=Gas/Waagenwert2; //Gasanteil = Gas /
Waagenwert2
Gesamtgasanteil=Gasanteil1+Gasanteil2;
//Gesamtgasanteil=Gasanteil1+Gasanteil2
Mittelwert=Gesamtgasanteil/2;
//Mittelwert=Gesamtgasanteil/2
Prozentwert=Mittelwert*100; //Prozent = Mittelwert * 100
sprintf (buf1,"%1i Prozent",Prozentwert); // Ausgabe an Zeile 1
des LCDs
printlcd(buf1,1);
sprintf (buf2,"M-Wert=%1i",Mittelwert); // Ausgabe an
Zeile 2 des LCDs
printlcd(buf2,2);
break;
//Hauptmenue
default:
printlcd (" Systemstart ",1); // Ausgabe an Zeile 1 des LCDs
printlcd ("Taste Druecken",2); // Ausgabe an Zeile 2 des LCDs
Ventil3=0; //Heißdampf schließt
Ventil4=1; //Entleerung öffnet
Ventil2=0; //Entlüftung schließt
Ventil1=0; //Kühlwasser schließt
z=0;
break;
}
} // Ende While-Schleife
} //Ende Programm
Hi Ich würd gern wissen wie das mit der Schnittstelle abläuft. BDRCON = 0x1c; // SPD=0 RBCK=1, TBCK=1 BRR=1 1200Baud PCON = 0x10; // SMOD1=0 keinen Teiler 2 1200Baud REN = 1; // im SCON: Empfang erlauben SM1 = 1; // Mode 1 8-bit UART BRL = 202; // BaudRatenSelektion 1200 Baud Was hat das zu bedeuten. Was grob da passiert weiß ich, aber wie des genau abläuft.
Baudrate wird eingestellt, Modus 1 8bit UART, der Rest dieses Rätsels wird im Datenblatt deines Controllers aufgelöst.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.