www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Timer Capture / Dimmerschaltung


Autor: Schorschi (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich sitzte jetzt schon seit 2 Tagen, weil ich offenbar zu blöd bin, den 
Capture von einem Mega88 zum laufen zu bringen. Das Ganze soll einmal 
ein über I2C ansteuerbarer Dimmer werden.

Was passiert ist folgendes: Abhängig vom Wert dimmer_val (wird zur 
Laufzeit über DebugWire verändert) funktioniert das Ganze einwandfrei 
oder der Triac wird nur jede zweite Halbwelle gezündet (blau). Die 
Polarität spielt keine Rolle, das Ganze kippt auch manchmal.
Die Nulldurchgangserkennung funktioniert allerding, weil ich im INT0 
Interrupt einen Pin togglen lasse (gelb).
Auf dem einen Bild ist dimmer_val einmal 300, das zweite wurde mit 500 
gemacht.

Vieln Dank schon mal für sachdienliche Hinweise :)
Schorschi

Nachdem mein Quelltext relativ kurz ist, hoffe ich dass ich den hier 
reinsetzen darf:

/*********************************************************************/
#include <stdlib.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <avr/interrupt.h>

// Für Bitmanipulationen
#define BIT0 0x01
#define BIT1 0x02
#define BIT2 0x04
#define BIT3 0x08
#define BIT4 0x10
#define BIT5 0x20
#define BIT6 0x40
#define BIT7 0x80

unsigned int dimmer_val=2; // werte bis 1200, sonst zündung der nächsten 
periode

ISR ( INT0_vect ) // nulldurchgangserkennung
{
  TCCR1B &= ~(1<<CS11); // stop timer

  PORTB ^= BIT0;

  TCNT1H=0x00; // reset timer value
  TCNT1L=0x00;
  OCR1AH = ( dimmer_val & 0xFF00 ) >> 8; // dauer bis capture
  OCR1AL = ( dimmer_val & 0x00FF );
  TCCR1A |= (1 << COM1A0)|(1 << COM1A1); // set output on capture
  TCCR1B |= (1<<CS11); // clock /8 is timer clock
}


ISR( TIMER1_COMPA_vect ) // COMPA interrupt
{
  TCCR1B &= ~(1<<CS11);

   TCNT1H=0x00; // reset timer value
  TCNT1L=0x00;
  OCR1AH=0x00; // dauer bis capture
  OCR1AL=0x30;
  TCCR1A &= ~(1 << COM1A0); // reset output on capture
  TCCR1B |= (1<<CS11); // clock /8 is timer clock
}

int main(void) {

  EICRA |= (1 << ISC01)|(1 << ISC00);
  EIMSK |= (1 << INT0);

  TIMSK1 |= (1<<OCIE1A); // generate interrupt on capture


  DDRB |= (1 << PB1)|(1 << PB0);          // enable PD5 as output

  sei();

  while(1){

  }
}

/*********************************************************************/

Autor: Schorschi (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
das zweite bild

Autor: Schorschi (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hab gerade den Wert dimmer_val durchlaufen lassen und muss mich 
verbessern: Es kommt manchmal ein komplettes Durcheinander zustande....

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.