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;}
}
}
//---------------------------------------------------------------------------
Lesezeichen