- LiFePO4 Speicher Test    Werbung      
Ergebnis 1 bis 10 von 52

Thema: Timer für AVR ATtiny84 oder ander allgemein in C

Baum-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #14
    Neuer Benutzer Öfters hier Avatar von ooweberoo
    Registriert seit
    24.02.2014
    Ort
    66482 Zweibrücken
    Alter
    41
    Beiträge
    28
    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;}
    	  
      }
    }
    //---------------------------------------------------------------------------
    Geändert von ooweberoo (12.03.2014 um 18:42 Uhr)

Ähnliche Themen

  1. Datenübertragung Bluetooth (oder Funk allgemein)
    Von Bumbum im Forum Software, Algorithmen und KI
    Antworten: 0
    Letzter Beitrag: 21.09.2012, 09:02
  2. ATTiny84 Pegelbegrenzung mit Zenerdiode oder wie?
    Von DanielSan im Forum AVR Hardwarethemen
    Antworten: 25
    Letzter Beitrag: 01.12.2011, 13:40
  3. 5V Netzteil gesucht oder allgemein guter Hersteller
    Von kini im Forum Suche bestimmtes Bauteil bzw. Empfehlung
    Antworten: 5
    Letzter Beitrag: 25.03.2010, 11:33
  4. Ander controller programmieren?
    Von BlackDevil im Forum Elektronik
    Antworten: 10
    Letzter Beitrag: 26.08.2006, 00:20
  5. Bspcode in assembler für AVR Timer
    Von Shadowrun im Forum AVR Hardwarethemen
    Antworten: 5
    Letzter Beitrag: 09.02.2005, 13:55

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

    Werbung      LiFePO4 Speicher Test