stormracer
23.01.2008, 16:35
Moin,
ich lese mich schon seit drei Tagen hier durchs Forum, finde aber meinen Fehler nicht.
Ich versuche ein Soft-PWM mit dem Timer2 zu programmieren. Timer1 ist schon belegt. Ist für eine Servo Ansteuerung.
Der Quelltext ist kaum verändert aus dem RN-Wissen Servo (https://www.roboternetz.de/wissen/index.php/Servo) Beispiel, nur leider wird die ISR nie aufgerufen.
Habe mittlerweile keine Ahnung mehr, was ihm noch fehlt. Ist ein ATMega32 und ich programmiere unter Linux, deswegen kann ich dann Quelltext nicht simulieren.
#include <avr/io.h>
#include <avr/interrupt.h>
#include "../uart.h"
#define F_CPU 16000000
#define SERVOPIN 3
#define SERVOPORT PORTB
#define DDRSERVO DDRB
volatile unsigned char servopos;
volatile unsigned int count=0;
void delay_ms(unsigned int ms);
void servo_init();
ISR(TIMER2_COMP_vect)
{
PORTC=~0x0f;
delay_ms(10);
PORTC=~0x00;
}
int main (void)
{
init_USART();
servo_init();
sendUSART("Hallo\r\n");
DDRC=0xff;
int n=0;
char buffer[5];
while(1)
{
PORTC=~0x01;
for(n=0; n<150; n++)
{
servopos=100;
// delay_ms(100);
sendUSART("run\r");
itoa(count,buffer,10);
sendUSART(buffer);
}
}
return 0;
}
void servo_init()
{
TIMSK |= (1<<TOIE2);
TCCR2 = (1<<WGM21) | (1<<CS20); //Prescale=1, CTC mode
OCR2 = F_CPU/1600000; //alle 10µS ein IRQ
DDRSERVO|=(1<<SERVOPIN);
sei();
}
void delay_ms(unsigned int ms)
{
unsigned int zaehler;
while (ms)
{
zaehler = F_CPU / 5000;
while (zaehler) {
asm volatile("nop");
zaehler--;
}
ms--;
}
}
Habe das RN-Control an Port C sind LEDs, testweise habe ich einfach das LED Blinken mit in die ISR gepackt. Die Text Ausgabe über UART fliegt auch wieder raus, wenn#s funktioniert.
Danke
ich lese mich schon seit drei Tagen hier durchs Forum, finde aber meinen Fehler nicht.
Ich versuche ein Soft-PWM mit dem Timer2 zu programmieren. Timer1 ist schon belegt. Ist für eine Servo Ansteuerung.
Der Quelltext ist kaum verändert aus dem RN-Wissen Servo (https://www.roboternetz.de/wissen/index.php/Servo) Beispiel, nur leider wird die ISR nie aufgerufen.
Habe mittlerweile keine Ahnung mehr, was ihm noch fehlt. Ist ein ATMega32 und ich programmiere unter Linux, deswegen kann ich dann Quelltext nicht simulieren.
#include <avr/io.h>
#include <avr/interrupt.h>
#include "../uart.h"
#define F_CPU 16000000
#define SERVOPIN 3
#define SERVOPORT PORTB
#define DDRSERVO DDRB
volatile unsigned char servopos;
volatile unsigned int count=0;
void delay_ms(unsigned int ms);
void servo_init();
ISR(TIMER2_COMP_vect)
{
PORTC=~0x0f;
delay_ms(10);
PORTC=~0x00;
}
int main (void)
{
init_USART();
servo_init();
sendUSART("Hallo\r\n");
DDRC=0xff;
int n=0;
char buffer[5];
while(1)
{
PORTC=~0x01;
for(n=0; n<150; n++)
{
servopos=100;
// delay_ms(100);
sendUSART("run\r");
itoa(count,buffer,10);
sendUSART(buffer);
}
}
return 0;
}
void servo_init()
{
TIMSK |= (1<<TOIE2);
TCCR2 = (1<<WGM21) | (1<<CS20); //Prescale=1, CTC mode
OCR2 = F_CPU/1600000; //alle 10µS ein IRQ
DDRSERVO|=(1<<SERVOPIN);
sei();
}
void delay_ms(unsigned int ms)
{
unsigned int zaehler;
while (ms)
{
zaehler = F_CPU / 5000;
while (zaehler) {
asm volatile("nop");
zaehler--;
}
ms--;
}
}
Habe das RN-Control an Port C sind LEDs, testweise habe ich einfach das LED Blinken mit in die ISR gepackt. Die Text Ausgabe über UART fliegt auch wieder raus, wenn#s funktioniert.
Danke