1.7 Umsetzung des Basiskonzepts
|
#include<avr/io.h>
using namespace std;
#include "RS232.h"
#include "PinWatchdog.h"
#include "PWMtimer1.h"
#define TAKTFREQUENZ 9216000
#define BAUDRATE 115200
int main(void)
{
RS232 rs232(TAKTFREQUENZ,BAUDRATE);
PinWatchdog pindog(&rs232);
// PWMtimer1 pwm1(0,0);
PWMtimer1 pwm1(&rs232,&pindog);
pwm1.start();
unsigned char akku = 0;
unsigned long int pause;
while(true)
{
pwm1.setzePulsbreitePin18(akku);
akku++;
for(pause=0;pause<10000;pause++);
}
return 0;
}
Code 1.7-1: Hauptprogramm muecb.c
class PWMtimer1
{
private:
RS232* rs232;
PinWatchdog* pindog;
public:
PWMtimer1(RS232* rs232, PinWatchdog* pindog)
{
this->rs232 = rs232;
this->pindog = pindog;
//Nachricht an PC senden
if(rs232!=0)
{
rs232->sendeText("\n\rInstanz der Klasse *PWMtimer1* gebildet\n\r");
rs232->sendeText("\n\r***** PWM Timer 1 *****\n\r");
rs232->sendeText("AVR-Konfiguration fuer ATmega32:\n\r");
rs232->sendeText("Betroffene Pins: 18 (PD4/OC1B) 19 (PD5/OC1A) \n\r");
rs232->sendeText("Betroffene Register: TCCR1A TCCR1B\n\r");
rs232->sendeText("Bezeichnung: Timer1 auf 8 Bit Phase Correct PWM-Mode mit Taktteilung 1\n\r");
rs232->sendeText("Pulsbreite Pin 18 und 19 kann getrennt eingestellt werden.\n\r");
rs232->sendeText("Methoden:\n\r");
rs232->sendeText("setzePulsbreitePin18(unsigned char) \n\r");
rs232->sendeText("setzePulsbreitePin19(unsigned char) \n\r");
}
}
void setzePulsbreitePin18(unsigned char breite)
{
OCR1B = breite;
}
void setzePulsbreitePin19(unsigned char breite)
{
OCR1A = breite;
}
void start()
{
if(rs232!=0)
{
rs232->sendeText("\n\rSTART ***** PWMtimer1 ***** \n\r");
}
//merken, welche Pins benutzt werden
if(pindog!=0)
{
pindog->sperrePin(18);
pindog->sperrePin(19);
}
//TCC1A
//Bit: 7 6 5 4
//Bez.: COM1A1, COM1A0, COM1B1, COM1B0
//legt PWM-Mode fest
//Bit: 3 2
//Bez.: FOC1A FOC1B
//müssen 0 sein in PWM-Mode
//Bit: 1 0
//Bez.: WGM11 WGM10
//für 8-Bit phasen korrektem PWM:
//Bel.: 0 1
TCCR1A = 0b10100001;
//Bit: 2 1 0
//Bez.: CS12 CS11 CS10
//Teilung des Taktes: 001 /1 010 /8 011 /64 100 /256
//Bel.: 0 1 1
TCCR1B = 0b00000001;
DDRD |= (1<<PD4) | (1<<PD5); //auf Ausgang setzen.
OCR1B = 0;
OCR1A = 0;
}
void stop()
{
if(rs232!=0)
{
rs232->sendeText("\n\rSTOP ***** PWMtimer1 ***** \n\r");
}
//Pins wieder freigeben
if(pindog!=0)
{
pindog->entsperrePin(18);
pindog->entsperrePin(19);
}
TCCR1A = 0b00000000;
TCCR1B = 0b00000000;
PORTD &= 255 - ((1<<PD4) | (1<<PD5)); //sicherheitshalber auf Low setzen.
}
};
Code 1.7-2: Klasse PWMtimer1 in File PWMtimer1.h
Bild 1.7-1: Klasse RS232 in File RS232.h als UML-Klassendiagramm.
Bild 1.7-1: Klasse PinWatchdog in File PinWatchdog.h als UML-Klassendiagramm.
Download des gesamten Beispielprojekts
test1_sensor_und_rs232.zip: Neues Projekt mit AD-Wandler und Ausgabe auf RS232 über muecA (nicht Basiskonzept-Kompatibel)
test2_pwmmotor_und_rs232muecA.zip: Neues Projekt mit PWM-Signalen über Timer1, Motoransteuerung und Ausgabe auf RS232 über muecB, Basiskonzept-Kompatibel!