RS485 - Mikrocontroller

Gast #4249439
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
#4249531
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.
Gast #4249541
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!
Gast #4249634
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.
Gast #4249707
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.
Gast #4250457
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
}
Gast #4250460
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;)...
Gast #4250528
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.
Gast #4250633
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren