Ausgäng in einer WHILE Schleife schalten.

OP #496254
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 #496279
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
Gast #496284
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
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:
#496465
> 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.

Gast #496512
"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
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:
OP #496540
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
Angehängte Dateien:
Gast #496615
???

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
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
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
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
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
OP #496731
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

Eine eigene Frage? Dieser Thread ist über 19 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.