Homepage

  • Projekte
  • Shop
  • Forum
Erweiterte Suche
  • Schnellzugriff
    • Unbeantwortete Themen
    • Aktive Themen
    • Suche
  • FAQ
  • Anmelden
  • Registrieren
  • Foren-Übersicht
  • Suche

Ausgänge als "Taster" nutzen

Informationen, Fehlermeldungen, Verbesserungen zu Wils Version des AVR-Webservers.
Antworten
  • Druckansicht
Erweiterte Suche
4 Beiträge • Seite 1 von 1
Andy

Ausgänge als "Taster" nutzen

  • Zitieren

Beitrag von Andy » 07.12.2008, 01:42:57

Sorry für die vielleicht dumme Frage, aber als bisher absoluter "nicht-programmierer" tue ich mich halt doch "etwas" schwer mit C.
Bislang bin ich soweit ja noch einigermaßen gut zurechtgekommen, aber jetzt stoße ich doch an meine Grenzen.

Ich möchte gern die Ausgänge des Controllers jeweils nur für ca. 0,2 Sekunden einschalten - kann mir bitte jemand helfen, das hinzubekommen? Wäre echt super.

Die im Forum irgendwo schon beschriebene Variante, jeweils beim Sekundenwechsel die Ports abzuschalten, ergibt ja immer unterschiedliche Impulslängen bis zu fast einer Sekunde und bringt mir deswegen leider nicht viel - ich brauche feste Impulslängen von 0,1 - 0,3 Sekunden.

Bis jetzt habe ich es hinbekommen, PA0-PA5, PA7, PC3-PC7 und PD4-PD7 als Ausgänge zu schalten und den gewünschten Ausgang per einzelner Schaltfläche zu aktivieren.
Aber das ist ja bisher eigentlich nur mehr oder weniger einfaches Umbasteln von vorhandenem Material...


PS: Wäre es eigentlich mit viel Aufwand verbunden, den Scheduler so umzubauen, dass er auch Minutengenau schalten kann?
Nach oben

wil
Beiträge: 176
Registriert: 01.04.2008, 20:16:06

Re: Ausgänge als "Taster" nutzen

  • Zitieren

Beitrag von wil » 12.12.2008, 23:18:13

Andy hat geschrieben:PS: Wäre es eigentlich mit viel Aufwand verbunden, den Scheduler so umzubauen, dass er auch Minutengenau schalten kann?
Folgende Routine steht in timer.c:

Code: Alles auswählen

/**
 *	\ingroup time
 *  TM_AddOneSecond zählt die aktuelle Zeit weiter
 *	und entscheidet auf weiter durchzuführende Aktionen
 */
void TM_AddOneSecond(void)
{
	if (++TM_ss == 60) {
		TM_ss = 0;
		if (++TM_mm == 60) {
			TM_mm = 0;
			// add one hour
			if (++TM_hh == 24) {
				TM_hh = 0;
				TM_AddOneDay();
			}

			// Start der Sommerzeit: März, 2:00:00 ?
			if ((TM_MM==3) && (TM_DOW==0) && (TM_hh==2)) {
                if (TM_DD >= 25 ){		// letzte 7 Tage im Monat ?
                    TM_hh++; 			// 2:00 -> 3:00
                }
            }
			// Ende der Sommerzeit: Oktober, 03:00
			if ((TM_MM==10)  && (TM_DOW==0) && (TM_hh==3) && (TM_DS==0)){
                if (TM_DD >= 25){		// letzte 7 Tage im Monat ?
                    TM_hh--; 			// 3:00 -> 2:00
                    TM_DS=1;			// Marker, dass schon umgestellt ist
                }
			}
        }

		#if USE_SCHEDULER
        // Timer check every 10 minutes
        if ((TM_mm % 10) == 0){
			machineStatus.regeln = 1;
        }
		#endif
 	}
}
Du musst nur die letzte if-Abfrage mit folgendem Code ersetzen:

Code: Alles auswählen

 if (TM_ss == 0){
// wenn Sekunde auf null springt ...
Dadurch wird dann die Regelroutine in der main-loop jede Minute aufgerufen. Nur für die Codierung der Schaltzeiten musst du dir dann was einfallen lassen. Ein Byte wird dann nicht mehr ausreichen :wink:
Andy hat geschrieben:Ich möchte gern die Ausgänge des Controllers jeweils nur für ca. 0,2 Sekunden einschalten - kann mir bitte jemand helfen, das hinzubekommen? Wäre echt super.
Dafür gibt es prinzipiell 2 Möglichkeiten:
  • 0,2 Sekunden warten ( _delay_ms(200); )
  • einen Timer verwenden
Die 2. Methode ist wohl bei so langen Zeiten vorzuziehen. Die 8-bit Timer haben im aktuellen Code nix zu tun und lassen sich für einen "Output Compare Match Interrupt" verwenden. Folgender Code sollte Timer0B auf 10 ms initialisieren:

Code: Alles auswählen

	TCCR0B |= (1<<WGM02) | (1<<CS00 | 0<<CS01 | 1<<CS02); // prescaler mit 1024
	OCR0B = (F_CPU / 1024) / 100 - 1;
	TIMSK |= (1 << OCIE0B);		// enable output compare match interrupt
im Interrupt "ISR (TIMER0_COMPB_vect){ //...}" musst du dann nur noch die benötigte Anzahl 10 ms Intervalle mitzählen.

Gruß
wil
Nach oben

Andy

Re: Ausgänge als "Taster" nutzen

  • Zitieren

Beitrag von Andy » 13.12.2008, 01:39:09

Super, Danke für die sehr ausführliche Antwort :)

Den Weg über _delay_ms(200); habe ich zwischenzeitlich schon herausgefunden und mit unterschiedlichen Werten ausprobiert.
Im LAN lässt sich bei mir mit dem für 200 ms blockierten Controller ganz gut leben, der Seitenaufbau dauert halt ein bisschen länger, das stört aber nicht weiter. Z.B. 300ms sind aber eindeutig zu lang und führen zu Problemen beim Seitenaufbau.

Beim Zugang über Internet und Dyndns wird nach betätigen einer Funktion bei 200ms nur noch eine leere Seite geladen - weil ich im echten Leben aber eh keinen Zugriff vom Internet auf die Fernbedienung vom Fernseher und die Wohnungsbeleuchtung brauche, ist mir das ziemlich egal.
Für meine Zwecke sollte _delay_ms(...); jedenfalls ausreichen.

Dass die Schaltzeitpunkte in einem Byte untergebracht sind , hatte ich schon fast befürchtet...
Aber ich denke, mit den 10 Minuten-Intervallen sollte ich erstmal auch ganz gut auskommen. Wäre nur halt "nice to have", z.B. das Licht im Badezimmer während dem Urlaub nicht nur in 10 Minuten Schritten schalten zu können. Aber daran kann ich ja mal herumexperimentieren, wenn ich viel freie Zeit habe. Eigentlich müsste die Sache ja schon erledigt sein, wenn man die Abfrage des "Uhrzeitbyte" dupliziert und je ein Byte für Stunden und Minuten verwendet...
Nach oben

pascal
Beiträge: 25
Registriert: 25.09.2008, 16:32:41

Re: Ausgänge als "Taster" nutzen

  • Zitieren

Beitrag von pascal » 17.08.2009, 19:40:49

Hallo,

habe das mit dem Ausschalten nach gewisser Zeit mit dem Timer probieren wollen, als uC Anfänger habe ich das Problem, dass ich nicht richtig weiß an welche Stelle ich den Code-Schnipsel einfügen soll. Habe die drei Zeilen in die timer.c kopiert, kann dann aber nicht mehr kompilieren, bekomme immer den Fehler:
timer.c:97: error: expected identifier or '(' before 'volatile'
angezeigt. Was muss ich machen?

Wie verändere ich nun die webpage.h oder die httpd.c damit z.B. PortA Pin 0 nach 0,4 Sekunden wieder automatisch ausgeht?

Danke!
Grüße
Nach oben

Antworten
  • Druckansicht

4 Beiträge • Seite 1 von 1

Zurück zu „Software: Wils erweiterte Version“



  • Foren-Übersicht
  • Alle Zeiten sind UTC+02:00
  • Alle Cookies löschen

Powered by phpBB® Forum Software © phpBB Limited

Deutsche Übersetzung durch phpBB.de

Datenschutz | Nutzungsbedingungen

 

 

sitemap  |    |  datenschutz   |  impressum