mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Modem mit PIC steuern


Autor: Pauli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich bin für eine Diplomarbeit dabei ein Modem zur Datenübertragung 
mittels PIC zu "bedienen". leider bin ich kein großer Programmierer in C 
und das bereitet mir einige Schwierigkeiten.
Ich muss die Rückmeldungen des Modems in der Software verarbeiten. 
Leider kann ich die Textmeldungen des Modems nicht einlesen. Genügt der 
befehl  getch()? muss ich vorher die Texte alle deklarieren wenn ja 
wie??
Ich hoffe mir kann jemand einen Tipp geben

Gruß aus Wien
Pauli

Autor: Bernhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Pauli,

zuerst solltest du mal angeben:
* Controller
* Entwicklungsumgebung
* Compiler

getch() liest ein Zeichen von der Seriellen Schnittstelle ein, wenn 
diese konfiguriert ist. Wie machst du das? Schau dir dazu die App-Notes 
von Microchip an.

>> muss ich vorher die Texte alle deklarieren
Was meinst du damit?

> Ich hoffe mir kann jemand einen Tipp geben
Tut mir leid, dass ich dir nur Fragen stellen konnte, aber beim nächsten 
mal wird's besser.

Viele Grüße,
Bernhard

Autor: florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mensch das gibts doch nicht.

Autor: Pauli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Bernhard,

vielen Dank für die antwort!

der Controller ist ein PIC16F877A
MPLAP
CCS-Compiler

RS 232 ist programmiert und funkt. ohne fehler.

Der compiler meldet einige Fehler wenn ich die Rückmeldung vom Modem z.B 
NO CARRIER über getch() abrufe.

Deklarieren:
Ich frage mich, ob ich jede mögliche Rückmeldung des Modems im Compiler 
bekannt geben muss bevor ich sie im Programm verwenden kann.



Grüße aus Wien

Autor: Pauli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DOCH DAS GIBTS MENSCH!!!!!!

Autor: unbeschreiblicher Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>getch()

Vielleicht solltest du im Hanbdbuch deines Compilers mal nachgucken, wie 
"getch()" funktioniert.

Weiterhin solltest du dir angucken, was das Modem so alles von sich gibt 
(Es gibt Rückmeldungen als Text oder als Zahl zurück).

>Der compiler meldet einige Fehler wenn ich die Rückmeldung vom Modem z.B
>NO CARRIER über getch() abrufe.

Da wäre es schön, mal einen Blick in deinen Quellcode werfen zu können.

Autor: Bernhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> Der compiler meldet einige Fehler wenn ich die Rückmeldung vom Modem z.B
So böser unbeschreibliche Rahul auch klingt, ohne Quelltext und die 
Fehlermeldungen geht es wirklich nicht weiter.

Autor: Pauli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
void main()
{
  char answer=0;



  while (1)
  {
    waehlen:

    printf("+++");
    delay_ms(1000);
                    printf("ATD12345678");//Nummer wählen

       answer = getch();

                  if (answer="NO CARRIER");
    goto waehlen;

  }

Autor: Bernhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>  if (answer="NO CARRIER");
Ich gehe davon aus, dass damit ein Zeichen gemeint ist, das den Fehler 
beschreibt. Dann muss vor main() dein #define NO CARRIER C

Das goto und das waehlen können (sollten) übregens weg, dafür hast du ja 
eine Endlosschleife

Autor: Bernhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
NO CARRIER muss dann in NO_CARRIER geändert werden.

Autor: Pauli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
der fehler ist folgender:

Executing: "C:\Programme\PICC\Ccsc.exe" "RS232Test_06_11_22.c" +FM +DF 
+LN +T -A +M +Z +Y=9 +EA

>>> Warning 203 "C:\AAPIC\RS232 Modem\RS232Test_06_11_22.c" Line 40(1,1): 
Condition always TRUE

>>> Warning 201 "C:\AAPIC\RS232 Modem\RS232Test_06_11_22.c" Line 50(1,1): 
Assignment inside relational expression

*** Error 22 "C:\AAPIC\RS232 Modem\RS232Test_06_11_22.c" Line 50(24,25): 
Bad expression syntax

1 Errors,  2 Warnings.

Halting build on first failure as requested.

BUILD FAILED: Fri Jan 05 18:13:10 2007 Warnings.

Autor: Pauli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das goto und waehlen ist dann für später, das programm ist noch länger 
weil ich alle rückmeldungen des modems einbeziehen muss. und das sind 
einige.

NO CARRIER ist eine Textmeldung die über die RS232 vom Modem kommt wenns 
keine Verbindung bekommt. die schaut auch im HyperTerminal genauso aus.

Autor: unbeschreiblicher Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>NO CARRIER muss dann in NO_CARRIER geändert werden.

Guter Witz! (Kann aber stimmen...)

Der Fehler ist, dass du einen char (einzelnes Zeichen) mit einem String 
(mehr als ein Zeichen, i.d.R. mit "\0" abgeschlossen) vergleichst.
Geht nicht!

Vielleicht solltest du dir mal "Zeichenketten und Vektoren" in K&R 
angucken...

Für solche Sachen (wenn man schon solche Geschichten wie "printf" 
benutzt), sollte man auch das Gegenstück dazu kennen. Es fängt mit eine 
"s" an und hört  mit einem "f" auf.

Autor: Bernhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Fehler stammt davon, dass du in der if-Abfrage nicht den 
Vergleichsoperator ==, sondern die Zuweisung = verwendest. Die anderen 
Änderungen müssen aber trotzdem sein.

Autor: unbeschreiblicher Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Der Fehler stammt davon, dass du in der if-Abfrage nicht den
>Vergleichsoperator ==, sondern die Zuweisung = verwendest. Die anderen
>Änderungen müssen aber trotzdem sein.

Ich weiß ja nicht, aus welcher Programmierecke du kommst, aber in C kann 
man Strings nicht durch "==" vergleichen. Dafür gibt es in der 
"strings.h" extra Funktionen...

Autor: Bernhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ unbeschreiblicher Rahul (Gast)
Er vergleicht Zeichen, aber hat die Bedeutung des Zeichens im Klartext 
verwendet. Deshalb #define PIPAPO c

Autor: Pauli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> Das Programm schaut jetz so aus und funkt auch nicht
#define NO_CARRIER C

void main()
{
  char answer=0;



  while (1)
  {
    //waehlen:

    printf("+++");
    delay_ms(1000);
                    printf("ATD12345678");//Nummer wählen

       answer = getch();

       if (answer=="NO_CARRIER");
    //goto waehlen;

  }
>>wie is das mit den sprintf??
>>kann ich dafür auch die anweisung puts bzw gets verwenden?

Autor: Bernhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt geb ich's auch auf.

Autor: unbeschreiblicher Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>sprintf??

Schade, es wäre "scanf"...
print hat grundsätzlich etwas mit ausgeben zu tun.

>if (answer=="NO_CARRIER");

ist definitv ein Vergleich eines char mit einem char* == string, was C 
nicht einfach machen will. Sowas geht nicht mal in BASIC.

>Dann muss vor main() dein #define NO CARRIER C

"NO CARRIER" ist eine Reihe von char, die vom Modem an den PIC gesendet 
werden.
Der PIC muß also irgendwie mehrere Zeichen verarbeiten können.
Dazu braucht er einen String, der aus mehreren char besteht.
Zum Vergleichen zweier Strings gibt es eine Funktion, deren Namen mir 
nicht geläufig ist, da ich sowas im µC zufuß programmiere.

>>wie is das mit den sprintf??
>>kann ich dafür auch die anweisung puts bzw gets verwenden?

Besorg dir ein C-Grundlagenbuch!
"Die Programmiersprache C" von Brian Kernighan und Dennis Ritchie ist 
äusserst empfehlenswert. Die beiden haben C "erschaffen"...

Autor: Pauli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
unbeschreiblicher Rahul (Gast)

ist wirklich unbeschreiblich!!!!

Danke ich werde mir das buch besorgen!!

Autor: Pieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
moin moin,

der c-Vergleich ist das Eine, die Arbeitsweise eines Modes das Andere.

ATDxxx muß mit CR abgeschlossen werden, sonst macht das Modem gar 
nichts.
Ausserdem gibt es je nach Modem verschiedene Rückmeldungen, diese deuten 
alle auf einen Fehler hin. Nur die Rückmeldung Connect... zeigt den 
Begin einer Verbindung an. Besser ist das Modem auf numerisch zu 
schalten, dann bekommt man Zahlen(+CR) zurück.
Einfach mal per Terminal Wählversuche mit dem Modem machen und 
verschiedene Fehler simulieren.



    printf("+++");
(damit wird das Modem Offline geschaltet...und was soll dann kommen?
Sinnig wäre ein ATH(cr) zum Auflegen, dann aber auch auf OK(cr) warten.
Wenn da nicht vorher und nachher ca 1,5sek gewartet wird passiert gar 
nichts.)

    delay_ms(1000);
(zu kurz)

                    printf("ATD12345678");//Nummer wählen

(abschließendes CR fehlt, wie soll das Modem wissen, wann die Wahlfolge 
zu ende ist?)




Pieter

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.