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


von Mirko K. (hagbart)


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:
1
if (CheckDelay_sec(MAIL_Timer2)) 
2
         {    
3
             
4
            struct time current_time;                         
5
            gettime(ActualTime, &current_time);                   
6
            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); 
7
            MAIL_Timer2 = SetDelay_sec(TMP_AN_SEC);            // Messintervall- und RS232 Ausgabe Zeit 
8
             
9
             
10
            if ((KTY1 >= MAX_TMP) || (KTY2 >= MAX_TMP)) 
11
               { 
12
               mail_state = 1; 
13
                
14
               if ((CheckDelay_min2(MAIL_Timer)) && (Mail_Trigger_Enable) && ((KTY1 >= MAX_TMP) || (KTY2 >= MAX_TMP)))      //Vergleich zwischen Maximaler Raumtemp. und den Fühlern 
15
                  { 
16
                  mail_state = 0;    
17
                  } 
18
                  if (mail_state == 0)                        // versand wird mit 0 getriggert 
19
                  { 
20
                  if (vars.type_int[MAILFLAGS_ADDR] != 1) 
21
                  { 
22
                     DDRD |= (1 << 3);                        // Ausgangszuweisung für PIND 3 
23
                     printf("---++{ MailTrigger AKTIV }++---\n\r"); 
24
                     MAIL_Timer = SetDelay_min2(MAIL_SEND_MIN);       // Mailintervall (Häufigkeit der Mails bei erreichen der MAX Temperatur 
25
                     PORTD |= (1 << 3);                        // SMS-Signal zum SMS-Server senden (PIND 3 auf 1 schalten) 
26
                     cli(); 
27
                     PORTD &= ~(1 << 3);                     // PIND 3 wieder auf 0 setzen 
28
                     sendmail(packet, 0); 
29
                     sei(); 
30
                     mail_state = 1; 
31
                      
32
                  } 
33
                  }                 
34
               } 
35
                
36
         }


Mfg Mirko

von Oliver (Gast)


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

von Oliver (Gast)


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

von Oliver (Gast)


Lesenswert?

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

Oliver

von Mirko K. (hagbart)


Angehängte Dateien:

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

von Karl H. (kbuchegg)


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.


von Mirko K. (hagbart)


Angehängte Dateien:

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

von Oliver (Gast)


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?

von Oliver (Gast)


Lesenswert?

Äh, vergiß das (1<<3) != (1<<PD3)

Erst denken, dann schreiben :-)

Oliver

von Oliver (Gast)


Lesenswert?

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

Oliver

von Mirko K. (hagbart)


Angehängte Dateien:

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)

von Mirko K. (hagbart)


Angehängte Dateien:

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

von Mirko K. (hagbart)


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

von Oliver (Gast)


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

von Mirko K. (hagbart)


Angehängte Dateien:

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

von Karl H. (kbuchegg)


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

von Mirko K. (hagbart)


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

von Karl H. (kbuchegg)


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.

von Oliver (Gast)


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

von Mirko K. (hagbart)


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

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.