... öhm wo in main() rufst DU denn die Funktion timer1_init() auf ?
Oder anders ausgedrückt, eine Funktion INIT() dient als separate Funktion nur der Übersicht und ist Bestandteil von main() bevor dieses sich in eine Endlosschleife begibt ....
Sauber geschrieben sollte das so aussehen - ich hab nur den Code etwas lesbarer gemacht und INIT() plaziert ... ich empfehlen "meine Ebenenstruktur" zu nutzen - also deutlich Einrücken und Leerzeichen zw. Anweisungen plazieren --- Funktional habe ich den Code nicht geprüf!:
Code:
#include <avr/io.h>
#include <stdbool.h>
#include <stdlib.h>
#include <avr/io.h>
#include <AVR/iom8.h>
#include <inttypes.h>
#include <util/delay.h>
#define F_CPU 12000000 // clock
// Timer1 initialisieren
void INIT(void)
{
// Portdefinitionen
DDRB = 0 | ( 1 << PB1 ); // Pin PB0 als Ausgang für Servo
DDRD &=~ (1<<PD2); // Pin D2 als Eingang
PORTD = 0 | (1<<PD2); // Pull Up von PIN D2 aktivieren
// timer1
// initalize mega8 Timer1 with 9Bit, inverted, Prescaler 256
TCCR1A |= (1 << WGM11 ) | ( 1 << COM1A1 ) | ( 1 << COM1A0 );
// this gives us a signal with 21.76ms at 12MHz
TCCR1B = (1 << CS12);
// pulse of 1.5ms 512- 1500*(F_CPU/256/1000000)/2
OCR1A = 476;
// Hier wieder der PWM auf mittelstellung gebracht oder? <= wie meinen
}
int main(void)
{
INIT();
unsigned char i; // Variable i [echt :-) ]
for(;;)
{
// mache was wenn PinD2 low ist
if (!( PIND & (1<<PIND2)))
{
if(OCR1A > 452)
{
OCR1A--; //Pulsbreite verkürzen
}
}
else
{
OCR1A = 476;
}
for(i = 0; i < 50; i++)
_delay_ms(10); // bei 16 MHz maximal 16 ms möglich !
}
}
Lesezeichen