Forum: Mikrocontroller und Digitale Elektronik RS485 - Mikrocontroller


von Michl (Gast)


Lesenswert?

Hallo liebes Forum,

ich bräuchte Hilfe...
über eine RS485-Schnittstelle möchte ich Daten, welche ich mit einem 
Mikrocontroller (PIC24FV16KM204) einlese (ADC) an den PC schicken.
Die Daten möchte ich vorerst nur mit Hterm empfangen und ansehen.

Mit dem Programmieren der RS485 habe ich keine Ahnung. Ich programmiere 
derzeit mit MPLABX mit C. Im Internet habe ich nach einem Code-Bsp 
gesucht, nur leider finde ich nichts passendes.

Hat jemand von euch ein einfaches möglichst kleines Code-Bsp parat? Es 
sollen nur 6 float-Werte gesendet werden...

Danke für eure Hilfe!
LG

von blablub (Gast)


Lesenswert?

Dein Suchbegriff lautet RS232 oder auch UART.

von Jürgen D. (poster)


Lesenswert?

Bleibt das beim "nur"?
Wan sollen denn die Werte geschickt werden? Selbstständig vom MC oder 
auf Anforderungstelegram vom PC her?

Sind mehrere Knoten daran beteiligt? Bußadressen wie einstellbar?

Grundsätzlich lauft das mit der 485 genau so wie mit einer RS232 
Verbindung, es muss aber zusätzlich eine Steuerung des Treiberbausteines 
berücksichtigt werden.

von Michl (Gast)


Lesenswert?

Werte sollen einfach alle 2 Sekunden dem PC übertragen werden, sobald 
der uC Versorgt wird, also selbständig vom uC.
daher möchte ich einen möglichst einfachen Code dafür.

Weiß nicht was genau unter "Knoten" gemeint ist. Es ist nur ein uC, 
welcher 6 Werte einlesen soll...

Danke für eure Hilfe!

von blablub (Gast)


Lesenswert?

Lies dich in die Materie ein. Mit "nur" und "einfach" wird das nichts 
werden. Google und Wiki sollten dich eine Weile beschäftigen.

von Wonko (Gast)


Lesenswert?

Wenn Du nur Senden willst ist RS485 nicht anders als RS232, Du legst den 
!TXE vom Treiber fest auf Masse, !RXE auf Vcc und sendest die Daten. 
Wenn Du auch empfangen willst mußt Du die Steuerleitungen vom Treiber 
vor und nach dem Senden passend setzen.

von Georg (Gast)


Lesenswert?

Wonko schrieb:
> Du legst den
> !TXE vom Treiber fest auf Masse

Dann muss aber sicher sein, dass das der RS485-Anschluss am PC nicht 
auch gelegentlich tut.

Georg

von Stephan (Gast)


Lesenswert?

Hi Michl,
sag doch mal was du alles schon hast!

- läuft dein Code für die RS232
- Was für ein RS485 Treiber hast du am MC und welchen am PC

>möglichst kleines Code-Bsp:
sollten auch die PIC-Leute haben, ich glaub beim PIC32 war auch ein 
Beispiel dabei. Bin mir aber nicht sicher.

von Michl (Gast)


Lesenswert?

Hi Stephan,

>sag doch mal was du alles schon hast!

Hier der Code den ich bisher habe:
1
unsigned char test_array[] = {0x53,0x23,0x52};
2
3
    //init UART1
4
    U1BRG = 103;  //Baudrate 9600; 16*10^6/(16*9600)-1 = 51
5
    U1MODE = 0;
6
    U1STA = 0b0000000001100000;
7
    LATBbits.LATB8 = 1;
8
U1MODEbits.UARTEN = 1;   //enable UART1 module
9
10
11
void RS485_send_bytes (void)//unsigned char data[40],char nr)
12
{
13
   unsigned char i = 0;
14
15
   char nr = 0x03;
16
17
    re_de = 1;   //set encoder to transmit
18
    U1STAbits.UTXEN = 1;    //enable transmitter
19
    while(!U1STAbits.TRMT); //wait until transmit buffer is empty
20
21
    for(i=0;i<nr;i++)
22
    {
23
        U1TXREG = 0x55;//data[i];
24
        while(!U1STAbits.TRMT); //wait until transmit buffer is empty
25
    }
26
27
    U1STAbits.UTXEN = 0;   //disable transmitter
28
    re_de = 0;   //set encoder to receive
29
}

von Michl (Gast)


Lesenswert?

Hi Stephan,

>sag doch mal was du alles schon hast!

Hier der Code den ich bisher habe:

1
unsigned char test_array[] = {0x53,0x23,0x52};
2
3
    //init UART1
4
    U1BRG = 103;  //Baudrate 9600; 16*10^6/(16*9600)-1 = 51
5
    U1MODE = 0;
6
    U1STA = 0b0000000001100000;
7
    LATBbits.LATB8 = 1;
8
U1MODEbits.UARTEN = 1;   //enable UART1 module
9
10
11
void RS485_send_bytes (void)//unsigned char data[40],char nr)
12
{
13
   unsigned char i = 0;
14
15
   char nr = 0x03;
16
17
    re_de = 1;   //set encoder to transmit
18
    U1STAbits.UTXEN = 1;    //enable transmitter
19
    while(!U1STAbits.TRMT); //wait until transmit buffer is empty
20
21
    for(i=0;i<nr;i++)
22
    {
23
        U1TXREG = 0x55;//data[i];
24
        while(!U1STAbits.TRMT); //wait until transmit buffer is empty
25
    }
26
27
    U1STAbits.UTXEN = 0;   //disable transmitter
28
    re_de = 0;   //set encoder to receive
29
}
30
31
 RS485_send_bytes();


wobei in diesem Fall für den Anfang mal einfach nur die Zahl 55 rüber 
geschickt werden soll (U1TXREG = 0x55;)...

von Thomas W. (Gast)


Lesenswert?

Michl schrieb:
> Hier der Code den ich bisher habe:

Und welche Hardware hast du?
(RS485 Semi-Duplex, Simplex, Wandler µC- und PC-seitig)

von Michl (Gast)


Lesenswert?

Leitungstransceiver: MAX481CSA

Ich benutze einen RS485->Rs232 Konverter.
Welchen Treiber mein PC dafür installiert hat, weiß ich nicht. Wie kann 
ich das nachsehen?

von Hmm (Gast)


Lesenswert?

ADC Werte sendet man als Integer oder als Text, nicht als Float.
Woran merkt der Empfaenger wenn ein neuer Wert kommt ?
Aha. HTerm, bedeutet Text wird gesendet. Also ein Wert, und denmit einem 
CR & LF versehen.

von Stephan (Gast)


Lesenswert?

Hi Michl,
sieht auf den ersten Blick gar nicht so schlecht aus.

>nur die Zahl 55 rüber geschickt werden soll (U1TXREG = 0x55;)...
Das wird nicht gehen! :-D
0x55 ist ein großes U und keine 5
also bei dir müßten 3 große U's am Terminal ankommen.

WAS siehst du auf dem Terminal? Bild?
Baudrate ist 19200 oder 9600 ???
Mal bitte deine Doku mit der Rechnung anpassen, auch für uns.
"re_de" ist ein define?

>RS485->Rs232 Konverter
Schaltet der automatisch um? (RX / TX)

Das einzigste was mir auffällt ist dein 'enable transmitter' und 
'disable transmitter' in der write Funktion, ist das nötig?
so hier mal ein Link zu einer GUTEN INIT und einer write Funktion, mit 
RS485 Leitung.
https://github.com/konradb3/gripper-firmware/blob/master/uart.c

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.