Forum: Mikrocontroller und Digitale Elektronik TIMER1 löst kein interrupt aus


von Marco M. (marco1987)


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

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Marco Müeller wrote:
> Kann mir jemand sagen warum die leds ncht blinken an portD mit atmega8
> hat das funktioniert

Und was benuzt du nun? Außerdem delay in ner Timer ISR --> BÖSE !!!

von Marco M. (marco1987)


Lesenswert?

Wie was benutze ich ?
Naja wie soll ich denn sonst 20 sekunden zyklen hinbekommen?

von Stefan E. (sternst)


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?

von Marco M. (marco1987)


Lesenswert?

Und wie mache ich das mit jedem 10ten interrupt?
sry bin neuling

von Stefan E. (sternst)


Lesenswert?

1
ISR (...) {
2
3
  static unsigned char count = 0;
4
5
  count++;
6
  if (count >= 10) {      // bei jedem 10. Int
7
      count = 0;
8
      PORTD ^= (1<<PD0);  // LED an PD0 toggeln
9
  }
10
}

von 3355 (Gast)


Lesenswert?

Einen Zaehler in Software runterzahlen beispielsweise. Jeden Timertick 
eins subtrahieren.

von Marco M. (marco1987)


Lesenswert?

in maun oder in dem interrupt?

erzählt doch mal bitte

von Stefan E. (sternst)


Lesenswert?

Im Interrupt. Ich habe dir den Code doch schon hingeschrieben.

von Marco M. (marco1987)


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)
  {
  }
}

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Wen nes auf dem meag8 lief wo läuft es denn jezt NICHT?

von Stefan E. (sternst)


Lesenswert?

Oder direkter gefragt:  ;-)
Für welchen µController soll es denn überhaupt sein?

PS: Du konfigurierst den Timer für den PWM-Modus. Ist das Absicht?

von Marco M. (marco1987)


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

von Marco M. (marco1987)


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

von Marco M. (marco1987)


Lesenswert?

keine ideen mehr?

von Andreas K. (a-k)


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.

von Marco M. (marco1987)


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.
:-(

von Andreas K. (a-k)


Lesenswert?

Marco Müeller wrote:

> habe F_CPU mit 16 Mhz definiert

Wo?

von Andreas K. (a-k)


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.

von Andreas K. (a-k)


Lesenswert?

Wenn man das Studio verwendet, definiert man F_CPU in den 
Projekteigenschaften (Project - Configuration Options - Frequency).

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Außerdem muss doch in die main am ende noch ein return 0; oder sowas 
hin???

von Andreas K. (a-k)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.