TIMER1 löst kein interrupt aus

#876836
Lesenswert?

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/delay.h>

int i;
 int j;
 int k=0;


ISR(TIMER1_COMPA_vect) // ISR für Takterzeugung
{



 PORTD=(0<<PD0);  //1





for (i=1; i<=175; i++){   //erste low phase 10s
 _delay_ms(200);}

 PORTD=(1<<PD0); //1


for (i=1; i<=370; i++){    //breite bzw länge bestimmen der high phase 
!!! von port B  20s
 _delay_ms(200);}


 PORTD=(0<<PD0); //1


TCNT1=0;
}



int main(void)
{

DDRD = 0xFF;

TCCR1B = TCCR1B & ~(1 << WGM13);
TCCR1B = TCCR1B | (1 << CS10);
TCCR1B = TCCR1B | (1 << CS12);
TCCR1A = TCCR1A | (1 << WGM10);
TCCR1A = TCCR1A | (1<< WGM11);
TCCR1A = TCCR1A | (1 << COM1A1);
TCCR1A = TCCR1A | (0 << COM1A0);
OCR1A = 400;

//Interrupts aktivieren
TIMSK = TIMSK | (1 << OCIE1A);
sei();

while(1)
  {
  }
}

Kann mir jemand sagen warum die leds ncht blinken an portD mit atmega8 
hat das funktioniert
#876859
Lesenswert?

Mal davon abgesehen, dass das
1
for (i=1; i<=175; i++){   //erste low phase 10s
2
 _delay_ms(200);}
keine 10s sind, sondern ca 35s, macht man das, indem man den Timer z.B. 
auf 1s konfiguriert, und dann nur bei jedem 10. Interrupt die LED 
toggelt.
Wozu sollte der Interrupt denn sonst überhaupt gut sein, wenn du 
versuchst das Timing dann doch wieder mit Delays zu machen?
#876948
Lesenswert?

Oh sry das hatte ich überlesen.Vielen dank. Wenn ich das richtig 
verstanden habe soll jetzt die LED an port D0 toggeln...

Leider tut sich gar nichts mit dem code:


#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/delay.h>

int i;
 int j;
 int k=0;

ISR (TIMER1_COMPA_vect) {

  static unsigned char count = 0;

  count++;
  if (count >= 10) {      // bei jedem 10. Int
      count = 0;
      PORTD ^= (1<<PD0);  // LED an PD0 toggeln
  }
}





int main(void)
{


DDRD = 0xFF;
DDRB = 0xFF;

TCCR1B = TCCR1B & ~(1 << WGM13);
TCCR1B = TCCR1B | (1 << CS10);
TCCR1B = TCCR1B | (1 << CS12);
TCCR1A = TCCR1A | (1 << WGM10);
TCCR1A = TCCR1A | (1<< WGM11);
TCCR1A = TCCR1A | (1 << COM1A1);
TCCR1A = TCCR1A | (0 << COM1A0);
OCR1A = 400;

//Interrupts aktivieren
TIMSK = TIMSK | (1 << OCIE1A);
sei();

while(1)
  {
  }
}
#877009
Lesenswert?

Ja das ist absicht soll für den atmega16 pu sein, das komische ist ich 
habe es auf einem anderen stk500 versucht mit gleichem controller da 
hattes wunderbar funktioniert, jetzt habe ich mein stk genommen ging 
davon aus das es auch geht aber leider ja nicht.... daher eher vllt ein 
softversionsproblem von avr studio oder so?

ein defekt von µC u STK kann ich ausschließen da andere programme laufen
bitte um weitere ideen...

danke
#877036
Lesenswert?

Ich kann euch ja noch meine warnings zeigen, die ich bekomme,  vllt 
bringt das euch was:



C:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h:1 
21:3:  warning: #warning "F_CPU not defined for <avr/delay.h>"
../timersamstag.c:9: warning: return type defaults to `int'
../timersamstag.c: In function `ISR':
../timersamstag.c:18: warning: control reaches end of non-void function
#877268
Lesenswert?

Doch. Aus den Meldungen geht klar hervor, dass deine ISR aus irgendeinem 
Grund nicht als ISR erkannt wird. Also das Makro ISR nicht bekannt ist. 
Denn sonst hiesse die Funktion in der Meldung nicht "ISR". 
Beispielsweise weil du einen steinalten Compiler verwendest, der ISR() 
nicht nicht kennt, oder weil noch Reste eine solchen auf der Kiste 
rumliegen.

Übrigens werden deine Delays garantiert solange nicht funktionieren, bis 
du F_CPU definierst.

Übrigens: Wer Warnungen trotz aufgetretener Probleme ignoriert und sie 
nicht einmal in einem solchen Forenbeitrag gleich mit erwähnt, der 
gehört mal ordentlich über's Knie gelegt.
#877299
Lesenswert?

^^ oke dann werde ich mich mal übers knie legen lassen also als compiler 
benutze ich avr studio 4.14 also ziemlich neu.....

ja frequenz nimmer er nicht an. würdest du alles komplett löschen vom 
rechner und alles nochmal neu machen damit mal keine "reste " mehr hat?

habe F_CPU mit 16 Mhz definiert aber gleiche fehlermeldung.
:-(
#877301
Lesenswert?

Marco Müeller wrote:

> ^^ oke dann werde ich mich mal übers knie legen lassen also als compiler
> benutze ich avr studio 4.14 also ziemlich neu.....

Im Studio ist kein Compiler drin, nur ein Assembler. Den Compiler gibt's 
separat als WinAVR, der allerdings wenn installiert vom Studio verwendet 
wird.

Wenn beim WinAVR etwas Durcheinander herrschen sollte, dann kannst du 
mal alle WinAVRs, die sich auf der Platte befinden, deinstallieren. Dann 
deren Restbestände dann manuell löschen. Und dann die gewünschte Version 
neu installieren.
#877389
Lesenswert?

Hier nicht, weil nicht erreichbar. Es ist die Funktion "ISR" in 
Steinzeit-Syntax, die ohne return aufhört. Und weil kein Typ angegeben 
ist, wird int angenommen. So steht es ja auch in den Warnungen. Und weil 
das alles ziemlich normal aussieht, nur halt steinzeitliches pre-ANSI 
ist, gibt das nur Warnungen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren