mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Mit ATmega8 funktioniert aber mit AT90PWM3B nicht!


Autor: Kaveh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Zusammen,
ich hoffe, ich kann euch mein Problemm, mit dem ich seit heutemorgen 
zukämpfen habe, anschaulich beschreiben.
Also ich habe zwei Controller ein Atmega8 und ein AT90pwm3B + ein 
Pwm-Programm geschrieben in Sprache C (siehe unten).
dieses Programm läuft wunderbar auf ATmega8. Der Avr-Studio erzeugt 
davon ein HEX-file und das wird in den ATmega8 übertragen.
Die gleiche Vorgehenweise funktioniert mit dem anderen Cotroller nämlich 
mit AT90PWM3B nicht. AVR-Studio meldet keinen Fehler aber einen Haufen 
Warnung.
es wird kein HEX-File erzeugt und ich kann das programm in AVR-Studio 
nicht simulieren. Im Menu Debug ist bei Toggel Breakpunkt einen roten 
punkts zusehen.den kann ich zwar wegmachen aber der taucht immer wieder 
auf.
Vielleicht kann jemand mich auf den Fehler, den ich leider bis jetzt 
nicht gefunden habe, aufmerksam machen.
ich danke euch
mfg
kaveh

das programm unten für AT90pwm3B. die erste Bibliotheken nämlich 
<avr/io.h> und <stdint.H> habe ich für ATmega8 verwendet und es kamm 
keine fehlermeldung.

#include <avr/io.h>
#include <stdint.h>
#include"mcu.h"
#include"compiler.h"
#include"adc_drv.h"
#include"amplifier_drv.h"
#include"comparator_drv.h"
// Analog/Digital Wandler initialisieren
void adc_init(void)
{
        // externe Referenzspannung und AD-Wandlerkanal 9 (ADC9 / PC5) 
auswählen
        ADMUX = 0;

        // AD-Wandler einschalten und Prescaler = 64 einstellen 
(enstpricht 115 khz Wandlertakt)
        ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1);
}

// Timer einstellen
void timer_init(void)
{
   // OC1A auf Ausgang
  DDRD = (1 << PD2 );

  // Was die einzelnen Einstellungen genau bedeuten steht im Datenblatt
  //
  // Timer 1 einstellen
        //
        // Modus 14: Fast PWM, Top von ICR1
        //
        // >> WGM13    WGM12   WGM11    WGM10
        //       1        1       1        0
        //
        // Timer Vorteiler: 1
  //
        // >> CS12     CS11    CS10
        //      0        0       1
        //
        //  Steuerung des Ausgangsport: Set at BOTTOM, Clear at match
  //
        // >> COM1A1   COM1A0
        //      1        0

  TCCR1A = (1<<COM1A1) | (1<<WGM11);
  TCCR1B = (1<<WGM13) | (1<<WGM12) | (1<<CS10);

  // Den Endwert (TOP) für den Zähler setzen
   // Der Zähler zählt bis zu diesem Wert
  // Hier kann man unter anderem die Frequenz der PWM einstellen
    ICR1 = 0x0080;

  // 0x0080 ist eine Abstufung mit 128 Stufen.
  // Problem: Wenn wir einen Motor mir PWM ansteuern vibrieren
  // seine Teile automatisch in der Frequenz mit.
  // Also legen wir diese in den nicht hörbaren Bereich.
  // 4MHz / 128 = 31250 Hz

}

int main()
{
  // 16bit Variable
    uint16_t buffer;

  // Timer für PWM initialisieren
  timer_init();

    // A/D - Wandler initialisieren
    adc_init();

  // OCR1A ist der Compare Wert
  // Wenn der Zähler diesen Wert erreicht, wird mit
  // obiger Konfiguration der OC1A Ausgang abgeschaltet
  // Sobald der Zähler wieder bei 0 startet, wird der
  // Ausgang wieder auf 1 gesetzt
  //
  // Durch Verändern dieses Wertes, werden die unterschiedlichen
  // PWM Werte eingestellt.

   // Startwert = 0. Wird in der while-Schleife gesetzt.
    OCR1A = 0x0000;


  while( 1 )
  {
  // Wandlung vom analogen Eingang starten
        ADCSRA |= (1<<ADSC);

        // Warten bis die AD-Wandlung abgeschloßen ist
        while ( !(ADCSRA & (1<<ADIF)) )
          ;

        // AD-Wert auslesen.
        // ADCH muss als zweites gelesen werden, da nachdem ADCL gelesen 
wurde
        // das ADC-Register gesperrt ist bis ADCH auch ausgelesen wurde.
        // buffer = ADCL | (ADCH<<8);

        // Oder einfacher.
        buffer = ADC;

  // Da die PWM eine Auflösung von 8bit hat aber der buffer 10bit gross 
ist
  // müssen wir noch transformieren

  OCR1A = (buffer>>3);
   }
}

die Warnmeldungen:alles mit einem gelben punkt versehen
../mcu.h:430:1: warning: "/*" within comment
../mcu.h:461:1: warning: "PC7" redefined
In file included from 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/io.h:408, 
from ../PWMAT90PWM3B.c:1:
c:/winavr-20100110/lib/gcc/../../avr/include/avr/portpins.h:202:1: 
warning: this is the location of the previous definition
../mcu.h:462:1: warning: "PC6" redefined
.
.
.
.
.
.
.
.
c:/winavr-20100110/lib/gcc/../../avr/include/avr/sfr_defs.h:234:1: 
warning: this is the location of the previous definition

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.