mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Fast PWM Atmega8


Autor: Heiner K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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 ?

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Heiner K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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 ?

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich bild mir ein gesehen zu haben, dass im Datenblatt etwas stand, wann 
neue werte des compareregisters übernommen werden.
schau da mal rein.

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.