-         

Ergebnis 1 bis 8 von 8

Thema: Programm Philipps p89c51rd2hbp

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    12.11.2004
    Beiträge
    25

    Programm Philipps p89c51rd2hbp

    Anzeige

    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

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.03.2005
    Ort
    Nürnberg
    Alter
    37
    Beiträge
    118
    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.

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    12.11.2004
    Beiträge
    25
    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

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    12.11.2004
    Beiträge
    25
    den Timer benutze ich in anderen Funktionen als Taktgeber für eine Frequenzausgabe.

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.03.2005
    Ort
    Nürnberg
    Alter
    37
    Beiträge
    118
    9600 Baud bei 12 MHz wird schlecht gehen. Die Abweichung ist da zu groß.
    Die richtigen Einstellungen zu finden ist ganz leicht. Erik Buchmann hat einen sehr schönen
    Codegenerator 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.

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    12.11.2004
    Beiträge
    25
    Hallo,

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

    danke mfg MSSauer

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    12.11.2004
    Beiträge
    25
    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

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.03.2005
    Ort
    Nürnberg
    Alter
    37
    Beiträge
    118
    Tut mir leid. Scheinbar hab ich mich letztes mal nicht verständlich ausgedrückt.
    Zitat Zitat von Sandro
    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.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •