Forum: Compiler & IDEs 24St. Schaltintervall


von Mirko K. (hagbart)


Lesenswert?

Hallo zusammen,

ich benötige einen Code, womit man aller 24Stunden einen Ausgang für 
sagen wir 2min unterbricht und dann wieder einschaltet, mit einem 
ATmega32.

Leider stecke ich noch nicht so tief in GCC drin, als das ich einen 
Timer selbst programmieren kann.

Danke für eure Hilfe Mirko

von Rahul, der Trollige (Gast)


Lesenswert?

>Leider stecke ich noch nicht so tief in GCC drin, als das ich einen
>Timer selbst programmieren kann.

Dann solltest du dein Wissen dahingehend vertiefen.
Dazu gibt es u.a. Datenblätter zu den Controllern und Tutorien hier auf 
der Seite.

von johnny.m (Gast)


Lesenswert?

> Leider stecke ich noch nicht so tief in GCC drin, als das ich einen
> Timer selbst programmieren kann.
Das hat mit dem GCC nix zu tun. Und wenn Du nicht weißt, wie man einen 
Timer programmiert, dann lies Dir im AVR-GCC-Tutorial die entsprechenden 
Abschnitte durch, eventuell unter Zuhilfenahme des Datenblattes.

Um Zeitintervalle im Stundenbereich zu erhalten, lässt Du 
sinnvollerweise einen Timer z.B. Sekunden zählen und baust darauf mit 
Zählschleifen eine Uhr auf (je einen Software-Zähler für Sekunden, 
Minuten und Stunden).

Wenn es ein batteriebetriebenes Gerät sein soll, dann ist es sinnvoll, 
den Timer 2 asynchron (mit Uhrenquarz) laufen zu lassen und den µC 
zwischen den Timerüberläufen schlafen zu schicken (Idle-Mode).

von Christoph Kessler (db1uq) (Gast)


Lesenswert?

Vielleicht wäre es einfacher, im nächsten Baumarkt eine Zeitschaltuhr zu 
kaufen.

von Rahul, der Trollige (Gast)


Lesenswert?

>Vielleicht wäre es einfacher, im nächsten Baumarkt eine Zeitschaltuhr zu
>kaufen.

Zumindest für "uns"...
Ich habe zuletzt ca. 4 Euro für eine digitale Zeitschaltuhr bezahlt.

von Mirko K. (hagbart)


Lesenswert?

Dankeschön für die zahlreichen Sinnvollen Antworten.

Also wenn ich das richtig verstanden habe geht es nich ganz so einfach. 
das ich aller 24Stunden denn Eingang ausschalte und wieder Ein.
mmmh, gibt es vielleicht eine einfacher Lösung mit Hilfe einer i2c 
Realtimeclock? Und eine Schaltuhr zukaufen, is ja ziemlich Sinnfrei in 
meiner Anwendung. Denn wenn ich schon einen Controller habe der nix tut 
ausser auf ein Ein Signal zu warten. Dann ist ja wohl das nahe liegenste 
diesen auch als Zeitrelais zu verwenden.

Aber danke für die Hilfe. Mirko

von Mirko K. (hagbart)


Lesenswert?

Um mein Problem etwas deutlicher zumachen, hier mein sourcecode.

#include <main.h>

//###################################################################### 
######

#define GE_LED     3      // Gelbe LED für Betrieb
#define RT_LED    4      // rote LED für SMS Versandfuntkion aktiviert
#define S_AKTIV    1      // Schalter zum aktivieren der SMS funktion
#define T_TEST    2      // Taster zum testen der SMS Funktion (auf der 
Platine)
#define O_SERVER  0      // Optokoppler, Ausgang (Signal von Webserver 
für Alarm)
#define REL_LADE  5      // Relais für Akkulade unterbrechnung
#define PORT_LED   PORTA
#define DDR_LED    DDRA


//###################################################################### 
######

//Hauptprogramm

int main (void)
{
DDR_LED = (1 << GE_LED) | (1 << RT_LED) | (1 << REL_LADE);            // 
Ausgäng def.
PORT_LED = (1 << S_AKTIV) | (1 << T_TEST) | (1 << O_SERVER);
//###################################################################### 
######


while (1)
{
  if (PINA & (1<< S_AKTIV))
    {
   Handy_Init();
   PORT_LED |= (1 << RT_LED); // rote LED ein

    if ((PINA & (1 << T_TEST)) || (PINA & (1 << O_SERVER)))
      {
      PORT_LED |= (1 << GE_LED); // gelbe LED ein
      Send_SMS("491712789579","So einfach geht das!");
      PORT_LED &= ~(1 << GE_LED); // gelbe LED aus
      }

    }
    else  PORT_LED &= ~(1 << RT_LED); // rote LED aus

}
return (1);
}

Gruß Mirko

von Rahul, der Trollige (Gast)


Lesenswert?

>Also wenn ich das richtig verstanden habe geht es nich ganz so einfach.

Falsch verstanden!
Wenn man sich etwas mit der Sache beschäftigt, ist eine Uhr absoluter 
Pippifax. Genügend Bespiele gibt es in der Codesammlung.

von Matthias (Gast)


Lesenswert?

"...Also wenn ich das richtig verstanden habe geht es nich ganz so 
einfach...."

Doch geht es schon. Einige Hinweise hast du ja erhalten..
Allerdings fallen Antworten immer so aus wie die Fragen.
Wenn du also anfängst mit:
Ich brauche ein Programm, dass.... (am besten fertig programmiert von 
jemand)
und:
Ich habe keine Ahnung davon...

Das ist kein Forum, um Programme von anderen schreiben zu lassen..
Hier soll Hilfe geleistet werden, dass setzt aber eigene Ideen 
Anregungen etc voraus.. Also nimm das Datenblatt deines Atmels und lies 
nach wie es gehen könnte.. Dann überlege dir, wie du das umsetzt und 
frage nach hinweisen/kritiken zu/an deiner Idee der Umsetzung..
So sparst du uns Tipperei und dir dumme Sprüche..
Obendrein wird dir dann ordentlich geholfen.


Das soll nicht überheblich klingen, aber jeder hier hat mal keine Ahnung 
davon gehabt. Aber mit "kann mir mal jemand das und das bauen" wird sich 
daran nichts ändern...

Gruß

von Karl H. (kbuchegg)


Lesenswert?

> Also wenn ich das richtig verstanden habe geht es nich ganz
> so einfach.

Ganz im Gegenteil. Das geht sogar ziemlich einfach.
Asbchnitt 'Timer' in allen verfügbaren Tutorials
studieren

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial
http://www.mikrocontroller.net/articles/AVR-Tutorial

(Das Assembler Tutorial hab ich angefügt, da du dort
grundlegende Informationen über Timer erhältst).

Da du eine Langzeituhr bauen möchtest, solltest du
nach dem Studium der Timer-Tutorials auch noch
Folgendes studieren:

http://www.mikrocontroller.net/articles/AVR_-_Die_genaue_Sekunde_/_RTC


von Peter D. (peda)


Lesenswert?

Mirko Kleber wrote:

> ich benötige einen Code, womit man aller 24Stunden einen Ausgang für
> sagen wir 2min unterbricht und dann wieder einschaltet, mit einem
> ATmega32.

Tja, ATmega32 ist da total oversized.

ATtiny13 ist da viel besser geeignet.

Code könnt ich Dir geben, aber den wirst Du dann nicht verstehen und mir 
Löcher in den Bauch fragen.

Im Prinzip nimm ne Zeitbasis und zähle 2 Variablen runter (24h und 2min) 
und wennse Null sind, mach die Aktion.

Man könnts aber auch mit meinem Scheduler machen.


Peter

von Mirko K. (hagbart)


Lesenswert?

Hallo Zusammen,

habe mich etwas mit meinem Timerproblem auseinandergesetzt. Und bin um 
einiges Wissen reicher und einpaar Stunden Schlaf ärmer.

Aber nun mit Hilfe es Boards einige Beispiele zusammen getragen und auf 
mein Program angepasst, leider funktioniert es nicht und selbst der SMS 
Versand läuft nicht mehr. Warum.

Kann mir jemand sagen was wo der Fehler liegt.


/*###################################################################### 
######
 Copyright:      Radig Ulrich  mailto: mail@ulrichradig.de
 Author:         Radig Ulrich
 Remarks:
 known Problems: none
 Version:        28.05.2004
 Description:
######################################################################## 
####*/

#include <main.h>
#include <avr/interrupt.h>
//#include <avr/delay.h>


//###################################################################### 
######

#define GE_LED     3      // gelbe LED für Versandbetrieb
#define RT_LED    4      // rote LED für SMS Versandfuntkion aktiviert
#define S_AKTIV    1      // Schalter zum aktivieren der SMS funktion
#define T_TEST    2      // Taster zum testen der SMS Funktion (auf der 
Platine)
#define O_SERVER  0      // Optokoppler, Ausgang (Signal von Webserver 
für Temperaturüberschreitung)
#define REL_LADE  5      // Laderelais für Ladespannung Unterbrechnung
#define PORT_LED   PORTA
#define DDR_LED    DDRA

#define F_CPU     16000000

//###################################################################### 
######
volatile uint8_t MERKER1;
volatile uint8_t sec;
volatile uint8_t min;
volatile uint8_t hr;

void init(void)

{
  //DDRD=0x00;

  TCCR1B |= (1 << CS12) ; TIMSK |= (1 << OCIE1A);
  TCCR0 |= (1 << CS00) | (1 << CS02) ; TIMSK |= (1 << TOIE0);

  OCR1A=15625;

  DDR_LED = (1 << GE_LED) | (1 << RT_LED) | (1 << REL_LADE); 
// Ausgäng def.
  PORT_LED = (1 << S_AKTIV) | (1 << T_TEST) | (1 << O_SERVER); 
// Eingänge def.


}

/*ISR (TIMER0_OVF_vect)
{

if(debounce(&PIND, PD2)){

  min++;

  MERKER1 = 1;

  }
}
*/
ISR (TIMER1_COMPA_vect)
{
  TCNT1 = 0;                   //Compare Register löschen

  sec++;

  if( sec > 59 ) {
    sec = 0;
  min++;
  }

  if( min > 59 ) {
    min = 0;
    hr++;
  }

  if( hr > 23 ) {
    hr = 0;
  }

  MERKER1 = 1;
}




//Hauptprogramm
int main (void)
{
cli();
Handy_Init();
sei();
//char buffer[16];
init();



//###################################################################### 
######

  //Hauptprogramm läuft ständig in einer schleife und macht nichts
while (1)
{


  if (PINA & (1<< S_AKTIV))
    {
    PORT_LED |= (1 << RT_LED); // rote LED ein

    if ((PINA & (1 << T_TEST)) || (PINA & (1 << O_SERVER)))
      {
      PORT_LED |= (1 << GE_LED); // gelbe LED ein
      Send_SMS("491712789579","So einfach geht das!");
      PORT_LED &= ~(1 << GE_LED); // gelbe LED aus
      }

    }
    else  PORT_LED &= ~(1 << RT_LED); // rote LED aus
        //PORT_LED &= ~(1 << REL_LADE);

    if (MERKER1 = 1)
    {
      if (sec > 20)
      {
      PORT_LED |= (1 << REL_LADE);
        MERKER1 = 0;
      }
    } else PORT_LED &= ~(1 << REL_LADE);
        MERKER1 = 0;

}
return (1);
}


Vielen Dank für die Hilfe

von johnny.m (Gast)


Lesenswert?

> TIMSK |= (1 << TOIE0);
Wenn Du den Timer0-Overflow-Interrupt freigibst, dann darfst Du auch die 
dazugehörige Interrupt-Subroutine nicht auskommentieren! Das gibt bei 
jedem Overflow einen Reset.

> Handy_Init();
Diese Funktion steht da auch nirgends. Das müsste mindestens eine 
Compiler-Warnung in der Art "implicit declaration of Function" geben. 
Compiler-Warnungen sind dazu da, um gelesen zu werden! Oder ist das 
obige Programm etwa unvollständig?

von Karl H. (kbuchegg)


Lesenswert?

und dann noch:

Das hier

    if (MERKER1 = 1)

ist eine Zuweisung.
Du wolltest wahrscheinlich einen Vergleich

   if (MERKER == 1)

von Karl H. (kbuchegg)


Lesenswert?

Für den Abschnitt

    if (MERKER1 = 1)
    {
      if (sec > 20)
      {
      PORT_LED |= (1 << REL_LADE);
        MERKER1 = 0;
      }
    } else PORT_LED &= ~(1 << REL_LADE);
        MERKER1 = 0;


empfehle ich dir mal die Einrückungen richtig
zu stellen (achte auf jedes Zeichen !) und dich
dann zu fragen wann MERKER auf 0 gesetzt wird.

von Rahul, der Trollige (Gast)


Lesenswert?

>(MERKER1 = 1)

Und lerne den Unterschied zwischen Zuweisung und Vergleich kennen...

von Mirko K. (hagbart)


Lesenswert?

Danke für die Tipps, muss halt noch etwas üben.

Habe meine Hauptschleife soweit doch leider geht nix, erst wenn ich eine 
SMS Versende schaltet das Relais ein und nach einer Zeit von ca 2 
minuten.

Hier mal meine Hauptschleife mit dem Rechtigen Vergleich :-)

//Hauptprogramm
int main (void)
{
Handy_Init();
sei();
init();



//###################################################################### 
######

  //Hauptprogramm läuft ständig in einer schleife und macht nichts
while (1)
{


  if (PINA & (1<< S_AKTIV))
    {
    PORT_LED |= (1 << RT_LED); // rote LED ein

    if ((PINA & (1 << T_TEST)) || (PINA & (1 << O_SERVER)))
      {
      PORT_LED |= (1 << GE_LED); // gelbe LED ein
      Send_SMS("491712789579","So einfach geht das!");
      PORT_LED &= ~(1 << GE_LED); // gelbe LED aus
      }

    }
    else  PORT_LED &= ~(1 << RT_LED); // rote LED aus
        //PORT_LED &= ~(1 << REL_LADE);

    if (MERKER1 == 1)
    {
      if (sec >= 10)
      {
      PORT_LED |= (1 << REL_LADE);
      MERKER1 = 0;
      }
      else PORT_LED &= ~(1 << REL_LADE);

    }
}
return (1);
}


Mfg Mirko

von Rahul, der Trollige (Gast)


Lesenswert?

>//Hauptprogramm läuft ständig in einer schleife und macht nichts

Das ist aber ungünstig... ;-)
Wo ist denn dein Problem?

von Mirko K. (hagbart)


Lesenswert?

Ja den Kommentar habe ich halt vergessen zulöschen. aber schon erledigt.

:-) :-)

von Karl H. (kbuchegg)


Lesenswert?

Dann lass halt erst mal alles SMS-ige weg, und beschäftige
dich nur mit dem Timer. Ein seperates Testprojekt, mit dem du
Timer kennenlernst ist immer eine gute Idee.
Da kannst du dann auch den Simulator benutzen um dein
Testprogramm auf Herz und Nieren während der Laufzeit
zu überprüfen und ihm zuzuschauen wie welche Variablen
wann ihren Wert ändern.

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.