Hallo Apfeldieb,
hier mal ein Code für einen Atmega32:
Code:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
/*------------------------------------------------------------------------------------------------*/
volatile unsigned char buffer;
int i,a;
/*------------------------------------------------------------------------------------------------*/
void uart_init(void);
void port(void);
void Motor (void);
/*------------------------------------------------------------------------------------------------*/
/*------------------------------------------------------------------------------------------------*/
int main(void)
{
port();
uart_init();
while (1){
Motor();
}
}
/*------------------------------------------------------------------------------------------------*/
/*------------------------------------------------------------------------------------------------*/
void uart_init(void)
{
/* Baudrate: 115200*/
UBRRH = 0;
UBRRL = 7;
UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
}
/*------------------------------------------------------------------------------------------------*/
/* Interrupt wird ausgelöst sobald neue Daten im USART-Empfangspuffer liegen */
SIGNAL(SIG_UART_RECV)
{
buffer = UDR;
}
/*------------------------------------------------------------------------------------------------*/
void port(void)
{
DDRD =0x30;
DDRB =0x17;
}
/*------------------------------------------------------------------------------------------------*/
void Motor (void)
{
while(1){
sei();
/*-----3600------*/
if (buffer=='1') {
buffer =0;
PORTD =0x30;
TCCR1A = 0xA1;
TCCR1B = 0x02;
PORTB =0x11;
for (i=0;i<255;i++)
{
OCR1A =i++;
OCR1B =i++;
for (a=0;a<11;a++){
_delay_ms (10);}
}
OCR1A =0;
OCR1B =0;
for (a=0;a<100;a++){
_delay_ms (10);}
OCR1A =255;
OCR1B =255;
for (a=0;a<100;a++){
_delay_ms (10);}
OCR1A =0;
OCR1B =0;
}
/*-----7200------*/
if (buffer=='2'){
buffer =0;
PORTD =0x30;
TCCR1A = 0xA3;
TCCR1B = 0x01;
PORTB =0x11;
for (i=0;i<1023;i++)
{
OCR1A =i++;
OCR1B =i++;
for (a=0;a<3;a++){
_delay_ms (10);}
}
OCR1A =0;
OCR1B =0;
for (a=0;a<100;a++){
_delay_ms (10);}
OCR1A =1023;
OCR1B =1023;
for (a=0;a<100;a++){
_delay_ms (10);}
OCR1A =0;
OCR1B =0;
}
/*-----14400------*/
if (buffer=='3') {
buffer =0;
PORTD =0x30;
TCCR1A = 0xA2;
TCCR1B = 0x01;
PORTB =0x11;
for (i=0;i<511;i++)
{
OCR1A =i++;
OCR1B =i++;
for (a=0;a<6;a++){
_delay_ms (10);}
}
OCR1A =0;
OCR1B =0;
for (a=0;a<100;a++){
_delay_ms (10);}
OCR1A =511;
OCR1B =511;
for (a=0;a<100;a++){
_delay_ms (10);}
OCR1A =0;
OCR1B =0;
}
/*-----28800------*/
if (buffer=='4') {
buffer =0;
PORTD =0x30;
TCCR1A = 0xA1;
TCCR1B = 0x01;
PORTB =0x11;
for (i=0;i<255;i++)
{
OCR1A =i++;
OCR1B =i++;
for (a=0;a<11;a++){
_delay_ms (10);}
}
OCR1A =0;
OCR1B =0;
for (a=0;a<100;a++){
_delay_ms (10);}
OCR1A =255;
OCR1B =255;
for (a=0;a<100;a++){
_delay_ms (10);}
OCR1A =0;
OCR1B =0;
}
}
}
Dabei werden bei untersch. PWM-Frequenzen die OCR1 Werte in einer for-Schleife hochgezählt, danach auf null gesetzt und nochmal kurz auf volldampf.
War mal für ein Motortest.
Die Interrupt-Sache habe ich selbst nur aus dem Netz zurecht gestückelt, das andere mit Hilfe des Forums und des Datenblattes.
Hier noch eine kleine Übersicht über die Frequenzeinstellung.
http://www.deviantart.com/deviation/49689249/
Gruß
Stefan
Lesezeichen