Forum: Mikrocontroller und Digitale Elektronik zwei Byte übertragen AT89C51CC03 (8051)


von Ingo S. (schicki)


Angehängte Dateien:

Lesenswert?

Hallo,

ich sollte zwei Byte an den AT90C51CC03 übertragen. Die Schnittstelle 
funktioniert soweit auch. Auf alle zu lesenden Parameter kann ich 
zugreifen. Leider habe ich ein Problem mit den zu schreibenden Werten.

Byte 1 = Steuerzeichen
Byte 2 = Wert für einen Port

Ich empfange einen Wert. In em Fall 0xF8. Danach folgt das nächste Byte 
dies soll den in dem Fall den PORT0 ansteuern.

Mit dem jetztigen Quellcode kann ich derzeit kein zweites Steuerzeichen 
empfangen. Im Register SUBF steht leider nur das erste Byte. Das 
Register SBUF kann ich auch nicht zurück setzen. Aus dem Datenblatt 
werde ich auch nicht so richig schlau. Bei vielen anderen MC-Typen habe 
ich ein Empfangs- und Senderegister. Gibt es da einen Trick?


Grüße
Ingo

1
//*******************************************************************
2
// Header und C-Unterprogramme einbinden
3
//*******************************************************************
4
5
#include <AT89C51CC03.h>
6
#include <stdio.h>
7
#include "Warten_MS.C"
8
#include "USART.C"
9
#include "Info.C"
10
#include "ADW_Config.C"
11
12
//*******************************************************************
13
// Definitionen
14
//*******************************************************************
15
16
#define True 1
17
#define False 0
18
19
//*******************************************************************
20
// Hauptprogramm
21
//*******************************************************************
22
23
void main (void)
24
{
25
    unsigned char unc_RS232;
26
    unsigned short int uint_ADW;  
27
    unsigned short int uint_P0;  
28
    unsigned short int uint_P2;
29
  
30
    P0 = 0x00;
31
    P2 = 0x00;
32
    Init_USART(usi_Baud);
33
    Init_ADW();
34
35
36
    while(1)                    // Endlosschleife
37
    {
38
      unc_RS232 = Get_Char();
39
      
40
      switch (unc_RS232){
41
      
42
      
43
          case 0xF8:
44
                SBUF = 0x00;  
45
                P0 = Get_Char();
46
                uint_P0 = P0;
47
                printf("%.4u", uint_P0);
48
            break;
49
            
50
            case 0xF9:  
51
                  uint_P0 = P0;
52
                  printf("%.4u", uint_P0);
53
                  break;
54
            
55
            default:   printf("NO COMMAND");
56
            break;       
57
      }
58
     
59
      printf("\r\n");
60
      Warten_MS(1); 
61
    }
62
}

von JoergL (Gast)


Lesenswert?

SBUF ist gleichzeitig Sende und Empfangsregister, je nachdem ob man 
liest oder schreibt.
SBUF wird nicht zurückgesetzt. Es wird beim nächsten Empfang einfach 
überschrieben, egal ob man es gelesen hat oder nicht.
Das RX-Bit, das nach dem Empfang gesetzt wird, muß man manuell löschen 
(aus meiner Erinnerung. Bitte nicht schlagen, wenn das Bit anderst 
heißt)

von Peter D. (peda)


Lesenswert?

Der Empfänger kann keine Gedanken lesen.
Du mußt Dir daher erstmal ein Protokoll überlegen, woran er zweifelsfrei 
erkennt, welches das 1. und welches das 2. Byte ist.
Und dieses Protokoll muß der Empfänger dann auswerten (Statemaschine).

: Bearbeitet durch User
von Ingo S. (schicki)


Lesenswert?

habs hinbekommen danke. zum einen wurde das zeite Byte falsch 
übertragen, und konnte deshalb nicht eindeutig erkant werden.

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
Noch kein Account? Hier anmelden.