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
>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.
> 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).
Vielleicht wäre es einfacher, im nächsten Baumarkt eine Zeitschaltuhr zu kaufen.
>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.
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
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
>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.
"...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ß
> 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
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
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
> 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?
und dann noch: Das hier if (MERKER1 = 1) ist eine Zuweisung. Du wolltest wahrscheinlich einen Vergleich if (MERKER == 1)
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.
>(MERKER1 = 1)
Und lerne den Unterschied zwischen Zuweisung und Vergleich kennen...
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
>//Hauptprogramm läuft ständig in einer schleife und macht nichts
Das ist aber ungünstig... ;-)
Wo ist denn dein Problem?
Ja den Kommentar habe ich halt vergessen zulöschen. aber schon erledigt. :-) :-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.