mikrocontroller.net

Forum: Compiler & IDEs Ausgäng in einer WHILE Schleife schalten.


Autor: Mirko Kleber (hagbart)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Zusammen,
nachdem der WEBServer als Temperaturüberwachung und das SMS Modul von 
Ulrich Radig ohne Probleme läuft.

Wollte ich nun die SMS Funktion in den WEBServer einbinden(Der Server 
soll einfach nur denn PIND.3 kurz setzen und löschen, dies löst dann am 
SMS Modul eine SMS aus).
Nur leider gelingt es mir nicht, in der main.c den Ausgang PIND.3 
innerhalb der while Schleife zusetzen. Setze ich hingegen den Ausgang 
vor die while Schleife funktioniert es komischer weise super. Woran kann 
das liegen?

Hier noch mein Code für die Mail und SMS Anweisung.

Code:
if (CheckDelay_sec(MAIL_Timer2)) 
         {    
             
            struct time current_time;                         
            gettime(ActualTime, &current_time);                   
            printf("Serverzeit: %02d:%02d:%02d -- Klima(KTY1):%d\xF8\C -- Raum(KTY2):%d\xF8\C\n\r", current_time.hour, current_time.minute, current_time.second, KTY1, KTY2); 
            MAIL_Timer2 = SetDelay_sec(TMP_AN_SEC);            // Messintervall- und RS232 Ausgabe Zeit 
             
             
            if ((KTY1 >= MAX_TMP) || (KTY2 >= MAX_TMP)) 
               { 
               mail_state = 1; 
                
               if ((CheckDelay_min2(MAIL_Timer)) && (Mail_Trigger_Enable) && ((KTY1 >= MAX_TMP) || (KTY2 >= MAX_TMP)))      //Vergleich zwischen Maximaler Raumtemp. und den Fühlern 
                  { 
                  mail_state = 0;    
                  } 
                  if (mail_state == 0)                        // versand wird mit 0 getriggert 
                  { 
                  if (vars.type_int[MAILFLAGS_ADDR] != 1) 
                  { 
                     DDRD |= (1 << 3);                        // Ausgangszuweisung für PIND 3 
                     printf("---++{ MailTrigger AKTIV }++---\n\r"); 
                     MAIL_Timer = SetDelay_min2(MAIL_SEND_MIN);       // Mailintervall (Häufigkeit der Mails bei erreichen der MAX Temperatur 
                     PORTD |= (1 << 3);                        // SMS-Signal zum SMS-Server senden (PIND 3 auf 1 schalten) 
                     cli(); 
                     PORTD &= ~(1 << 3);                     // PIND 3 wieder auf 0 setzen 
                     sendmail(packet, 0); 
                     sei(); 
                     mail_state = 1; 
                      
                  } 
                  }                 
               } 
                
         } 


Mfg Mirko

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Den Code kann doch so keiner lesen. Häng denn mal als Anhang dran.

Ausserdem finde ich kein einziges "while" darin. Was ist jetzt also 
genau die Frage?

Oliver

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachtrag: Woher weisst du denn, ob

DDRD |= (1 << 3);
.
.
.
PORTD |= (1 << 3);
cli();
PORTD &= ~(1 << 3);

nicht funktioniert? (Ich sehe keinen Grund, warum das nicht 
funktionieren sollte). Dein schnelles Speicher-Oszi sollte das 
problemlos anzeigen können.

Oliver

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachtrag 2: Jetzt kann ich es doch lesen. Aber ein while ist immer noch 
nicht drin...

Oliver

Autor: Mirko Kleber (hagbart)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Oliver,

also ich habe eine LED am ende hängen und wenn ich das richtig Verstehe 
und is ja auch Logisch is der AVR schneller als meine LED (Auge). Und 
der Ausgang wird gesetz und wieder rückgesetzt. Also heißt das für mich 
das ich eine delayzeit brauche.
Aber das komische an der Sache is, wenn ich das rücksetzen weg lass, 
dann müsste ja mein Ausgang gesetz, aber nicht zurückgesetzt werden,dies 
tut er nicht.

Und wie lang muss eigentlich eine 1 Signal am AVR stehen das es als 
soches erkannt wird?

Ich habe noch die orginal Main.c angehängt.

Mfg Mirko

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Aber das komische an der Sache is, wenn ich das rücksetzen weg
> lass, dann müsste ja mein Ausgang gesetz, aber nicht
> zurückgesetzt werden, dies tut er nicht.

Wie rum ist die LED eingebaut?
LED werden oft so eingebaut, dass am Port eine
logische 0 ausgegeben werden muss, damit die LED leuchtet.


Autor: Mirko Kleber (hagbart)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
hier mal mein Schaltplan.

Also ich habe es so schaltet das ich eine Logisch 1 brauche um den 
Versand einzuleiten. Und 5V auf eingang funktioniert auch super.

mfg Mirko

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"wenn ich das rücksetzen weg lass,
dann müsste ja mein Ausgang gesetz, aber nicht zurückgesetzt werden,.."

Jepp, das würd ich auch erwarten.

Nachfrage: An welchem PIN hängt denn deine LED?

(1<<3) != (1<<PD3)

Oliver
P.S. Schonmmal im Simulator durchgesteppt?

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Äh, vergiß das (1<<3) != (1<<PD3)

Erst denken, dann schreiben :-)

Oliver

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wird in der Interrupt-Routine Portd oder PD3 auf Eingang geschaltet?
Anscheinend hängt ja die Netzwerkkarte auch da dran.

Oliver

Autor: Mirko Kleber (hagbart)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ja aber (1<<3) funktioniert in meinem SMS Modul richtig super, deshalb 
habe ich das auch für den Webserver übernommen. Also Beweis habe ich mal 
meine Main.c des SMS-Servers mit beigelegt.
Oder liegt es an der Stelle mit den #define ?
Das ich das gleiche beim Webserver program machen muss und weshalb geht 
der Spass aber vor der while schleife aber nicht innerhalb?


Mfg Mirko (Der Tibitanische Wandermönch, Fragen über Fragen)

Autor: Mirko Kleber (hagbart)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier mal ein Bild meines Kompletten ausbaus, um sich die gesamte 
Geschichte mal richtig vorzustellen.

Ich sende bei überschreiten einer Temp eine 1 über PIND3 vom Webserver 
zum Optokoppler meines SMS-Servers. Und von dort aus Versende ich die 
SMS.

mfg Mirko

Autor: Mirko Kleber (hagbart)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen und Danke für die Hilfe,

habe es hin bekommen und zwar war der fehler in der klammer mit
(1<<PD3) für setzen und (0<<PD3) für rücksetzen.

Funktioniert wie geschmiert und hab vielen Dank Mirko

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
???

Also entweder hst du hier anderen Code gepostet, als bei dir tatsächlich 
lief (ganz böser Fehler :-), oder da stimmt sonst was nicht.

PORTD |= (1 << 3);
PORTD &= ~(1 << 3);

ist auf jeden Fall richtig. (0<<3) findet ich in deinem Code gar nicht, 
wohl aber (0 << 7) ...

Was war es denn wirklich?

Oliver

Autor: Mirko Kleber (hagbart)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Also hier is mein fertiger Code der jetzt schon ohne Probleme 4 EMail 
und 4 SMS verschickt hat. läuft super.

Wobei ich ja immer noch am grübeln bin woran es lag.
Denn nur an PD3 kann ich mir nicht vorstellen den auf dem SMS-Server 
habe ich es auch mit 3 geschrieben und es funtz. Naja Funktion is da, 
und ich hab wieder etwas gelernt.

Prima... Und noch mal vielen Dank für die schnelle Hilfe. Mirko

Anbei noch meine Fertige main.c

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das hier

  PORTD &= (0 << PD3);

macht aber ganz was anderes als du willst.

Merke: Eine 0 kannst du so oft nach links schieben
wie du willst, es bleibt immer noch eine 0.

Da steht also in Wirklichkeit:

   PORTD &= 0;

und das schaltet am Port D alle Bits auf 0.

Das hättest du auch einfacher haben können

   PORTD = 0;

Da ist zwar auch PD3 dabei, keine Frage, aber auch andere.
Im Moment wird dich das wahrscheinlich nicht kratzen.
Nichts desto trotz ist es eine Zeitbombe die nur darauf
wartet, ....

Autor: Mirko Kleber (hagbart)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für den Tipp
aber wie bekomme ich das jetzt richtig hin. Bin total verwirrt.
Denn ich muss noch ca 5 Meldungen abarbeiten. Denn unsere Kompressoren 
sollen in nächster Zeit auch noch an das SMS System.

Aber die werden direkt an den SMS-Server geklemmt.

Gruß Mirko

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> aber wie bekomme ich das jetzt richtig hin.

Dein Problem muss was anderes sein.

   PORTD &= ~( 1 << PD3 );

ist schon richtig: Es setzt den Pin 3 am Port D auf 0.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sach ich doch.

Wenn (PORTD &= (0 << PD3); den Pin auf Null setzt, PORTD &= ~(1 << 3); 
aber nicht, dann ist was faul im Staate Dänemark. Und zwar ganz 
gewaltig.

Entweder hängt die LED tatsächlich am falschen Pin (ich kann dein 
.sch-File mit dem Schaltplan hier nicht öffnen), oder sonstwas, aber das 
Problem solltest du lösen. Es holt dich mit Sicherheit wieder ein. 
Abgesehen davon, daß da ja immer noch diverse (0<<7) u.ä. auf dem Port 
rumspielen, und da anscheinend noch mehr Harware dranhängt. Auch das 
solltest du klären.

Oliver

Autor: Mirko Kleber (hagbart)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Okey ich checke das Prog Morgen in der Frima noch einmal auf Herz und 
Nieren. Und noch einmal reisigen Dank für eure Hilfe.
Hoffe auch das ich diese Woche die Doku fertig bekomme und dann posten 
kann. bis dahin viel Spaß.

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.