Hallo zusammen,
bin bis auf einige Feiheiten bei den Kommentaren soweit fertig.
Was haltet ihr von diesem Uhrprogramm für 2 BCD Anzeigen. Zuerst eine Einleitshow, danach die Stunden für ca. 3 Sek und
dann die Minuten für 3 Sek. und zuletzt wieder alles aus bis zum nächsten Knopfdruck.
Nochmal ! Danke ! an alle die mir mit dem Timer geholfen haben! Als Verbesserung kommt eventuell noch ein Quarz dazu.
Code:#include <stdlib.h> #include <avr/io.h> // Makefile ATtiny 84 #include <avr/interrupt.h> // Datei für Interrupts #define F_CPU 1000000UL // Prozessortakt festlegen #include <util/delay.h> // Datei für Wartezeiten,immer nach CPU Takt einfügen //---- Variablen deklarieren ---- volatile unsigned int Millisekunden; volatile unsigned int Stundenzehner; volatile unsigned int Stundeneiner; volatile unsigned int Minutenzehner; volatile unsigned int Minuteneiner; volatile unsigned int Sekunden; volatile unsigned int Tagessekunden; int i, t, e; //---- Hauptprogramm ------------------------------------------------------- int main(void) { //--------------------------------------------------------------------------------------------------------- //---8 Bit Timer CTC Modus aktivieren--------------------------------- TCCR0A |= (1<<WGM01); // im TCCR0A Register Bit für CTC Modus setzen TCCR0B |= (1<<CS01); // im TCCR0B Register das entsprechende Bit für Vorteiler 8 setzen OCR0A = 125-1; // Überlaufwert festlegen im Register OCR0A max. Wert 255 Bit., entsprechend berechnen für die gewollte Zeit // 1.000.000Hz/8=125.000, 125.000Hz/125=1.000Hz, T=1/f = 1/1000Hz =0,001 Sekunden // Beim erreichen von 125 wird ISR(TIM0_COMPA_vect)ausgeführt, und somit die Variable "millisekunden" um 1 erhöt, nach 1000 Ausführungen ist 1 Sekunde vergangen! TIMSK0 = (1<<OCIE0A); // Interupsfunktion einschalten sei(); //---------------------------------------------------------------------------------------------------------------------- //---- Uhr stellen-------------------------------------------------- Stundenzehner = 0; Stundeneiner= 0; Minutenzehner = 1; Minuteneiner= 1; Millisekunden= 0; Sekunden = 0; Tagessekunden = (Stundenzehner*36000)+(Stundeneiner*3600)+(Minutenzehner*600) +(Minuteneiner*60); //----------------------------------------------------------------------------------------------- t=3; //Wert der Variablen für Einleitshow vordefinieren i=0; //--------------------------------------------------------------- //---- Endlosschleife--------------------------------------------------- while(1) { if ( PINA & (1<<PINA7) ) //Wenn Pin PA7=1 dann zeige Uhrzeit sonst.... { //----- Kleine LED Show vor der Zeitanzeige------------------------------------------- while (i !=t) //Schleife 5 mal durchlaufen {PORTB=0x3; //Start show DDRB = 0x01; DDRA = 0x01; _delay_ms(100); DDRA = 0x02; _delay_ms(100); DDRA = 0x04; _delay_ms(100); DDRA = 0x08; _delay_ms(100); DDRB = 0x02; DDRA = 0x08; _delay_ms(100); DDRA = 0x010; _delay_ms(100); DDRA = 0x20; _delay_ms(100); DDRA = 0x01; _delay_ms(100); i=i+1;} //----------------- show Ende -------------------------------------------------------------------------------------- // //----------------------------------- Zeit anzeigen Stunden --------------------------------------------------------------- while (e !=300) { //---- Multiplexen ---------------------------------------------------------------------------------------------- PORTB=0x3; // Pull up Widerstände an Port B PB0+PB1 aktivieren. Ausgänge geben nun 5V aus. DDRB = 0x01; switch(Stundenzehner)//----- Ausgabe der Stundenzehner Segment 1 ----- {case 0: DDRA = 0x3f; break; case 1: DDRA = 0x06; break; case 2: DDRA = 0x5b; break;} _delay_ms(5);// Multiplexzeit in der DDRB = (1 << DDB0)bzw. PB0 = 1 ist und nur Minutenzehner ausgegeben werden //---- Multiplexen -------------------------------------------------------------------------------------------- PORTB=0x3; // Pull up Widerstände an Port B PB0+PB1 aktivieren. Ausgänge geben nun 5V aus. DDRB = 0x02; switch(Stundeneiner)//----- Ausgabe der Stundeneiner Segment 2 ----- {case 0: DDRA = 0x3f; break; case 1: DDRA = 0x06; break; case 2: DDRA = 0x5b; break; case 3: DDRA = 0x4f; break; case 4: DDRA = 0x66; break; case 5: DDRA = 0x6d; break; case 6: DDRA = 0x7d; break; case 7: DDRA = 0x07; break; case 8: DDRA = 0x7f; break; case 9: DDRA = 0x6f; break;} _delay_ms(5);// Multiplexzeit in der DDRB = (1 << DDB1)bzw. PB1 = 1 ist und nur Minuteneiner ausgegeben werden. e=e+1; // Zählvariable für Schleifendurchlauf, pro Durchlauf um 1 erhöhen. } e =0; // Schleifenzähvariablen auf 0 setzen i = 0; //----------------------------------- Zeit anzeigen Stunden --------------------------------------------------------------- while (e !=300) { //---- Multiplexen ---------------------------------------------------------------------------------------------- PORTB=0x3; // Pull up Widerstände an Port B PB0+PB1 aktivieren. Ausgänge geben nun 5V aus. DDRB = 0x01; switch(Minutenzehner)//----- Ausgabe der Minutenzehner Segment 1 ----- {case 0: DDRA = 0x3f; break; case 1: DDRA = 0x06; break; case 2: DDRA = 0x5b; break; case 3: DDRA = 0x4f; break; case 4: DDRA = 0x66; break; case 5: DDRA = 0x6d; break;} _delay_ms(5);// Multiplexzeit in der DDRB = (1 << DDB0)bzw. PB0 = 1 ist und nur Minutenzehner ausgegeben werden //-------------------------------------------------------------------------------------------------------------- //---- Multiplexen -------------------------------------------------------------------------------------------- PORTB=0x3; // Pull up Widerstände an Port B PB0+PB1 aktivieren. Ausgänge geben nun 5V aus. DDRB = 0x02; switch(Minuteneiner)//----- Ausgabe der Minuteneiner Segment 2 ----- {case 0: DDRA = 0x3f; break; case 1: DDRA = 0x06; break; case 2: DDRA = 0x5b; break; case 3: DDRA = 0x4f; break; case 4: DDRA = 0x66; break; case 5: DDRA = 0x6d; break; case 6: DDRA = 0x7d; break; case 7: DDRA = 0x07; break; case 8: DDRA = 0x7f; break; case 9: DDRA = 0x6f; break;} _delay_ms(5);// Multiplexzeit in der DDRB = (1 << DDB1)bzw. PB1 = 1 ist und nur Minuteneiner ausgegeben werden. e=e+1; // Zählvariable für Schleifendurchlauf, pro Durchlauf um 1 erhöhen. } DDRA = 0x00; DDRB = 0x00; //--------------------------------------------------------------------------------------------------------------- }//if ende e =0; // Schleifenzähvariablen auf 0 setzen i = 0; }// while(1) ende return 0; }//int main(void) ende //--------- Interruptprogramm bzw. Unterprogramm ------------- ISR(TIM0_COMPA_vect) { Millisekunden++; if(Millisekunden == 1000) { Sekunden++; Tagessekunden++; Millisekunden = 0; if(Sekunden == 60) {Minuteneiner++;Sekunden = 0;} if(Minuteneiner== 10) {Minutenzehner++; Minuteneiner = 0;} if(Minutenzehner == 6) {Stundeneiner++; Minutenzehner = 0;} if(Stundeneiner == 10) {Stundenzehner ++;Stundeneiner = 0;} if(Stundenzehner == 3) {Stundenzehner = 0;} if(Tagessekunden == 86400) {Stundenzehner = 0; Stundeneiner = 0; Minutenzehner = 0; Minuteneiner = 0; Sekunden = 0; Millisekunden = 0; Tagessekunden = 0;} } } //---------------------------------------------------------------------------







Zitieren


Lesezeichen