Forum: Mikrocontroller und Digitale Elektronik PIC18F46K80 USART C18


von Ingo S. (schicki)


Lesenswert?

Hallo Zusammen,

ich frage mit dem PIC18F46K80 einen externen Thermometer über RS-485 ab. 
Das Grundgerüst läuft auch (siehe nachfolgend).

Über einen Taster stelle ich die Adresse des Thermoters ein. Ist der 
Thermoeter mit der eingestellten Adresse am Bus angeschlossen, ist alles 
prima. Ist der Thermometer nicht am Bus angeschlossen kommt auch keine 
Rückmeldung, und genau das ist das Problem.
1
       if (B1_PRESSED) 
2
      {
3
            while(Busy1USART());
4
            //printf("*B1TR\r");
5
            printf("*B");
6
            printf("%c",uint_Adresse + 0x30);
7
            printf("TR\r");
8
            
9
            //und hier muss die IF-Schleife verändert werden. Der Controller springt immer in die If-Abfrage und bleibt an der String Abfrage stehen. Über den Watchdog oder Timer kann man das bestimmt machen. Allerdings glaube ich dass man das auch einfacher machen kann. Mit PIR.RCIF habe ich auch schon getestet keine Veränderung.
10
            if (!DataRdy1USART())
11
            {
12
                //gets1USART(str_USART,12);
13
                gets1USART(str_USART,sizeof(str_USART));
14
                //*B10+23,2C inkl. Newline
15
                LCD_PRINTF(2,6, (const MEM_MODEL rom char *)"%.7s", str_USART + 4);
16
                //*B10+023.2C -> z.b. +023.2C
17
            }
18
            else
19
            {  
20
                LCD_PRINT(1,0,"Adresse: ");  
21
                LCD_PRINT(2,0,"Temp: ");
22
                LCD_PRINTF(1,9,(const MEM_MODEL rom char *)"%i",uint_Adresse);  
23
            }
24
          }

Danke und Gruß
Ingo

von Volker S. (vloki)


Lesenswert?

Wahrscheinlich ist dir irgendwie nicht klar wie lange es dauert ein 
einziges Byte zu übertragen im Verhältnis dazu, einen Befehl 
auszuführen.

Das nächste Problem wird sein, dass gets1USART eine "blocking funktion" 
ist. Das heißt, sie blockiert dein Programm so lange, bis der 
angeforderte String empfangen wurde. Wenn kein Sensor antwortet, dann 
ist dein Programm im Ar...

Du könntest solange warten, wie es maximal dauert, bis ein Sensor 
antwortet. ( Das erste Byte ) Ist dann nichts da, ist auch kein Sensor 
mit dieser Adresse dann...

Grundsätzlich wäre eine Statemachine mit Timeout wohl das Beste. Das 
wurde bedeuten, einen Sensor abzufragen und nicht direkt auf die Antwort 
zu warten. Wenn allerdings nicht innerhalb einer vorgegebenen Zeit eine 
Antwort kommt, dann ...

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.