#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
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 !!!
Wie was benutze ich ? Naja wie soll ich denn sonst 20 sekunden zyklen hinbekommen?
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?
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 | }
|
Einen Zaehler in Software runterzahlen beispielsweise. Jeden Timertick eins subtrahieren.
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) { } }
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?
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
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
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.
^^ 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. :-(
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.
Wenn man das Studio verwendet, definiert man F_CPU in den Projekteigenschaften (Project - Configuration Options - Frequency).
Außerdem muss doch in die main am ende noch ein return 0; oder sowas hin???
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.