www.mikrocontroller.net

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


Autor: Marco M. (marco1987)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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 !!!

Autor: Marco M. (marco1987)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie was benutze ich ?
Naja wie soll ich denn sonst 20 sekunden zyklen hinbekommen?

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mal davon abgesehen, dass das
for (i=1; i<=175; i++){   //erste low phase 10s
 _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?

Autor: Marco M. (marco1987)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und wie mache ich das mit jedem 10ten interrupt?
sry bin neuling

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ISR (...) {

  static unsigned char count = 0;

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

Autor: 3355 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Einen Zaehler in Software runterzahlen beispielsweise. Jeden Timertick 
eins subtrahieren.

Autor: Marco M. (marco1987)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
in maun oder in dem interrupt?

erzählt doch mal bitte

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Im Interrupt. Ich habe dir den Code doch schon hingeschrieben.

Autor: Marco M. (marco1987)
Datum:

Bewertung
0 lesenswert
nicht 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)
  {
  }
}

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wen nes auf dem meag8 lief wo läuft es denn jezt NICHT?

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Marco M. (marco1987)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Marco M. (marco1987)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Marco M. (marco1987)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
keine ideen mehr?

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Marco M. (marco1987)
Datum:

Bewertung
0 lesenswert
nicht 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.
:-(

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Marco Müeller wrote:

> habe F_CPU mit 16 Mhz definiert

Wo?

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas K. (a-k)
Datum:

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

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

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

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.