erik1563
01.09.2011, 13:26
Moin Moin!
Bei folgendem Projekt könnte ich eure Hilfe gut gebrauchen: Ich versuche mit Hilfe eines Atmel Tiny13V einen Drehzahlcontroller für einen kleinen Dieselmotor zu bauen. Dazu muss der Atmel einen Servo ansteuern können, der später fürs Gasgeben zuständig ist.
Bisher sieht das Programm so aus:
#include <avr/io.h>#include <avr/interrupt.h>
//#define f_cpu 9,6 MHz // ???
uint8_t y;
volatile uint16_t count, time;
void delay(uint16_t d) // Warteschleife 1/50 Sekunde
{
time=d+1; while(time);
}
unsigned char z;
ISR(TIM0_COMPA_vect) // Servoansteuerung
{
if (count>y) PORTB &= ~(1<<PB4); else PORTB |= (1<<PB4);
if (count < 500) count++; else { count=0; if(time) time--; }
}
int main(void)
{
PORTB |= (1<<PB1);
DDRB = (1<<PB4)|(1<<PB1); // Servoausgang
TCCR0A = (0 << WGM00) | (1 << WGM01); // CTC-Mode
TCCR0A |= (0 << COM0A0) | (0 << COM0A1); // ohne OCR-Pin
TCCR0B = (0 << CS02) | (0 << CS01) | (1 << CS00); // prescaler /8
TIMSK0 = (1 << OCIE0A); // Interrupt ein
OCR0A = 12; // 100kHz 9600000/(8*12)
sei();
// y=150; //wieso kann ich y nur hier setzen?
while(1){
y=150; // und nicht hier?
}
return(0);
}
Anmerkung: Das Programm entstammt komplett radbruchs Feder (meinen Danke noch einmal an dieser Stelle).
Der Servo hängt am PB4, mit der Variable y setzt man die Servoposition.
Meine Frage ist nun: Warum kann ich y nur ausserhalb der while(1)-Schleife setzten?
Setze ich y in while(1) fährt der Servo einfach nach ganz links. (Je höher die y-Werte desto weiter "rechts" steht der Servo.)
Da ich mich erst nen knappen Monat mit µC beschäftige bin ich mit meinem Latein am Ende...
Vielen Dank schonmal für eure Hilfe!
Bei folgendem Projekt könnte ich eure Hilfe gut gebrauchen: Ich versuche mit Hilfe eines Atmel Tiny13V einen Drehzahlcontroller für einen kleinen Dieselmotor zu bauen. Dazu muss der Atmel einen Servo ansteuern können, der später fürs Gasgeben zuständig ist.
Bisher sieht das Programm so aus:
#include <avr/io.h>#include <avr/interrupt.h>
//#define f_cpu 9,6 MHz // ???
uint8_t y;
volatile uint16_t count, time;
void delay(uint16_t d) // Warteschleife 1/50 Sekunde
{
time=d+1; while(time);
}
unsigned char z;
ISR(TIM0_COMPA_vect) // Servoansteuerung
{
if (count>y) PORTB &= ~(1<<PB4); else PORTB |= (1<<PB4);
if (count < 500) count++; else { count=0; if(time) time--; }
}
int main(void)
{
PORTB |= (1<<PB1);
DDRB = (1<<PB4)|(1<<PB1); // Servoausgang
TCCR0A = (0 << WGM00) | (1 << WGM01); // CTC-Mode
TCCR0A |= (0 << COM0A0) | (0 << COM0A1); // ohne OCR-Pin
TCCR0B = (0 << CS02) | (0 << CS01) | (1 << CS00); // prescaler /8
TIMSK0 = (1 << OCIE0A); // Interrupt ein
OCR0A = 12; // 100kHz 9600000/(8*12)
sei();
// y=150; //wieso kann ich y nur hier setzen?
while(1){
y=150; // und nicht hier?
}
return(0);
}
Anmerkung: Das Programm entstammt komplett radbruchs Feder (meinen Danke noch einmal an dieser Stelle).
Der Servo hängt am PB4, mit der Variable y setzt man die Servoposition.
Meine Frage ist nun: Warum kann ich y nur ausserhalb der while(1)-Schleife setzten?
Setze ich y in while(1) fährt der Servo einfach nach ganz links. (Je höher die y-Werte desto weiter "rechts" steht der Servo.)
Da ich mich erst nen knappen Monat mit µC beschäftige bin ich mit meinem Latein am Ende...
Vielen Dank schonmal für eure Hilfe!