Forum: Mikrocontroller und Digitale Elektronik Modem mit PIC steuern


von Pauli (Gast)


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

von Bernhard (Gast)


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

von florian (Gast)


Lesenswert?

Mensch das gibts doch nicht.

von Pauli (Gast)


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

von Pauli (Gast)


Lesenswert?

DOCH DAS GIBTS MENSCH!!!!!!

von unbeschreiblicher Rahul (Gast)


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.

von Bernhard (Gast)


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.

von Pauli (Gast)


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;

  }

von Bernhard (Gast)


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

von Bernhard (Gast)


Lesenswert?

NO CARRIER muss dann in NO_CARRIER geändert werden.

von Pauli (Gast)


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.

von Pauli (Gast)


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.

von unbeschreiblicher Rahul (Gast)


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.

von Bernhard (Gast)


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.

von unbeschreiblicher Rahul (Gast)


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...

von Bernhard (Gast)


Lesenswert?

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

von Pauli (Gast)


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?

von Bernhard (Gast)


Lesenswert?

Jetzt geb ich's auch auf.

von unbeschreiblicher Rahul (Gast)


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"...

von Pauli (Gast)


Lesenswert?

unbeschreiblicher Rahul (Gast)

ist wirklich unbeschreiblich!!!!

Danke ich werde mir das buch besorgen!!

von Pieter (Gast)


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

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.