mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PIC18F46K80 USART C18


Autor: Ingo Schick (schicki)
Datum:

Bewertung
0 lesenswert
nicht 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.
       if (B1_PRESSED) 
      {
            while(Busy1USART());
            //printf("*B1TR\r");
            printf("*B");
            printf("%c",uint_Adresse + 0x30);
            printf("TR\r");
            
            //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.
            if (!DataRdy1USART())
            {
                //gets1USART(str_USART,12);
                gets1USART(str_USART,sizeof(str_USART));
                //*B10+23,2C inkl. Newline
                LCD_PRINTF(2,6, (const MEM_MODEL rom char *)"%.7s", str_USART + 4);
                //*B10+023.2C -> z.b. +023.2C
            }
            else
            {  
                LCD_PRINT(1,0,"Adresse: ");  
                LCD_PRINT(2,0,"Temp: ");
                LCD_PRINTF(1,9,(const MEM_MODEL rom char *)"%i",uint_Adresse);  
            }
          } 

Danke und Gruß
Ingo

Autor: Volker SK (vloki)
Datum:

Bewertung
0 lesenswert
nicht 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 ...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.