-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 13

Thema: CTC Timer mit mega168

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    19.02.2004
    Alter
    29
    Beiträge
    82

    CTC Timer mit mega168

    Anzeige

    Hallo,

    nachdem ich von Bascom auf C umgestiegen bin stehe ich wieder vor wahrscheinlich normalen anfänglichen Problemen.

    Für eine digital Uhr benötige ich einen Timer, der (genau) jede Sekunde die ISR ausführt.

    Ich habe schon die Wiki durchgeschaut, die dort angegebenen Beispiel laufen bei mir nicht.

    Jetzt habe ich ein anderes Beispiel gefunden:

    Code:
    //----------------------------------------------------
     // Set up timer 1 to generate an interrupt every 1 ms
     //----------------------------------------------------
     TCCR1A = 0x00;
     TCCR1B = (_BV(WGM12) | _BV(CS12));
     OCR1A = 71;
     TIMSK1 = _BV(OCIE1A);
     
    ISR(TIMER1_COMPA_vect)
    {
        second++; 
    }
    Es werden beim Compilieren zwar keine Fehler gefunden, aber meine Sekunden werden trotzdem nicht erhöht. Hoffe ihr wisst Rat.

    zusätzliche Infos:

    µController: AT mega168
    Compiler: AVR Studio (mit Win AVR für C)

  2. #2
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.785
    Blog-Einträge
    8
    volatile uint8_t second;

    Wenn eine ISR auf eine Variable zugreift sollte diese volatile sein.

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    19.02.2004
    Alter
    29
    Beiträge
    82
    Danke für den Hinweis, aber der Codeausschnitt ist wirklich nur ein Ausschnitt. weiter oben im Programm steht bereits volatile int second

  4. #4
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.597

    Re: CTC Timer mit mega168

    Zitat Zitat von phyro
    ... der Codeausschnitt ist wirklich nur ein Ausschnitt ...
    Hübsches Ratespiel der Art: ich verstecke den größten Teil meines geheimen Codes, bitte sucht den Fehler.
    Zitat Zitat von phyro
    ... Timer, der (genau) jede Sekunde die ISR ausführt ... Beispiel laufen bei mir nicht ... anderes Beispiel gefunden ...
    Eine alte indische Programmiererweisheit lautet: selbst ist der Programmierer. Ne andere ist eher kryptisch: RTFM.
    Zitat Zitat von phyro
    ... Timer, der (genau) jede Sekunde die ISR ausführt ... zusätzliche Infos: ... AT mega168 ...
    Die Basis für einen genauen Timer ist der Quarztakt. Ohne dessen Wert zu kennen müsste ich zusammen mit der Bedeutung des "_BV" auch hier etwas raten. "TCCR1A = 0x00;" halte ich für ein eher unsinniges Codestück, da beim CTC mit OCR1A zumindest WGM01 gesetzt sein muss. Soweit ich mich an die Dokumentation erinnere.
    Ciao sagt der JoeamBerg

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    19.02.2004
    Alter
    29
    Beiträge
    82

    Re: CTC Timer mit mega168

    Zitat Zitat von oberallgeier
    Hübsches Ratespiel der Art: ich verstecke den größten Teil meines geheimen Codes, bitte sucht den Fehler.
    Sorry, ich habe gedacht es währe übersichtlicher, wenn ich nur das poste, was auch mit dem Timer zu tun hat. Den übrigen Teil habe ich zuvor schon getestet und der tut was er soll.

    Übrigens, der Ton macht die Musik!

    Und wie gesagt, den Timer habe ich in Bascom schon einmal erfolgreich umgesetzt, ich will zunächst mal, dass der Timer überhaupt erstmal läuft, die passende Geschwindigkeit kann ich dann hinterher immer noch einstellen. Darum geht es mir hier nicht.

    Und hier noch mal der gesamte Code:

    Code:
    #include <avr/io.h>    
    #include <avr/interrupt.h>     
    #include <util/delay.h>
    
    void anzeige(int A1, int A2, int A3, int P);
    
    volatile int second = 0;
    volatile int minute = 0;
    volatile int hour = 0;
    
    int P = 0;
    
    
    int main (void) {           
    
    //---------------------------------------------------- 
     // Set up timer 1 to generate an interrupt every 1 ms 
     //---------------------------------------------------- 
     TCCR1A = 0x00; 
     TCCR1B = (_BV(WGM12) | _BV(CS12)); 
     OCR1A = 71; 
     TIMSK1 = _BV(OCIE1A); 
      
    
        DDRB = 0xff;       // PortB als Ausgang       
        DDRC = 0b001111;   // PortC.0 bis C.3 als Ausgang
       
       while(1) 
       {
        
       	anzeige(hour,minute,second,0);              
    	
    	 
       }
    	return 0;                
    }
    
    /* Die Funkton Anzeige kümmert sich darum, die in A1, A2 und A3 abgelegten Zahlen auf
       den Sechs 7-Segment Anzeigen dar zu stellen, P ist für die Sekunden Punkte zuständig */
    
    void anzeige(int A1, int A2, int A3, int P)
    {
    	
    	PORTB = 0b000001;     
    	PORTC = A1/10 ;       
    
        _delay_ms(3);    
    
    	PORTB = 0b000010;      
    	PORTC = A1%10 ;       
    
    	_delay_ms(3);
    
        PORTB = 0b000100;    
    	PORTC = A2/10 ;        
    
     	_delay_ms(3);
        
    	PORTB = 0b001000;    
    	PORTC = A2%10 ;     
    
    	_delay_ms(3);
    
        PORTB = 0b010000;      
    	PORTC = A3/10 ;       
    
    	_delay_ms(3);
    	
    	PORTB = 0b100000;     
    	PORTC = A3%10 ;
    	
    	_delay_ms(3);
    
    }    
    
    ISR(TIMER1_COMPA_vect)
    {
      second++;
    
      if (second>59) {
      second=0;
      minute++;
      }
    
      if (minute>59) {
      minute=0;
      hour++;
      }
    
      
      if (hour>23) {
      hour =0;
      }
    }
    Und der Controller wird über einen Quarz mit 16 Mhz versorgt

  6. #6
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Und wie stellst du jetzt fest, dass second nicht richtig hochgezählt wird?
    MfG
    Stefan

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    19.02.2004
    Alter
    29
    Beiträge
    82
    oh sry, hatte noch ne Dreher im Programm, weil ich nachher noch was dran gemacht hatte, zum testen war im Hauptprogramm nur die fkt Anzeige aufgerufen worden. Hab es im vorherigen Post geändert.

  8. #8
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.597

    Re: CTC Timer mit mega168

    Zitat Zitat von phyro
    ... Den übrigen Teil habe ich zuvor schon getestet und der tut was er soll ...
    Zitat Zitat von phyro
    oh sry, hatte noch ne Dreher im Programm, weil ich nachher noch was dran gemacht hatte ...
    Zitat Zitat von phyro
    ... Übrigens, der Ton macht die Musik! ...
    Ciao sagt der JoeamBerg

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    19.02.2004
    Alter
    29
    Beiträge
    82
    Achso, jetzt wird mir alles klar!!!

    Wo liegt denn das Problem, dass ich, nachdem ich hier das erste mal nachgefragt habe, noch selbst am Programm rumgewerkelt habe?
    Du musst mir ja nicht helfen wenn du nicht willst? Aber was genau stört dich daran? Das ich hier frage wenn ich mal nicht weiter weiß?

  10. #10
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Wenn das alles an Code ist, fehlt wohl das sei().

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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