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
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.
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!
Lies dich in die Materie ein. Mit "nur" und "einfach" wird das nichts werden. Google und Wiki sollten dich eine Weile beschäftigen.
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.
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
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.
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 | }
|
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;)...
Michl schrieb: > Hier der Code den ich bisher habe: Und welche Hardware hast du? (RS485 Semi-Duplex, Simplex, Wandler µC- und PC-seitig)
Leitungstransceiver: MAX481CSA Ich benutze einen RS485->Rs232 Konverter. Welchen Treiber mein PC dafür installiert hat, weiß ich nicht. Wie kann ich das nachsehen?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.