Danke. Weil der Originalplan aber nicht so ohne Weiteres runterladbar ist, weis ich nicht, ob Du ihn so ohne Weiteres hochladen darfst ???
Sieht jedenfalls nicht so aus, als wenn da noch was in HW eingestellt werden müßte. Weis 'nu nix mehr :(
Druckbare Version
Danke. Weil der Originalplan aber nicht so ohne Weiteres runterladbar ist, weis ich nicht, ob Du ihn so ohne Weiteres hochladen darfst ???
Sieht jedenfalls nicht so aus, als wenn da noch was in HW eingestellt werden müßte. Weis 'nu nix mehr :(
kann das sein das mein Quarz kaputt ist? Und der deswegen einfach keinen takt bekommt? Dann dürfte ich ja eigentlich gefahrlos den Text der internen uhr auf 8MHz drehen können beim (letzten) ATMega16 der mir noch bleibt... und wenn der dann auch nicht mehr reagiert dann mache ich mir Gedanken... ich müsste das doch eigentlich relativ gut verändern können ohne gleich Gefahr zu laufen alles zu zerschießen oder? Ach ja als Software auf meinem PC nutze ich Übrigends AVR-Studio 4 fals das Hilft.
- - - Aktualisiert - - -
Falls jemandem dazu noch was einfällt... ich habe jetzt bei meinem letzten AVR die Interne Uhr auch auf 8MHz gestellt. Seit dem Reagiert dieser auch nicht mehr. Was mache ich da bitte falsch?
Dann fused du falsch. Mach mal bitte einen Screenshot wie du deine Fuses eingestellt hast. Ich habe kein AVR Studio.
Zu dem Interrupt:
Im fast PWM Mode mit ICR1 als Top (Mode 14) wird bei Erreichen des Top Wertes, also ICR1 nicht der Timer Overflow Interrupt ausgelöst, sondern der Input Capture Interrupt. Dazu muß der aber im TIMSK Register mit dem TICIE1 Bit freigegeben werde.
Außerdem müssen die Interrupts global freigegeben werden. Das geht in C mit "sei"; glaub ich.
Der Name der ISR muß auch dem Input Capture Interrupt entsprechen. Und ist mir nicht klar aber sollten Variable in der ISR sollen nicht volatile sein ???
Ich kann dir nur sagen, wie ich das gelöst habe. Eigentlich sollen sie volatile sein, aber ich weiss nicht warum und es funktioniert auch so.
Code:byte state = 1;
int pwm_hi = 0;
int pwm_lo = 0;
int led_w = 13;
int servo_1 = 12;
int servo_1_pos = 150;
int servo_state = 0;
int n = 0;
void setup(){
pinMode(led_w, OUTPUT);
pinMode(servo_1, OUTPUT);
setup_timer1();
}
void loop()
{
if(servo_state == 0)
{
delay(20);
servo_1_pos = servo_1_pos + 1;
if(servo_1_pos ==200)
{
servo_state = 1;
}
}
if(servo_state == 1)
{
delay(20);
servo_1_pos = servo_1_pos - 1;
if(servo_1_pos ==100)
{
servo_state = 0;
}
}
}
void setup_timer1(){
cli(); // disable interrupts
TCCR1A = 0; // Register TCCR1A auf 0 setzen
TCCR1B = 0; // Register TCCR1B auf 0 setzen um Timer zu beenden
//CTC setzen
OCR1A = 19; // bis 15624 ticken dann interrupt
//enable CTC
TCCR1B |= (1 << WGM12);
// Set CS10 bit so timer runs at clock speed:
//Timerresolution: 1/(16*10^6 / 1024)
TCCR1B |= (0 << CS10);
TCCR1B |= (1 << CS11);
TCCR1B |= (0 << CS12); // prescaler 1024
// enable Timer1 compare interrupt
TIMSK1 |= (1 << OCIE1A);
// enable global interrupts:
sei();
}
ISR(TIMER1_COMPA_vect)
{
if (n == 20000)
{
digitalWrite(led_w, !digitalRead(led_w));
n = 0;
}
n++;
if (pwm_hi > 0)
{
digitalWrite(servo_1,HIGH);
pwm_hi = pwm_hi - 1;
pwm_lo = 0;
}
else if(pwm_hi == 0)
{
pwm_lo++;
digitalWrite(servo_1,LOW);
}
if (pwm_lo == 2000 - servo_1_pos)
{
pwm_hi = servo_1_pos;
}
}