Ausgäng in einer WHILE Schleife schalten.

OP #496254
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
Gast #496284
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
OP #496460
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
Angehängte Dateien:
Gast #496512
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?
OP #496532
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)
Angehängte Dateien:
Gast #496615
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
OP #496638
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
Angehängte Dateien:
#496664
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, ....
OP #496674
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
Gast #496681
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren