mikrocontroller.net

Forum: Compiler & IDEs Timer beim AT90CAN128


Autor: Gilles R. (roodemol)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
benutze seit kurzem einen AT90CAN128 und habe davor einen ATmega128 
verwendet. Mir ist aufgefallen dass es beim Timer2 kleine unterschiede 
gibt, und zwar werden beim AT90CAN128 bei allen Registern des Timers 2 
ein A hinten angehängt. (Bsp.: TCCR2A) Es ist zwar auch in den 
Datenblättern so, kann mir jemand den Grund sagen.

Und jetzt zu meinem eigentlichen Problem, ich habe folgenden Code:
#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>

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

static uint32_t eeTimer3Frequency  EEMEM = 230; // in Hz
static uint8_t  eeTimer3DutyCycleA EEMEM = 33; // in %
static uint8_t  eeTimer3ComOutMode EEMEM = 0x80;


void pwm_init_timer3(void)
{
       uint32_t temp_clk_div = 0;
  uint16_t temp_ICR3 = 0;
  uint8_t  temp_TCCR3A = 0;
  uint8_t  temp_TCCR3B = 0;

  uint32_t Timer3Frequency;
  uint8_t  Timer3DutyCycleA;

  // Stop & reset timer
  TCCR3B = 0;
  TCNT3 = 0;

  // read from EEPROM
  eeprom_read_block(&Timer3Frequency ,&eeTimer3Frequency,4);
  Timer3DutyCycleA = eeprom_read_byte(&eeTimer3DutyCycleA);
  temp_TCCR3A      = eeprom_read_byte(&eeTimer3ComOutMode);
    
  if(Timer3Frequency > F_CPU)
  {
    // Not possible
    return;
  }
  else
  {
    temp_clk_div = F_CPU / Timer3Frequency;
    
    if (temp_clk_div < 0xFFFF)
    {
      temp_ICR3 = temp_clk_div;
      temp_TCCR3B |=  ( _BV(CS30) );    
    }
    else if (temp_clk_div < 0x7FFFF)
    {
      temp_ICR3 = temp_clk_div / 8;
      temp_TCCR3B |=  ( _BV(CS31) );
    }
    else if (temp_clk_div < 0x3FFFFF)
    {
      temp_ICR3 = temp_clk_div / 64;
      temp_TCCR3B |=  ( _BV(CS31) | _BV(CS30) );
    }
    else if (temp_clk_div < 0xFFFFFF)
    {
      temp_ICR3 = temp_clk_div / 256;
      temp_TCCR3B |=  ( _BV(CS32) );
    }
    else if (temp_clk_div < 0x3FFFFFF)
    {
      temp_ICR3 = temp_clk_div / 1024;
      temp_TCCR3B |=  ( _BV(CS32) | _BV(CS30) );
    }
    else
    {
      return;
    }
  }

  temp_TCCR3A |= ( _BV(WGM31) );
  temp_TCCR3B |= ( _BV(WGM33) | _BV(WGM32) );

  OCR3A = (uint16_t)(temp_ICR3 * Timer3DutyCycleA / 100);
  ICR3 = temp_ICR3;
  TCCR3B = temp_TCCR3B;
  TCCR3A = temp_TCCR3A;  
}


Ich habe dass ganze im Simulator laufen lassen und festgestellt, dass 
OCR3AH nie beschrieben wird.
Wo liegt ein Fehler, ich vermute in der Berechnung des Registers.

Ich setze WinAVR 20060421 ein.

Gilles

Autor: Gilles R. (roodemol)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe den Code jetzt so geändert:
  ...

  uint8_t sreg;
  
  ...

  sreg = SREG;
  cli();
  
  OCR3A = (uint16_t)( ((uint32_t)temp_ICR3 * (uint32_t)Timer3DutyCycleA) / 100);
  ICR3 = temp_ICR3;
  TCCR3B = temp_TCCR3B;
  TCCR3A = temp_TCCR3A;

  SREG = sreg;

Im Simulator funktioniert es jetzt, auf dem Prozessor aber immer noch 
nicht.
Hat die Variable eeTimer3Frequency den dezimalen Wert 10000 und 
Timer3DutyCycleA den Wert 66, dann wird 800 in ICR3-Register geschrieben 
und 16 ins OCR3A-Register, erwarten würde ich aber den Wert 528. Bei 
DutyCycles kleiner gleich 64 werden die erwarteten Werte geschrieben. 
Kann mir einer bitte sagen wo mein Fehler liegt, es hat doch bestimmt 
etwas mit der Multiplikation und einem Überlauf zu tun.


Gilles

Autor: Robens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
HALLO.
ich möchte das AT90CAN128 Programmieren,aber muß ich zuerst ein Bord 
bauen
also kann jemand mir bitte helfen und ein fertige schamatik vom das bord 
geben.
(eigentlich habe ich schon angefangen mit dem schematik fur diese 
controller, aber habe ich problem für die einschluß von CAN gefunden).
ich freue mich auf jeder antwort.
mfg
Robens

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.