PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Programm Philipps p89c51rd2hbp



MSSauer
03.06.2005, 14:51
Hallo,

ich habe ein Problem mit der Funktionalität des µC. Ich weiß dass er schon etwas veraltet ist aber für meine Zwecke genügt er. Meine Frage ist die:

Ich möchte über die serielle Schnittstelle am µC das empfangene serielle Signal aus dem Hyperterminal einlesen und genau diese empfangene Zahle an dem P2 ausgeben. Aber irgendwie funktioniert mein Programm nicht.

Hier mein Code:

#include <reg51.h>
#include <stdio.h>



void hupe();
void alarm();
void note(unsigned char Freq, unsigned char Dauer); //Prototyp
void pause2(void); //Prototyp
void pause(int Dauer);





sbit ozi=P0^0;

void main()
{
char COMein;


SCON=0x50;
PCON= PCON | 0x80;

TMOD=0x21;
TL1=11;
TH1=11;
TR1=1;
TI=1;



while (1)
{


scanf("%s",&COMein);

P2=COMein;


if (COMein==9)
{

hupe();

TR1=0;

TL1=0xD9; //sonst 152
TH1=0xFF;

TR1=1;

}




if (COMein==10)
{

alarm();

TR1=0;

TL1=0xD9; //sonst 152
TH1=0xFF;

TR1=1;

}


}

}

Was ist hier falsch oder wie kann ich es machen, dass ich die oben beschriebene Funktion bekomme?

Wäre sehr nett, wenn mir jemand helfen könnte, ist nämlich für ein Projekt für die Schule.

danke mfg MSSauer

Sandro
03.06.2005, 15:37
Eine wichtige Info wäre die Tacktfrequenz.

Leider kann ich nicht besonders gut C.
Wenn ich das richig verstehe benutzt du den Timer1 als Baudratengenerator.
Bist du sicher das der Reloadwert richtig ist? Kommt mir recht klein vor.

Und in deinen Funktionen benutzt du den gleichen Timer. Wozu eigentlich?
Es sieht so aus als möchtest du ihn dort als 16-bit Timer benutzen.
Er wird aber nirgends umgestellt.
Und sollte eine dieser Funktionen aufgerufen werden überschreibst du dir den Reloadwert und die Baudrate stimmt nicht mehr.

MSSauer
03.06.2005, 15:43
Die Taktfrequenz ist 12 MHz und den reload wert habe ich für 9600 Boud ausgerechnet weiß aber net obs stimmt. Ist das Programm in Ordnung? Kann das so funktionieren?

danke für deine Antwort mfg MSSauer

MSSauer
03.06.2005, 15:47
den Timer benutze ich in anderen Funktionen als Taktgeber für eine Frequenzausgabe.

Sandro
03.06.2005, 16:40
9600 Baud bei 12 MHz wird schlecht gehen. Die Abweichung ist da zu groß.
Die richtigen Einstellungen zu finden ist ganz leicht. Erik Buchmann (http://wwwiti.cs.uni-magdeburg.de/~buchmann/privat/index.htm) hat einen sehr schönen
Codegenerator (http://wwwiti.cs.uni-magdeburg.de/~buchmann/privat/generator.htm) geschrieben. Damit kann man auch sehr schön die richtigen Reloadwerte berechnen.

Wenn du noch einen Tacktgeber brauchst dann nimm lieber den
Timer0. Dieser ist bestimmt noch nicht belegt und du vermeidest konflikte mit dem UART.

Ob dein Code so funktioniert kann ich leider nicht sagen. Probier es doch einfach mal mit den richtigen Einstellungen aus.

MSSauer
06.06.2005, 13:58
Hallo,

vielen Dank für deine Antwort, die Seite ist wirklich sehr gut. Ich probiere sie mal aus.

danke mfg MSSauer

MSSauer
06.06.2005, 14:47
Ich habe jetzt mein Programm abgeändert, aber es funktioniert immer noch nicht. Weiß jemand den Fehler und wie ich ihn beheben kann?

#include <reg51.h>
#include <stdio.h>

void main()
{
char COMein;

SCON=0x50;
PCON= PCON | 0x80;

TMOD=0x12;
TL0=249;
TH0=249;
TR0=1;
TI=1;

while (1)
{

if (TF0==1)
{
scanf("%s",&COMein);

printf("%s",COMein);

TF0=0;
}

}

}

Wäre sehr nett wenn mir jemand weiterhelfen könnte.

danke mfg MSSauer

Sandro
06.06.2005, 15:01
Tut mir leid. Scheinbar hab ich mich letztes mal nicht verständlich ausgedrückt.

Wenn du noch einen Tacktgeber brauchst dann nimm lieber den
Timer0.

Damit meinte ich du sollst den Timer0 für deine Frequenzerzeugung benutzen. Nicht für die Baudratenerzeugung. Das geht nämlich nur mit Timer1 oder 2.