Forum: Mikrocontroller und Digitale Elektronik ATmega16 mit Timer0 will nicht


von Jey B. (jeybee)


Lesenswert?

Nabend,

Ich bin hier wirklich gerade am verzweifeln. Ich versuche eine LED mit 
dem Timer0 eines ATmega16 zu Toggeln. Jedoch funktionirt mein Code 
anscheinend nicht. Compilieren kann ich jedoch ohne Probleme.

Wo ist mein Fehler?
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <avr/pgmspace.h>
4
#include <util/delay.h>
5
6
int main(void)
7
{
8
   DDRD = 0xFF;
9
10
 
11
     TCCR0 =(1<<WGM01) |(1<<CS01);
12
     OCR0=125;
13
 
14
     TIMSK|=(1<<OCIE0);
15
     sei();
16
  
17
  while(1)
18
  {
19
20
  }
21
 
22
}
23
 
24
25
ISR (TIMER0_COMP_vect)
26
{
27
  PORTD ^= (1<<PD0);
28
}


Danke
Greez Jey

von Lord Z. (lordziu)


Lesenswert?

Joel B. schrieb:
> PORTD ^= (1<<PD0);

Probiers mal so:
1
    PORTD = PIND ^ (1<<PD0);

Ports werden mittels "PINx" eingelesen.

von Hc Z. (mizch)


Lesenswert?

> Ports werden mittels "PINx" eingelesen.

Man kann genauso gut das zuletzt Geschriebene invertieren, also wie 
ursprünglich PORT nehmen.  Das tut's für diesen Zweck gleich gut.

@jeybee:  Dir ist schon klar, dass (überschlagsweise, 8 MHz-Takt 
angenommen) um die 4 kHz Toggle-Frequenz herauskommen?  Wenn Du nicht 
messen, sondern etwas sehen möchtest, musst Du schon sehr schnell 
schauen :).

von ich (Gast)


Lesenswert?

> Jedoch funktionirt mein Code anscheinend nicht.

Was heißt er funktioniert nicht? Leuchtet die LED oder nicht?
Ich weiß nicht mit welcher Frequenz der ATmega läuft, aber vieleicht 
siehst du das Toggeln nicht. Rechne mal aus wie schnell die LED toggelt.

von Jey B. (jeybee)


Lesenswert?

Moin

Also, der ATmega16 läuft mit 16MHz. Von dem her sollte die LED ja jetzt 
durchgehend leuchten, oder?

Wenn ich den obigen Code flashe  leuchtet einfach keine LED.

von ich (Gast)


Lesenswert?

kannst du dir vorstellen wie schnell die LED toggelt. Du hast eine 
Frequenz von 16MHz und einen Teiler von 8 also kommst du auf 
Timerfrequenz von 2MHz. Wenn du ausrechnest mit welcher Frequenz deite 
LED toggelt, kommst du auf 8kHz, dass heißt deine LED ist 0.25ms an und 
0.25ms aus. Denkst du, du siehst da was?

von ich (Gast)


Lesenswert?

Nimm doch ein Teiler von 1024 und versuch damit.

von Jey B. (jeybee)


Lesenswert?

Moin

ALso mit Prescale auf 1024 habe ich das selbe ergebnis... eine LED, die 
andauernt aus ist. Das Oszilloskop bringt auch kein sauberes Reckteck 
signal am Ausgang.

1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <avr/pgmspace.h>
4
5
int main(void)
6
{
7
   DDRD = 0xFF;
8
9
 
10
     TCCR0 =(1<<WGM01) | (1<<CS00) | (1<<CS02);
11
     OCR0=125;
12
 
13
     TIMSK|=(1<<OCIE0);
14
     sei();
15
  
16
  while(1)
17
  {
18
19
  }
20
 
21
}
22
 
23
24
ISR (TIMER0_COMP_vect)
25
{
26
  PORTD ^= (1<<PD0);
27
}

von Lord Z. (lordziu)


Lesenswert?

Wie ist die LED denn angeschlossen?

von Lord Z. (lordziu)


Lesenswert?

Joel B. schrieb:
> ALso mit Prescale auf 1024 habe ich das selbe ergebnis... eine LED, die
> andauernt aus ist. Das Oszilloskop bringt auch kein sauberes Reckteck
> signal am Ausgang.

Was heißt denn kein sauberes Rechteck? Kannst du ein Foto oder 
Screenshot posten?
Hängst du am richtigen Pin? Has das Oszi richtige Masse?

von ich (Gast)


Lesenswert?

ich bin nicht sicher, aber ich glaube du benutzst die falsche ISR. Ich 
glaube du muss die TIMER1_OVF_vect benutzen (aber wie gesagt, bin mir 
nicht sicher)

von Lord Z. (lordziu)


Lesenswert?

Um erstmal zu testen, ob deine LED richtig angeschlossen ist, kannst du 
auch erstmal auf den Timer verzichten:

1
#include <avr/io.h>
2
#include <avr/util.h>
3
4
// CPU Freq definieren
5
#define F_CPU 16000000UL
6
7
int main(void)
8
{
9
   DDRD = 0xFF;
10
  
11
  while(1)
12
  {
13
      PORTD = PIND ^ (1<<PD0);
14
      // sleep Funktion mit 1000ms
15
      for(uint8_t i=0; i<10; i++)
16
      {
17
          _delay_ms(100);
18
      }
19
  }
20
}
21
22
Achtung! DU musst prüfen, ob die Codezeilen so richtig sind, hab es nur aus dem Kopf hingeplottet.

von ich (Gast)


Lesenswert?

hab mich verschrieben, statt der 1 die 0 setzen

von Werner (Gast)


Lesenswert?

ISR ist schon ok.
Er benutzt erstens den Timer0, da kann er mit einer Timer1-ISR nix 
anfangen und zweitens will er keinen Interrupt beim Overflow, sondern 
beim Compare-Match.

von Hc Z. (mizch)


Lesenswert?

> Ich glaube du muss die TIMER1_OVF_vect benutzen

Er verwendet aber Timer 0.  Und, wenn ich das richtig sehe, im 
CTC-Modus.  Somit ist der Compare Interrupt schon richtig.

von Werner (Gast)


Lesenswert?

Vielleicht bringt auch ein Schaltplan Licht ins Dunkle.

Ist zwar keine Große Sache, aber wer weiß...

Werner

von ich (Gast)


Lesenswert?

Ist ja gut, ich habe auch geschrieben, dass ich nicht sicher bin und 
dass ich mich verschrieben habe.

Nachdem ich im datenblatt nachgeschaut habe, weiß ich jetzt auch, dass 
er die richtige ISR verwendet.

von Jey B. (jeybee)


Lesenswert?

Moin.

 also die LED ist wie folgt angeschlossen:



   AVR           Resistor       LED

 PortD.0 >------| 150R |---------|>-------|GND



Ohne Timer kann ich die LED auch zum leuchten/blinken bringen, es liegt 
also nicht an der Hardware.

zum Oszi: Kein sauberes Rechteck heisst, dass da nur rauschen zu sehen 
ist.


Greez Jey

von Werner (Gast)


Lesenswert?

Mir ist gerade aufgefallen, dass es mal einen ganz ähnlichen Thread gab:

Damals lag es anscheinend am Compiler!

Beitrag "Atmega 32, 8-Bit Timer(Timer 0)"

Wenn es bei Dir nicht am Code und nicht am Aufbau liegt, könnte das 
weiterhelfen...

Zitat:

[..]

>Hallo zusammen,
>danke für eure zahlreichen Hilfen! Ich habe das Problem endlich gelöst.
>Es lag alles nur an der von mir verwendeten Enwicklungsumgebung!
>Ich benutzte das auf dieser Seite vorgestellte AVR-Plugin für Eclipse
>http://www.mikrocontroller.net/articles/AVR_Eclipse
>den folgenden Hinweis habe ich jedoch übersehen:

>WARNUNG: Bei mir funktionierten Timer-Interrupts mit dem Plugin nicht
>(die jedoch tadellos mit der WinAVR Makefile fuktionierten). Vielleicht
>habe ich nur eine Option übersehen, seid aber auf der Hut. Wenn ihr
>Unregelmäßigkeiten bei IRQs feststellt, versucht's erstmal ohne das
>Eclipse-Plugin (bevor ihr stundenlang an eurem Code und euch selbst
>zweifelt :-) ).

>Habe mich dann nach Alternativen umgeguckt und bin hier fündig geworden:
>http://sourceforge.net/projects/avr-eclipse

>Damit funktioniert alles einwandfrei!

[..]

von Jey B. (jeybee)


Lesenswert?

Also ich verwende das AVRstudio4 von Atmel mit den neusten updates.
WinAVR ist auch auf dem aktuellsten Stand der Dinge

Als Programmer nutze ich den AVRISP MKII direkt von Atmel


Greez Jey

von MWS (Gast)


Lesenswert?

Falsche MCU in Makefile eingestellt ? Der Code funktioniert einwandfrei.

von Jey B. (jeybee)


Lesenswert?

Nope, Makfile stimmt (Mega16 mit 16Mhz)
Es wird auch das richtige .hex geflasht....

Und wie gesagt... an der Hardware liegt es nicht, mit einem Delay in der 
Main geht das ja.


Greez Jey

von MWS (Gast)


Angehängte Dateien:

Lesenswert?

Na, dann versuch' mal das hex File hier. Oder poste Deins.

von Jey B. (jeybee)


Angehängte Dateien:

Lesenswert?

Dein .hex File tuts auch nicht... :(

Im Anhang ist mal meines dabei.

von MWS (Gast)


Lesenswert?

Dein hex File ist ok, tut genau das, was es soll, disassembliert und 
auch simuliert.

Ich seh' auch keine Fuses, die solch eine Wirkung haben können, sicher 
die BOOTRST, aber da würde auch kein Blinken per Delay in der Mainloop 
funktionieren, da würde ohne Bootloader gar nix gehen.

Anderen Portpin ausprobiert, oder mal den OVF Int ausprobiert, natürlich 
dann ohne CTC ?

Wird beim Code für's Blinken per Delay in der Main der gleiche Potrtpin 
verwendet ?

von Jey B. (jeybee)


Lesenswert?

Jap, es wird mit dem Blinken über ein Delay der selbe Portpin verwendet.
Fuses sind wie folgt:


High: 0xD9
Low:  0xBF


Ich bin echt ratlos :(

von ich (Gast)


Lesenswert?

!!Nur ein Vorschlag!!
Wie währs wenn du OC0 Ausgang verwendes um die LED zu Toggeln.

von Karl H. (kbuchegg)


Lesenswert?

Probier mal folgendes Programm aus
1
#ifndef F_CPU
2
#define F_CPU 16000000
3
#endif
4
5
#include <avr/io.h>
6
#include <avr/interrupt.h>
7
#include <avr/pgmspace.h>
8
#include <util/delay.h>
9
10
int main(void)
11
{
12
   DDRD = 0xFF;
13
14
   PORTD |= (1<<PD0);
15
   _delay_ms( 500 ); 
16
   PORTD &= ~(1<<PD0);
17
   _delay_ms( 500 );
18
19
20
     TCCR0 =(1<<WGM01) | (1<<CS00) | (1<<CS02);
21
     OCR0=125;
22
 
23
     TIMSK|=(1<<OCIE0);
24
     sei();
25
  
26
  while(1)
27
  {
28
29
  }
30
 
31
}
32
 
33
34
ISR (TIMER0_COMP_vect)
35
{
36
  PORTD ^= (1<<PD0);
37
}

Das schaltet am Anfang die LED für 0.5 Sekunden ein.
Wenn deine LED jetzt scheinbar mit 0.5 Sekunden blinkt, dann wird dein 
µC aus irgendeinem Grund ständig resettet.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Ist oder war vielleicht mal der Watchdog aktiviert und jetzt resettet 
sich der Atmega16 bevor es zum Toggeln der LED kommt? Ein einmal 
aktivierter Watchdog überlebt das Neuflashen und futschelt dann in 
Programmen rum, die an sich keine Watchdogaufrufe haben!

von Jey B. (jeybee)


Lesenswert?

Nun, das Programm von Karl funktioniert einwandfrei... Die LED blinkt im 
500ms Takt, njedoch halt nicht über den timer...
Wie kann es denn sein, das mein Controller immer geresettet wird?
ALso extern habe ich einen Pullup am RESET Pin. Der Watchdog sollte 
standartmässig ausgeschaltet sein und manuel verändert habe ich ihn auch 
nicht.

Zudem haben zig andere Programme auf dem Microcontroller bisher 
funktioniert (LCD Ansteuern, ADC auslesen, normales I/0 etc...).


Greez Jey

von Karl H. (kbuchegg)


Lesenswert?

Joel B. schrieb:

> Wie kann es denn sein, das mein Controller immer geresettet wird?

> Zudem haben zig andere Programme auf dem Microcontroller bisher
> funktioniert (LCD Ansteuern, ADC auslesen, normales I/0 etc...).

Wenn du tatsächlich 0.5 Sekunden ein / 0.5 Sekunden aus siehst und es 
nicht der Watchdog ist, dann stimmt der INterrupt Vektor nicht. Der ISR 
Aufruf 'geht dann ins Leere', eigentlich auf den Default Handler, und 
der resettet den µC.

Also noch mal kontrollieren:
Im AVR Studio ist der richtige Controller eingestellt?
Der Interrupt Vektor heißt tatsächlich so?
Gibt es Warnungen beim Compilieren?


Edit:
Watchdog kannst du leicht kontrollieren.
Mach aus den 500 Millisekunden mal 5000
Dann hast du 5 Sekunden an/aus
Das ist länger als der Watchdog braucht um zuzuschlagen.
Hast du 5 Sekunden ein/aus, dann ist es nicht der Watchdog.

von Jey B. (jeybee)


Angehängte Dateien:

Lesenswert?

MCU und deren Taktfrequenz wurden im AVRstudio4 richtig eingestellt. 
Fuses stimmen soweit eigentlich auch.

Im Anhang die .hex
Hier nochmal das Programm:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <avr/pgmspace.h>
4
#include <util/delay.h>
5
6
#ifndef F_CPU
7
#define F_CPU 16000000
8
#endif
9
10
int main(void)
11
{
12
  DDRD = 0xFF;
13
14
  PORTD |= (1<<PD0);
15
  _delay_ms( 500 ); 
16
  PORTD &= ~(1<<PD0);
17
  _delay_ms( 500 );
18
19
20
  TCCR0 =(1<<WGM01) | (1<<CS00) | (1<<CS02);
21
    OCR0=125;
22
    TIMSK|=(1<<OCIE0);
23
    sei();
24
  
25
    while(1)
26
    {
27
28
    }
29
 
30
}
31
 
32
33
ISR (TIMER0_COMP_vect)
34
{
35
  PORTD ^= (1<<PD0);
36
}

von Karl H. (kbuchegg)


Lesenswert?

Joel B. schrieb:
> MCU und deren Taktfrequenz wurden im AVRstudio4 richtig eingestellt.
> Fuses stimmen soweit eigentlich auch.

Na denn.
Wenn alles richtig eingestellt ist (was wir nicht kontrollieren können) 
und das Programm richtig ist (was wir kontrollieren können)
kurz und gut: wenn alles richtig ist

dann muss es auch funktionieren.

von MWS (Gast)


Lesenswert?

> High: 0xD9
> Low:  0xBF

Passt auch.

@Karl Heinz,

da wird schon der richtige Vektor angesprochen, aus dem hex File:
1
+00000000:   940C002A    JMP       0x0000002A     Jump
2
+00000002:   940C0047    JMP       0x00000047     Jump
3
+00000004:   940C0047    JMP       0x00000047     Jump
4
+00000006:   940C0047    JMP       0x00000047     Jump
5
+00000008:   940C0047    JMP       0x00000047     Jump
6
+0000000A:   940C0047    JMP       0x00000047     Jump
7
+0000000C:   940C0047    JMP       0x00000047     Jump
8
+0000000E:   940C0047    JMP       0x00000047     Jump
9
+00000010:   940C0047    JMP       0x00000047     Jump
10
+00000012:   940C0047    JMP       0x00000047     Jump
11
+00000014:   940C0047    JMP       0x00000047     Jump
12
+00000016:   940C0047    JMP       0x00000047     Jump
13
+00000018:   940C0047    JMP       0x00000047     Jump
14
+0000001A:   940C0047    JMP       0x00000047     Jump
15
+0000001C:   940C0047    JMP       0x00000047     Jump
16
+0000001E:   940C0047    JMP       0x00000047     Jump
17
+00000020:   940C0047    JMP       0x00000047     Jump
18
+00000022:   940C0047    JMP       0x00000047     Jump
19
+00000024:   940C0047    JMP       0x00000047     Jump
20
+00000026:   940C0054    JMP       0x00000054     Jump
21
+00000028:   940C0047    JMP       0x00000047     Jump
An 54 ist der Comp Handler, der Code simuliert auch korrekt.

von Jey B. (jeybee)


Lesenswert?

Aus verzweiflung habe ich nun auch schonmal zweimal die MCU getauscht... 
immer mit dem selben ergebnis. Ich werde heute Abend mal den Code zu 
Hause an andere Hardware ansehen.

Ich werd mich melden.


Bis die Tage

von Stefan E. (sternst)


Lesenswert?

Dann ist es wohl an der Zeit, mal die etwas "verrückteren" Möglichkeiten 
abzuchecken. Bist du gaaaanz sicher, auch wirklich die HEX-Datei in den 
Chip zu programmieren, und nicht etwa die ELF-Datei? Das hätte nämlich 
auch genau die beobachteten Auswirkungen.

von MWS (Gast)


Lesenswert?

Versuch' mal das hier:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <avr/pgmspace.h>
4
#include <util/delay.h>
5
#include <avr/wdt.h>
6
7
int main(void)
8
{
9
  wdt_disable();
10
    DDRD = 0xFF;
11
   
12
  PORTD |= (1<<PD0);
13
  _delay_ms( 500 ); 
14
  PORTD &= ~(1<<PD0);
15
  _delay_ms( 500 );   
16
 
17
  TCCR0 =(1<<WGM01) | (1<<CS00) | (1<<CS02);
18
    OCR0=125;
19
      TIMSK=(1<<OCIE0);
20
     sei();
21
  
22
  while(1)
23
  {
24
25
  }
26
 
27
}
28
 
29
30
ISR (TIMER0_COMP_vect)
31
{
32
  PORTD ^= (1<<PD0);
33
}

von Jey B. (jeybee)


Lesenswert?

Moin,

Also ich habe jetzt mal den Code von MWS geflasht und die LED blinkt 
jetzt im Sekundentakt. Wenn ich folgenden Teil auskomentiere, bleibt die 
LED wieder dunkel:
1
  PORTD |= (1<<PD0);
2
  _delay_ms( 500 ); 
3
  PORTD &= ~(1<<PD0);
4
  _delay_ms( 500 );


Sonst noch jemand eine Idee?


Greez Jey

von Karl H. (kbuchegg)


Lesenswert?

Schön langsam nicht mehr.

Probier mal einen anderen Port. Das Programm an sich ist in Ordnung. 
Aber irgendetwas wirft den µC aus der Bahn. Das kann genausogut ein 
elektrisches Problem sein.

Wie sieht deine µC Beschaltung aus?

von ich (Gast)


Lesenswert?

Ich habe den Quellcode von MVS auf mein ATmega128 geladen, habe da noch 
was veränder und es funktioniert wunderbar.

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

#ifndef F_CPU
#define F_CPU 16000000
#endif

uint8_t i=0;

int main(void)
{
  DDRD = 0x01;

  TCCR0 =(1<<WGM01)|(1<<CS00)|(1<<CS02)|(1<<CS01);
    OCR0=125;
    TIFR &= ~(1<<OCF0);
    TIMSK|=(1<<OCIE0);
    sei();

    while(1)
    {

    }

}


ISR(TIMER0_COMP_vect)
{
  i++;
  if(i==5)
  {
    PORTD ^= (1<<PD0);
  }
}

von ich (Gast)


Lesenswert?

Du muss bei dir nur
> |(1<<CS01) wegnehmen.

von ich (Gast)


Lesenswert?

Als das Programm geladen habe so wie es war, hat es auch nicht 
funktioniert.
Ich habe nur TIFR &= ~(1<<OCF0); den Flag gelöscht und das Toggeln in 
der ISR verlangsammt. Vielleicht liegt es daran.

von Lord Z. (lordziu)


Lesenswert?

Karl heinz Buchegger schrieb:
> Wie sieht deine µC Beschaltung aus?

Seh ich genauso. Alles deutet darauf hin, dass dein µC resettet wird. 
Und da wir hier auf der Software- und Fuses-Seite nahezu alles 
ausgeschlossen haben, kann es fast nur noch an der Schaltung liegen.

von ich (Gast)


Lesenswert?

also um das Flag zu löschen, muss du es auf 1 setzen und nicht aus 0 
(mein Fehler), hat aber trotzdem funktioniert.

von Jey B. (jeybee)


Lesenswert?

Also ich habe jetzt mal mim Oszilloskop am Resetpin (der btw. einen 
Pullup besitzt) nachteschaut -> von Extern wird der AVR nicht 
geressetet.

von Lord Z. (lordziu)


Lesenswert?

Kannst du denn mal einen Schaltplan posten?

von MWS (Gast)


Angehängte Dateien:

Lesenswert?

Da der Watchdog auch auszuschließen ist, kann's (fast) nur an der 
umgebenden Hardware liegen. Was für ein Aufbau ? Platine, Steckbrett ? 
100n von VCC nach GND am µC ? Welche Stromversorgung ?

Versuch mal anhängende Hexfiles, stack_test schiebt 3 Bytes auf den 
Stack und holt sie wieder. Wenn's dabei einen Fehler gibt, dann geht die 
Led an, wenn's fehlerfrei war bleibt sie aus. Ein falsch initialisierter 
Stack könnte genau solche Fehler wie hier erzeugen. Wobei in dem von Dir 
geposteten Hexfile der Stack für den ATM16 richtig initialisiert wird, 
aber probieren schadet ja nix.

Isr_blink ist das das gleiche Blinkprogramm per ISR, nur in Bascom 
geschrieben. Einfach mal ausprobieren.

Bei 64Hz wäre allerdings nur ein Dimmen wahrnehmbar.

von nobody (Gast)


Lesenswert?

Sollte i nicht volatile deklariert sein??

In der Isr passiert nur bei i==5 was, die restlichen 255 Male nichts!

Ist das so gewollt?

von Jey B. (jeybee)


Lesenswert?

beim stack_test.hex ist keine LED am leuchten, leider genausowenig bei 
der isr_blink.hex

Die Schaltung poste ich später, da der Schaltplan nicht auf dieser Kiste 
zu finden ist.

von Karl H. (kbuchegg)


Lesenswert?

nobody schrieb:
> Sollte i nicht volatile deklariert sein??

Das passt schon so.

> In der Isr passiert nur bei i==5 was, die restlichen 255 Male nichts!

Damit teilt er die ISR Frequenz noch weiter runter, nämlich durch 256. 
Ob da jetzt mit 5 oder mit 0 verglichen wird, spielt nicht mehr so die 
grosse Rolle.

von ich (Gast)


Lesenswert?

Es sollte in der if-Abfrage auf 0 gesetzt werden. Aber so was passiert, 
wenn man keine Zeit zum Durchlesen hat und schnell was reinstellt.

von Karl H. (kbuchegg)


Lesenswert?

ich schrieb:
> Es sollte in der if-Abfrage auf 0 gesetzt werden. Aber so was passiert,
> wenn man keine Zeit zum Durchlesen hat und schnell was reinstellt.

:-)
Lernen wir alle mal. Egal wie simpel dein Code ist, es gibt immer eine 
Chance für Fehler.

Ich müsste jetzt im Datenblatt nachsehen, aber ich denke die Vorteiler 
Bits vom Mega128 unterscheiden sich nicht großartig vom Mega16. Und bei 
dem hab ich nachgesehen:
1
TCCR0 =(1<<WGM01)|(1<<CS00)|(1<<CS02)|(1<<CS01);

Aha. Vorteiler: externer Clock an T0

Sicher, das du das willst?

von ich (Gast)


Lesenswert?

Bei dem 128 ist es fcpu/1024. ich habe späteter auch gesehen, dass bei 
dem 16 es ein ext. Clock ist, deswegen habe ich auch geschrieben, dass 
er den CS01 wegnehmen soll.

von MWS (Gast)


Lesenswert?

> beim stack_test.hex ist keine LED am leuchten, leider genausowenig bei
> der isr_blink.hex

Erstes ist gut, zweites weniger, wobei das funktionierender Code ist, 
dann würde ich mal auf HW tippen.

Hab' gerad' noch gesehen, daß Du die BODEN Fuse gesetzt hast, mach' mal 
die raus und probier's nochmal.

Wäre dann Fuses Low = 0xFF & High = 0xD9, wenn ich das richtig sehe.
Sollte es dann gehen, dann wäre es der Brownoutreset der für den 
Neustart sorgt. Der darf natürlich unter normalen Betriebsbedingungen 
nicht auslösen. Tut er's doch, ist's die Elektrik :D

Konfigurier' mal testweise nur den Pin, der auch Ausgang werden soll als 
solchen:
1
  DDRD = (1<<PD0);

von Jey B. (jeybee)


Angehängte Dateien:

Lesenswert?

So, nun habe ich wieder Zeit.

Der Schaltplan liegt leider nur stückweise im Anhang, da ich i-wie 
unfähig bin, das "Print to file" .prn in ein jpg umzuwandeln (was ja 
auch nicht sinn und zweck ist).

Ansonsten biete ich auch gerne direkt das gesamte OrCAD File an. Wie man 
jedoch sieht, ist da nichts spezielles mit an Board. Zudem kann ich ja 
alles andere "per Hand" zum blinken bringen.

Auch das deaktivieren des BODEN Fuses hat nichts gebracht.


hier nochmal der aktuelle Code:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <avr/pgmspace.h>
4
#include <util/delay.h>
5
6
int main(void)
7
{
8
    DDRD = 0xFF;
9
     
10
11
  TCCR0 =(1<<WGM01) | (1<<CS00) | (1<<CS02);
12
  OCR0=125;
13
  TIMSK=(1<<OCIE0);
14
  sei();
15
  
16
  while(1)
17
  {
18
19
  }
20
 
21
}
22
23
ISR (TIMER0_COMP_vect)
24
{
25
  PORTD ^= (1<<PD2);
26
}



Gruss Jey

von Chris (Gast)


Lesenswert?

Hab mir nur mal kurz den Schaltplan angesehen, am µC könnte bzw. sollte 
man noch an VCC ein 100nF Kondensator gegen Masse führen und am Resetpin 
wäre ein Elko mit 4,7µF gegen Masse auch nicht falsch.

Grüße
Chris

von Jey B. (jeybee)


Lesenswert?

Klar könnte das nicht schaden, aber bisher ging es ja auch...
Dennnoch habe ich nun 100nF gegen Masse und auch dem Resetpin einen 
Kondensator spendiert. Doch noch immer herst dunkelheit.


Gruss Jey

von seiner einer (Gast)


Lesenswert?

So funtioniert dieser Timermodus nicht!
Du brauchst die ISR nicht. Ließ dir mal das Datenblatt genau durch.
Die Zeile TIMSK = ... verhindert in diesem Fall das die LED getoggelt 
wird

Gruß

von seiner einer (Gast)


Lesenswert?

Ich seh gerad das du Timer 0 verwenden möchtest. Da gibt es kein WGM01 
bit.
Wenn du Timer 1 verwendest wird das PORT vom Timer wie gesagt 
automatisch getoggelt ohne ISR

von Chris (Gast)


Lesenswert?

Joel B. schrieb:
> TCCR0 =(1<<WGM01) | (1<<CS00) | (1<<CS02);
>   OCR0=125;
>   TIMSK=(1<<OCIE0);


sollte das nicht heißen
TCCR0 |= (1<<WGM01) | (1<<CS00) | (1<<CS02);
TIMSK |= (1<<OCIE0);

hast du da nicht vor dem = den Operator |  vergessen?

Ohne die setzt er bei mir die Bits auch nicht.

@ seiner einer
WGM01 gibt es laut Datenblatt

grüße

von MWS (Gast)


Angehängte Dateien:

Lesenswert?

Dir ist schon klar, daß wenn die 12V Versorgungsspannung anliegt, Relais 
LS1 mit einer Frequenz von 62Hz beaufschlagt wird ?

Willst Du eine Teslaspule bauen ? :D
Du  produzierst wahrscheinnlich solche Störungen, daß Dir der µC schon 
bei den ersten Takten aussteigt.

Klemm die 12V Versorgung mal ab und probier's nochmal.
Bzw. nimm das angehängte Hex, das toggelt den Pin in 
Relais-verträglichen Raten, aber per Timer0 ISR.

von Jey B. (jeybee)


Lesenswert?

@Chris:  Oh! du hast ja recht, wie peinlich! :(

Jedoch war das leider NICHT die Lösung... Ich habe es inzwischen auch 
mit- und ohne ISR probierte... beides erfolglos....


@seiner einer: Also da sehe ich kein Problem?!

Hier nochmals der Aktuelle Code:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <avr/pgmspace.h>
4
#include <util/delay.h>
5
6
int main(void)
7
{
8
    DDRD = 0xFF;
9
     
10
11
  TCCR0 |= (1<<WGM01) | (1<<CS00) | (1<<CS02);
12
  OCR0=125;
13
  TIMSK |= (1<<OCIE0);
14
15
  sei();
16
  
17
  while(1)
18
  {
19
20
  }
21
 
22
}
23
24
ISR (TIMER0_COMP_vect)
25
{
26
  PORTD ^= (1<<PD2);
27
}




Greez Jey

von MWS (Gast)


Lesenswert?

Chris:
> hast du da nicht vor dem = den Operator |  vergessen?
Den "|=" ODER Zuweisungsoperator nimmt man nur, wenn das Register 
bereits konfiguriert wurde, und man zusätzlich ein Bit setzen will.

Wenn das Register dagegen das erste Mal beschrieben wird, dann ist sogar 
ein "=" besser, denn das sorgt für einen definierten Anfangszustand.

von Chris (Gast)


Lesenswert?

Ich hatte auch mal ein Programm da hab ich diese zuerst weggelassen. Das 
Programm lieft nicht. Dann habe ich sie hinzugefügt und das Programm 
lief.
Seit dort schreibe ich es immer nur noch so. Da sich der Fehler auch 
immer wieder so herstellen lies.

Grüße

von MWS (Gast)


Lesenswert?

Chris:
> Ich hatte auch mal ein Programm da hab ich diese zuerst weggelassen.
> Das Programm lieft nicht. Dann habe ich sie hinzugefügt und das
> Programm lief.

Das hängt vollständig vom Aufbau Deines Programmes ab. Wenn z.B. irgend 
eine eingebundene und vorab aufgerufene Funktion bereits das Register 
konfiguriert hat, dann führt ein "=" natürlich zum Überschreiben der 
Konfiguration.

Beim hier vorgestellten Code ist das jedoch nicht der Fall, der ist sehr 
einfach. Das "|=" schadet nicht, denn nach dem Einschalten ist TIMSK 
gleich 0 und damit wird einfach ein ODER mit 0 vorgenommen.

Wenn man aber wirklich eindeutig festlegen möchte, daß ein Register 
einen bestimten Inhalt hat und keinen weiteren, möglicherweise vorher 
abgelegten, dann nimmt man die "=" Version.

Deshalb war es ganz sicher kein Fehler von Joel.

von MWS (Gast)


Lesenswert?

> Relais LS1 mit einer Frequenz von 62Hz beaufschlagt wird ?

Korrektur, nach dem letztem Codebeispiel quälst Du Relais LS2 :D

von Jey B. (jeybee)


Lesenswert?

Ne, da geht ja nix... man hört nix und das Oszi zeigt sich auch 
unbeeindruckt :(

von Karl H. (kbuchegg)


Lesenswert?

Jey Bee schrieb:

> Jedoch war das leider NICHT die Lösung... Ich habe es inzwischen auch
> mit- und ohne ISR probierte... beides erfolglos....

Wie ist das zu verstehen: Du hast es ohne ISR probiert.
Du hast WAS ohne ISR probiert?

: Wiederhergestellt durch User
von Jey B. (jeybee)


Lesenswert?

seiner einer schrieb:
> Ich seh gerad das du Timer 0 verwenden möchtest. Da gibt es kein WGM01
> bit.
> Wenn du Timer 1 verwendest wird das PORT vom Timer wie gesagt
> automatisch getoggelt ohne ISR

Auf disen Post hin habe ich einfach mal die ISR auskommentiert....

Nur so by the way: das Relais ist zur Zeit eh nicht aufgelötet.

von Karl H. (kbuchegg)


Lesenswert?

Jey Bee schrieb:
> seiner einer schrieb:
>> Ich seh gerad das du Timer 0 verwenden möchtest. Da gibt es kein WGM01
>> bit.
>> Wenn du Timer 1 verwendest wird das PORT vom Timer wie gesagt
>> automatisch getoggelt ohne ISR
>
> Auf disen Post hin habe ich einfach mal die ISR auskommentiert....

Oh Mann
Du kannst nicht einfach eine ISR auskommentieren.

Ein freigegebener Interrupt benötigt eine ISR.
Hast du sie nicht, dann gibt es auf jeden Fall einen Reset.

von Karl H. (kbuchegg)


Lesenswert?

Also
Zusammendassend:

Eine LED-Blinkschleife in main() funktioniert. Die LED blinkt. Du kannst 
auch ausschliessen, dass das Blinken durch Reset erfolgt.

Dieselbe LED Ansteuerung in einer ISR vom Timer 0 funktioniert nicht.


Kann man das so sagen.
Speziell der Punkt: ... ohne das ein Reset erfolgt
ist wichtig.

von MWS (Gast)


Angehängte Dateien:

Lesenswert?

Du hast ein Problem im Schaltplan, erst einmal muss der µC Pin PD1, wenn 
Du den ganzen Port als Ausgang setzt, gegen den TXD Ausgang des FT232RL 
anarbeiten, wenn der TXD auf 1 steht.

Zweitens ist der FT232RL falsch angeschlossen, RXD zu RXD und TXD zu 
TXD. Keine Ahnung, ob das sich hier mit Restarts auswirkt, nur wird 
Deine USB Schnittstelle so sicher nie laufen.

Im angehängten Hex hab' ich mal nur PD2 als Ausgang gesetzt und lass' 
per ISR mit 1Hz blinken.

von Oliver (Gast)


Lesenswert?

Karl heinz Buchegger schrieb:
> Oh Mann
> Du kannst nicht einfach eine ISR auskommentieren.

Natürlich kann Oh Mann das ;-)

Manche Programmkonzepte muß man sich halt schwer erarbeiten.

Oliver

von Jey B. (jeybee)


Lesenswert?

Da mir das mit dem FT232RL schon aufgefallen ist, habe ich hier schon 
lange die zwei Leitungen getrennt. Dies dürfte also keinen Einfluss 
nehmen.


Beim Programm von MWS passiert wiederum nix.

von Karl H. (kbuchegg)


Lesenswert?

Jey Bee schrieb:
> Da mir das mit dem FT232RL schon aufgefallen ist, habe ich hier schon
> lange die zwei Leitungen getrennt. Dies dürfte also keinen Einfluss
> nehmen.

Keine AHnung, ob es anderen auch so geht wie mir:
Aber bei deinem Schaltplan blick ich nicht mehr durch. Zudem hast du das 
alles offenbar auch schon modifiziert.

Mein Vorschlag:
Nimm den Mega16 aus seiner Fassung.
Dann misst du die Spannung am Sockel am besagten Pin.
Dort sollte eigentlich 0V sein und wenn du mit 5V drauf gehst, müsste 
deine LED leuchten (Stromaufnahme messen)

Zudem würde ich mir an deiner Stelle den programmierten Mega16 in einen 
einzelnen Sockel setzen, den freihand verdrahten (den Mega auf internen 
RC-Oszillator umfusen) und nachsehen ob die LED blinkt. Für diese 
Freihandverdrahtung reicht es allemal aus, einfach nur die 
Versorgungsspannung (und noch 100nF zwischen Vcc und GND) anzulegen. 
Mehr braucht es nicht, damit das Teil läuft.

Ziel der Übung ist es, den Mega ohne deine ganze Rundumschaltung (die 
offenbar nicht getestet wurde) in Betrieb zu nehmen um zunächst alle 
Einflüsse aus der Umgebungsbeschaltung auszuschliessen.

Sonst suchst du (und wir) uns hier noch einen Wolf.

von MWS (Gast)


Lesenswert?

> Beim Programm von MWS passiert wiederum nix.
Du hast ein schwerwiegendes Hardware Problem. Jedesmal, wenn ich ein Hex 
gepostet hab', lief das vorher als Simulation durch's AVR Studio, das 
funktioniert also sicher.

Ich finde die 33pF am Quarz ein wenig zu dick geraten, DB empfiehlt 
12-22pF. Möglicherweise arbeitet der Quarzoszillator nicht stabil, 
sollte eigentlich zu keinem Reset führen.

Wenn Du die CKOPT Fuse programmierst, bekommst Du auf alle Fälle eine 
kräftigere Schwingung, das solltest Du noch ausprobieren.

Vom Schaltplan her wäre der aktuelle Ist-Stand wichtig, und nicht der 
Soll-Stand. Noch dazu wenn der Schaltplan als Patchwork gepostet wird, 
dann wird das hier nur noch zum Rätselraten.

von Jey B. (jeybee)


Lesenswert?

Ich habe nun mal folgenden alten Code ausgegraben:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <avr/pgmspace.h>
4
#include <util/delay.h>
5
#include "lcd.h"
6
7
8
volatile unsigned int  millisekunden=0;
9
volatile unsigned int  sekunde=0;
10
volatile unsigned int  minute=0;
11
volatile unsigned int  stunde=0;
12
unsigned char buffer[10];
13
14
int main(void)
15
{
16
  DDRD = 0xFF; 
17
18
 
19
   TCCR0  =(1<<WGM01) |(1<<CS01);
20
   OCR0     =  128;
21
   TIMSK  =  (1<<OCIE0);
22
   sei();
23
   
24
   
25
   
26
   lcd_init(LCD_DISP_ON);
27
   lcd_clrscr();
28
   
29
   
30
   
31
   
32
   while(1)
33
   {
34
   lcd_clrscr();
35
   lcd_home();
36
   lcd_puts(itoa(stunde,buffer,10));
37
   lcd_puts(":");
38
   lcd_puts(itoa(minute,buffer,10));
39
   lcd_puts(":");
40
   lcd_puts(itoa(sekunde,buffer,10));
41
   _delay_ms(300);
42
   }
43
 
44
}
45
 
46
47
ISR (TIMER0_COMP_vect)
48
{
49
   millisekunden++;
50
   if(millisekunden==1000)
51
   {
52
      sekunde++;
53
      millisekunden=0;
54
      if(sekunde==60)
55
      {
56
         minute++;
57
         sekunde=0;
58
      }
59
      if(minute ==60)
60
      {
61
        stunde++;
62
        minute=0;
63
      }
64
   }
65
   PORTD ^= (1<<PD7);
66
67
}

Der Code funktioniert soweit, dass die LED an PD7 immer an ist, aber das 
LCD sichtbar die Zahlen hochzählt (nicht im sekundentakt)
Wenigstens weiss ich jetzt, dass der Timer läuft, wo der Hardwarefehler 
mit PD7 ist, weis ich trotzdem nicht (das Relais ist angeschlossen)

Nunja, danke für euere Hilfe und euere Gedult


Gruss Jey

von Oliver (Gast)


Lesenswert?

Jey Bee schrieb:
> wo der Hardwarefehler
> mit PD7 ist, weis ich trotzdem nicht (das Relais ist angeschlossen)

Wie wärs mal mit: nicht raten, sondern messen.

Oliver

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.