www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PWM mit atmega88


Autor: Ramon Clematide (pnesius)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
salü ihr,

ich hab hier ein problem und ich bastle da schon seit stunden rum und 
ich kapier das einfach nicht ;(

ich benutze den atmega88 ( 
http://www.atmel.com/dyn/products/product_card.asp... ) auf 
dem stk500 board

nun muss ich pwm signale generieren und das tut soweit eigentlich auch 
wie ichs will, habs ans oszilloskop angehängt und sieht alles wunderbar 
aus. mein problem ist aber die veränderung der pulslängen.

der code unten produziert mir also ein pwm signal wie gewünscht, jetzt 
möchte ich aber die pulsbreite verlängern bzw verkürzern und hab dazu 
die zwei schalter eingebaut die mir das comparematchregister neu 
beschreiben (inkrementieren und dekrementieren). der komische effekt den 
ich nicht verstehe ist dass das signal genau so lange verändert bleibt 
wie ich auf dem knopf drücke. lasse ich den knopf los, dann geht die 
pulsbreite wieder auf die ursprüngliche breite zurück (die breite die 
bei der initialisierung gesetzt wurde). ich möchte aber dass der puls um 
die erhöhte breite verlängert bleibt.

wenn ich also den knopf loslasse, dann springe ich von einer while 
schlaufe ( while(!(PIND & (0x01 << PD0))) {} ) die nichts macht, in eine 
andere ( while(1) ) die auch genau nichts macht und trotzdem wird das 
signal auf den initialwert zurückgesetzt. sieht da irgendjemand was ich 
falsch mache?

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>

void timer_init(void) {
  TIMSK1 = (1<<TOIE1); // Timer Interup Mask 1 -> Timer Overflow Interrupt Enable
  TCNT1 = 0; // Timer Counter -> timerreset
  
  // non inverting Fast PWM Mode with prescaler 64
  TCCR1B = (1<<CS11) | (1<<CS10) | (1<<WGM13) | (1<<WGM12);
  TCCR1A = (1<<COM1A1) | (1<<WGM11);

  ICR1 = 0x00FA; // 2 ms period
  
  OCR1A = 0x007D; // 1 ms pulslength compare value
  
  sei();
  
}

int main(void) {
  DDRB = 0x02; // Port B -> PB1 (OL1A) for PWM set as output, others inports
  DDRD = 0x00; // Port D -> all bits set as inports
  timer_init();
  
  while(1)
  {
    if( !(PIND & (0x01 << PD0)) )
    {
      OCR1A = OCR1A + 0x0F;

      while(!(PIND & (0x01 << PD0))) {}
    }    
    else if( !(PIND & (0x01 << PD1)) )
    {
      OCR1A = OCR1A - 0x0F;

      while(!(PIND & (0x01 << PD1))) {}
    }
    
  }
}

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Ramon Clematide (pnesius)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
na, die tasten sind glaub ich schon hardwaremässig entprellt. der fehler 
wäre dann auch nicht so systematisch ausgefallen.

ich habs jetzt rein zufällig rausgefunden... aber ich kapier dennoch 
nicht warum das einen einfluss hat.

füge ich folgende funktion hinzu um den overflow abzufangen (kleiner 
test mit blinkender led), funktioniert es wie ich es will. kommentier 
ich sie raus entsteht der oben beschriebene effekt.

volatile long int count;
// timer 1 overflow
SIGNAL(SIG_OVERFLOW1) {
  count++;
  if(count % 0xFF == 0) {
    PORTB = (1 << PB0);
    count = 0;
  }
  else if(count % 0x7F == 0)
  {
    PORTB = (0 << PB0);
  }
}

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ramon Clematide wrote:
> füge ich folgende funktion hinzu um den overflow abzufangen (kleiner
> test mit blinkender led), funktioniert es wie ich es will. kommentier
> ich sie raus entsteht der oben beschriebene effekt.
Tja, wenn Du einen Interrupt freigibst, für den kein Handler existiert, 
und der Interrupt tritt auf, dann gibts halt nen Reset. Ist doch klar, 
dass dann alles Mögliche passieren kann, oder?

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.