PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PWM mit Atmega8



206racer
11.03.2008, 21:17
Hallo,

ich bin Neuling auf dem Gebiet der Mikrocontroller. Ich habe mir ein myavr Baord mit einem Atmega8 gekauft. Nun möchte ich ein PWM erzeugen. Also Lampe an/aus hat prima geklappt, nur bekomme ich das PWM-Signal einfach nicht hin.
Ich habe mich jetzt knapp 3 Stunden eingelesen und rumprobiert, in Foren gesucht, aber nichts verwertbares gefunden.

Ich programmiere mit Codevision in C. Mit Assembler hab ich nix am Hut. Das gleich vorneweg :)

Ich habe mir nun mit dem Wizzard einen Code erzeugen lassen, welcher sich auch kompilieren lässt, nur leider tut sich nichts.



/************************************************** ***
This program was produced by the
CodeWizardAVR V1.25.5 Evaluation
Automatic Program Generator
© Copyright 1998-2007 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date : 11.03.2008
Author : Freeware, for evaluation and non-commercial use only
Company :
Comments:


Chip type : ATmega8L
Program type : Application
Clock frequency : 3,686400 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 256
************************************************** ***/

#include <mega8.h>
#include <io.h>

// Timer 2 overflow interrupt service routine
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
// Place your code here

}

// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=Out Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=0 State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x08;


// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: 3686,400 kHz
// Mode: Fast PWM top=FFh
// OC2 output: Non-Inverted PWM
ASSR=0x00;
TCCR2=0x69;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x40;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// Global enable interrupts
#asm("sei")

while (1)
{
// Place your code here

};
}



Wo liegt hier mein Problem? Bisher habe ich nur Beispiele für andere Controller gefunden. Wenn ich die einfach einfüge geht das kompilieren logischerweise nicht.
Ich hoffe mir kann jemand sagen was ich wo einfügen muss, dass ich meine LED dimmen kann.
Später möchte ich dann ein Servo anschließen und das dann mit dem Poti nach links/rechts fahren lassen. Aber erstmal klein anfangen ;)


Vielen Dank
Gruß Andreas

radbruch
11.03.2008, 22:04
Hallo Andreas,

willkommen im RN-Forum.

Wenn du unbedingt PWM mit diesem Programm verwenden willst, müssen wir leider alle deine Parametrierungen überprüfen, was ziemlich aufwändig ist, weil dein Programmgenerator nicht die hier sonst üblichen bitweisen Registerwerte erzeugt sondern die Bytes als ganzes. Man müsste also alles "aufbröseln" und das dauert. Wenn du's aber eilig hast, dann klicke mal auf das Wort Servo hier im Beitrag und schau dir das Beispielprogramm im RN-Wissen an...

Ich spiele seit einigen Monaten mit verschiedenen AVRs und Servos und habe meine Servos mit Zählschleifen, Verzögerungen oder Interrupts bewegt. PWM habe ich dazu noch nicht verwendet. Das hat zwei wesentliche Gründe: Jedes Servo belegt dabei einen Timer und man muss die PWM-Pins verwenden.

Gruß

mic

zerush
11.03.2008, 23:38
Hi, was soll dein PWM Signal denn für einen Wert liefern?
Da du OCR2 = 0 setzt, wirst du immer LOW am Ausgang haben.

Schreib einfach mal OCR2 = 0x80;

Dann sollte eine LED gedimmt leuchten.

mfg
zerush

Edit: Für Servos ist diese Art von PWM Signal übrigens ungeeignet, da solltest du lieber Software PWM realisieren.. Außerdem hast du dann, wie mein Vorredner bereits erwähnte, freie Pinwahl.