Fast PWM Atmega8

Gast #1368233
Hi,
ich habe ein Problem mit der Fast PWM einstellung beim Atmega8 am 
Timer1.

Haben die wie im folgenden Quellecode eingestellt. Der Prozessor läuft 
bei einem Takt von 3,6864MHz.

#include <mega8.h>

int tmp=0;
int tmp1=0;

interrupt [EXT_INT0] void ext_int0_isr(void)
{

}

interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
  if(tmp1==0)
  {
    PORTB |=(1<<1) ;
    tmp1=1;
  }
  else
  {
    PORTB &=~ (1<<1);
    tmp1=0;
  }
}

interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
  if(tmp==0)
  {
    PORTB |=(1<<0) ;
    tmp=1;
  }
  else
  {
    PORTB &=~ (1<<0);
    tmp=0;
  }
}

void main(void)
{
  PORTB=0x00;
  DDRB=0xFF;

  PORTC=0x00;
  DDRC=0x00;

  PORTD=0x00;
  DDRD=0x00;

  TCCR1A=((0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | 
(0<<FOC1A) | (0<<FOC1B) | (1<<WGM11) | (0<<WGM10));
  TCCR1B=((0<<ICNC1) | (0<<ICES1) | (1<<WGM13) | (1<<WGM12) | (1<<CS12) 
| (0<<CS11) | (0<<CS10));

  ICR1H=((0<<7) | (0<<6) | (1<<5) | (1<<4) | (1<<3) | (0<<2) | (0<<1) | 
(0<<0));
  ICR1L=((0<<7) | (4<<6) | (1<<5) | (0<<4) | (1<<3) | (1<<2) | (1<<1) | 
(1<<0));

  OCR1AH=((0<<7) | (0<<6) | (0<<5) | (1<<4) | (1<<3) | (1<<2) | (0<<1) | 
(0<<0));
  OCR1AL=((0<<7) | (0<<6) | (1<<5) | (0<<4) | (1<<3) | (0<<2) | (0<<1) | 
(0<<0));

  GICR|=0x40;
  MCUCR=0x03;
  GIFR=0x40;

  TIMSK=((0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (1<<OCIE1A) | 
(0<<OCIE1B) | (1<<TOIE1) | (0<<TOIE0));

  ACSR=0x80;
  SFIOR=0x00;

#asm("sei")
  while (1)
  {

  };
}


Ich habe an die Ausgänge PB0 und PB1 LED's angeschlossen. Eigentlich 
sollte doch die LED an PB0 eher ansein als die an PB1 oder verstehe ich 
das grundsätzlich was falsch ?
#1368535
wo ist dein eigendliches Problem?
gehts nicht, gehts anders als erwartet?

ich tippe mal:
die temp variablen sollten eventuell als volatile declariert werden, 
wobei ich die ganz wegschmeißen würde und direkt im Port-register 
nachschuen würde obs an ist, oder nicht.

#asm ist doof.
benutze sei()


#include <mega8.h> ist doof
es gibt einen header für alle, der die unterscheidung intern macht.
benutz den ich glaib avrio.h oder so, bin mir abernicht sicher

bei 16bit (2x8bit) registern muss man meist das unterste zuerst 
beschreiben und dann das höhere WICHTIG!!!.
in C gibt es meist ein define, das man als 16bit register anspricht:
ICR1  statt ICR1H  und ICR1L

denk auch an die (in den Compiler-settings) vordefinierte F_CPU 
constante

wenn das alles nichts hilf überprüfe noch mal bit für bit die Timer 
initialsierungen.
Gast #1369330
Die PWM funktioniert an sich schon. Das Problem ist nur, sobald die PWM 
gestartet wird, wird erst ein Overflow Interrupt ausgelöst und dann im 
wechsel erst der Compare und dann der Overflow. Zweites sollte doch auch 
schon beime ersten durchlaufen passieren oder? Oder ist diese Abfolge 
beim starten doch richtig?
Kann man hieran was ändern ?

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.