www.mikrocontroller.net

Forum: Compiler & IDEs atmega162 TIMER3 Interrupt


Autor: Andreas Scheuerer (sean1587)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo.

ich werde würde beim mega162 gerne 4xpwm (keine Soft-PWM) nutzen und 
zusätzlich noch einen timer (in diesem Fall Timer3) für Interrupt zB. 
Sekundenabläufe ect. nutzen.

Aber irgentwie fehlen beim timer3 OCR3A oder B ect..

Kann mir bitte Jemand etwas auf die Sprünge bringen, wie ich das in dem 
Fall realisieren kann?

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas Scheuerer schrieb:

> Aber irgentwie fehlen beim timer3 OCR3A oder B ect..

Wie kommst du darauf?

Autor: Andreas Scheuerer (sean1587)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas Scheuerer schrieb:
> Hallo.
>
> ich werde würde beim mega162 gerne 4xpwm (keine Soft-PWM) nutzen und
> zusätzlich noch einen timer (in diesem Fall Timer3) für Interrupt zB.
> Sekundenabläufe ect. nutzen.
>
> Aber irgentwie fehlen beim timer3 OCR3A oder B ect..
>
> Kann mir bitte Jemand etwas auf die Sprünge bringen, wie ich das in dem
> Fall realisieren kann?

sry wegen des langen codes aber ich bekomm keinen anhang rauf
_________________________________________________________________________

//----------------------------------------------------------------------
//
//----------------------------------------------------------------------
#define   F_CPU 19090000  // Taktferquenz des myAVR-Boards
#include  <avr\io.h>    // AVR Register und Konstantendefinitionen
#include   <math.h>  // Mathematische Funktionen
#include   <util/delay.h>
#include   <avr/interrupt.h>

//----------------Interupt Anfang--------------------------------------------------------

ISR (TIMER3_OVF_vect)
{
  t ++; 

  if (t >= 1024)
  {
    t = 0;
    
    
    
    
    //PORTB = ~ PORTB;          // Flankenwechsel für Tonfrequenz
  }
}

//----------------Interupt Ende----------------------------------------------------------
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//----------------Entprellfunktion Anfang------------------------------------------------

inline uint8_t debounce(volatile uint8_t *port, uint8_t pin)
{
    if ( ! (*port & (1 << pin)) )
    {
        /* Pin wurde auf Masse gezogen, 100ms warten   */
        _delay_ms(50);  // max. 262.1 ms / F_CPU in MHz
        _delay_ms(50); 
        if ( *port & (1 << pin) )
        {
            /* Anwender Zeit zum Loslassen des Tasters geben */
            _delay_ms(50);
            _delay_ms(50); 
            return 1;
        }
    }
    return 0;
}

//----------------Entprellfunktion Ende--------------------------------------------------
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//----------------Tastenabfrage Anfang---------------------------------------------------
    
void tastenabfrage ()
{
    if (debounce(&PINC, PC0))
    {
      mode++;
      if (mode > 3)
      {
        mode = 0;
      }
    }
      
    if (debounce(&PINC, PC1))
    {
      if ((mode==0) || (mode==2) || (mode==3))
      {
        time++;
        if (time >9)
        {
          time = 9;
        }
      }
      else if ((mode==1))
      {
        color++;
        if (color >16)
        {
          color = 16;
        }
      }
    }
    else if (debounce(&PINC, PC2))
    {
      if ((mode==0) || (mode==2) || (mode==3))
      {
        time--;
        if (time >240)
        {
          time = 0;
        }
      }
      else if ((mode==1))
      {
        color--;
        if (color >240)
        {
          color = 0;
        }
      }
    }
}
//----------------Tastenabfrage Ende-----------------------------------------------------
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//----------------Mainfunktion Anfang----------------------------------------------------

main ()            
{
  // hier Init-Code eintragen

  unsigned int i = 0;
  uint8_t mode = 0;
  uint8_t time = 0;
  uint8_t color = 0;
  uint8_t cr[] = {255, 255,255,255,255,255, 0, 0, 0, 0, 0, 0, 160, 160, 255, 255, 255};
  uint8_t cg[] = {0, 0, 128, 128, 255, 255, 255, 255, 144, 2555, 0, 0, 0, 0, 0, 0, 255};
  uint8_t cb[] = {0, 0, 0, 0, 0, 0, 0, 0, 144, 255, 255, 255, 255, 255, 255, 255, 255};
  uint8_t cw[] = {0, 128, 0, 128, 0, 128, 0, 128, 0, 0,0, 128, 0, 128, 0, 128,  255};
  
  DDRB  = (1<<PB0) | (1<<PB1) | (1<<PB2);   // Ausgang
  DDRD  = (1<<PD5);         // Ausgang
  DDRE  = (1<<PE2); // Ausgang
  
  DDRC &= ~( ( 1 << DDC0 ) | ( 1<<DDC1) | ( 1<<DDC2)); // Eingänge
  PORTC |= (1<<PC0) | (1<<PC1) | (1<<PC2); // Pullup

  //COM1B1 für OCR1B(OC1B) notwendig
  TCCR0 = (1<<COM01) | (1<<COM00) | (1<<WGM00) /*| (1<<WGM01)*/ | (1<<CS00)| (1<<CS01);
  TCCR1A = (1<<COM1A1) | (1<<COM1A0) | (1<<COM1B1) | (1<<COM1B0) /*| (1<<WGM11)*/ | (1<<WGM10);
  TCCR1B = (1<<CS10) | (1<<CS11);
  TCCR2 = (1<<COM20) | (1<<COM21) | (1<<WGM20) | (1<<CS10) | (1<<CS11);
  //Timer3 für interupt
  TCCR3B = (1 << CS30);
  TIMSK |= (1<<OCIE3);
  
  sei();
  
  // Schleifenanfang Mainloop
  while(true)
  {
    /*OCR0 = 128;
    OCR1A  = 128; //360 Werte * 40 = 14400
    OCR1B  = 128; //360 Werte * 40 = 14400
    OCR2  = 128;
    */

//----------------Tastenabfrage Ende-----------------------------------------------------
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//----------------Auswahl Modus Anfang---------------------------------------------------
    if (mode == 0)//Sanfter Farbwechsel[  ]
    {  
      cr
    }
    else if (mode == 1)//Manuelle Farbwahl (0-16)[OK]
    {
      OCR0 = cr[color];
      OCR1A  = cg[color]; 
      OCR1B  = cb[color]; 
      OCR3A  = cw[color];
    }
    else if (mode == 2)//Sprunghafter Farbwechsel[  ]
    {
      color = 0;
      while (PINC & (1 << 0))
      {
      
      }
    }
    else if (mode == 3)//Sonnenaufgang[  ]
    {
      
    }
//----------------Auswahl Modus Ende-----------------------------------------------------
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//---------------------------------------------------------------------------------------    
      
  }//-----------Schleifenende Whileloop------------------------------------------------
        
}//---------------Schleifenende Mainloop-------------------------------------------------

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und wo ist das Problem?

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ISR (TIMER3_OVF_vect)
...
 TIMSK |= (1<<OCIE3);
Das passt in gleich zweifacher Hinsicht nicht.

Autor: Andreas Scheuerer (sean1587)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan Ernst schrieb:
>
ISR (TIMER3_OVF_vect)
> ...
>  TIMSK |= (1<<OCIE3);
> 
Das passt in gleich zweifacher Hinsicht nicht.

Kannst du mir auch erklären warum, bzw. wie ich es richtig machen kann?

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Kannst du mir auch erklären warum, bzw. wie ich es richtig machen kann?

Liegt vielleicht am Register in das du schreiben willst, am Bit-Namen...

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Kannst du mir auch erklären warum, bzw. wie ich es richtig machen kann?

RTFM

In diesem Fall das Datenblatt. Auch wenn das auf Englisch ist, die 
Bildchen mit den Registerbits versteht man auch so.

Oliver

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas Scheuerer schrieb:
> Stefan Ernst schrieb:
>>
ISR (TIMER3_OVF_vect)
>> ...
>>  TIMSK |= (1<<OCIE3);
>> 
Das passt in gleich zweifacher Hinsicht nicht.
>
> Kannst du mir auch erklären warum, bzw. wie ich es richtig machen kann?

OCIE3            _O_utput _C_ompare _I_nterrupt _E_nable Timer-3
TIMER3_OVF_vect  Overflow Interrupt für Timer 3

Was passt da jetzt nicht zusammen?

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> Kannst du mir auch erklären warum, bzw. wie ich es richtig machen kann?

>OCIE3            _O_utput _C_ompare _I_nterrupt _E_nable Timer-3
>TIMER3_OVF_vect  Overflow Interrupt für Timer 3

>Was passt da jetzt nicht zusammen?

Und das Bit steckt nicht in TIMSK. Die Timer3-ISR-Enable-Bits stecken 
alle in ETIMSK.

>RTFM

Oliver

Autor: Andreas Scheuerer (sean1587)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke euch allen, ihr habt mir echt weitergeholfen.

Und ja, ich hatte wohl echt ein Brett vorm Kopf

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.