ATmega16 mit Timer0 will nicht

OP #1716022
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
> 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 :).
Gast
> 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.
Gast
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?
OP
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
}
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?
Gast
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)
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.
Gast
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.
Gast
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.
OP
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
Gast
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!

[..]
Gast
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 ?
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.
OP
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
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.
OP
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
}
Angehängte Dateien:
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.
Gast
> 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.
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.
Gast
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
}
OP
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
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?
Gast
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);
  }
}
Gast
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.
Gast
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.
Angehängte Dateien:
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.
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?
Gast
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.
Gast
> 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);
OP
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
Angehängte Dateien:
Gast
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
Gast
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ß
Gast
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
Gast
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
Gast
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.
Angehängte Dateien:
OP
@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
Gast
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.
Gast
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
Gast
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.
OP
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.
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.
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.
Gast
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.
Angehängte Dateien:
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.
Gast
> 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.
OP
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.