- LiFePO4 Speicher Test         
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
    40
    Beiträge
    28
    Blog-Einträge
    1
    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
  •  

fchao-Sinus-Wechselrichter AliExpress