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:
Anmerkung: Das Programm entstammt komplett radbruchs Feder (meinen Danke noch einmal an dieser Stelle).Code:#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); }
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!







Zitieren
Lesezeichen