www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATtiny2313 4xPWM + Timer Interrupt Problem


Autor: ben (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Bin jetzt von Bascom auf AVR GCC umgestiegen und wollte mit einem 
ATTiny2313  4 LEDs per PWM Dimmen. Die Dimmung funktioniert soweit 
super, allerdings wollte ich noch eine Zeitmessung per Timerinterrupt 
realisieren. Das muss nicht genau sein. Zum Stromsparen sollte sich der 
Controller nach ca. 1 - 2h in den Sleep bzw. Standby Modus versetzten. 
Allerdings ist mir, als Anfänger, etwas schleierhaft wie ich einen 
Timerinterrupt nach ca. 1ms Programmieren kann da beide interne Timer 
für die 4 PWM Kanäle benutzt werden.

Hat einer von euch eine Idee wie man das Realisieren kann?

Hier mein bisheriger Test-Programmcode:



//Define
#define F_CPU 1000000UL      //Taktfrequenz des uC für die Delay festlegen
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

/* Globale Variablen */
volatile unsigned char interbw = 0;


//Long Delay festlegen
void long_delay(uint16_t ms)
{
    for(; ms>0; ms--) _delay_ms(1);
}



//Hauptprogramm
int main (void) {
cli();          //interrupts Deaktivieren

//Config
//////INT/////
TIMSK  |= ( 1 << OCIE1B);



DDRD |= (1 << PD5);    // Ausgangspin für PWM
DDRB |= (1 << PB4);    // Ausgangspin für PWM
DDRB |= (1 << PB3);    // Ausgangspin für PWM
DDRB |= (1 << PB2);    // Ausgangspin für PWM

TCCR0A = 0b10100001 ;   //FastPWM
TCCR0B = 0b00000001;  //Kein Prescaler
TCCR1A = 0b10100001 ;   //FastPWM
TCCR1B = 0b00000001;  //Kein Prescaler


/* DEKLARATIONEN */
char i = 0;
unsigned char pwm = 1;
unsigned int zeit = 0;
//unsigned char 

/*Bereitschaft anzeigen
 Initialisierung*/
OCR0B=150;
OCR0A=150;
OCR1B=150;
OCR1A=150;
long_delay(500);

//Hauptschleife

while(1){
sei();          //interrupts Aktivieren

// PWM-Werte zum Test erzeugen -> Fader
if (pwm>=25){
  i=1;
  }

if (pwm <=15){
  i=0;
  }

if (i==1){
  pwm--;
  }
else {
  pwm++;
  }

//PWM-Wert an jeweiligen Port zuweisen
OCR0B = pwm;
OCR0A = pwm;
OCR1B = pwm;
OCR1A = pwm;

long_delay(10);        //10ms Warten

}
                          
   return 0;                
}
/*
============== I S R =================
*/

ISR(TIMER1_COMPB_vect) 
{
cli();
  //Diese ISR funktioniert nicht
sei();  
}

Vielen Dank & Grüße
Ben

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Prüfe, ob Bit WGM00 allein bei Timer0 den gewünschten PWM Modus 
einschaltet.  Prüfe, ob Bit WGM10 allein bei Timer1 den gewünschten PWM 
Modus einschaltet.
Deine Bit-Auswahl kann ich keinem FAST-PWM Modus zuordnen.

Warum willst du dir per TIMSK einen Interrupt geben lassen, wenn die ISR 
eh leer ist (cli/sei gehören dort nicht hin)? Die PWM kann ohne 
Interrupt-ISR laufen.

Autor: ben (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Stefan,

danke für deine Antwort. Die ISR ist momentan leer, habe gerade getestet 
ob sie funktioniert (LED einschalten in der ISR). Das war nicht der 
Fall. Die CLI() / SEI() Funktion habe ich auch mal getestet um 
auszuschließen das der Interrupt die ISR unterbbricht und somit einen 
Stack-Überlauf verursacht. Die PWM an sich funktioniert hervorragend. 
Die Bitsetztung werde ich gleich morgen nocheinmal prüfen.

Gruß Ben

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.