Problem mit main und Timer1, ATMEG8

Gast #2173670
Lesenswert?

Guten Abend,

Habe folgendes Problem. Habe ein Programm geschrieben wo der Timer1 des 
ATMEGA8 einen Port toggeln soll, und zwar mit verschiedenen 
Impulslängen.
Das funktioniert auch alles soweit bestens, außer dass in meiner main 
die Werte nicht übernommen werden, wenn ich z.B. die Pulslänge während 
der Laufzeit ändern will. Hier mal mein Code, kann mir einer sagen was 
ich falsch mache???
1
#include <avr/io.h>
2
#include <util/delay.h>
3
#include <avr/interrupt.h>
4

5
#define STANDARD 60535;
6

7
unsigned short LOAD;
8

9

10
int main(void) 
11
{
12
  DDRD = 0x00;
13
  PORTD = 0xFF;
14

15
  DDRC |= (1<<PC0);
16
  PORTC |= (1<<PC0);
17

18
  TCCR1B = 0x02;
19
  TIMSK = 0x04;
20
  LOAD = 50000;
21

22
  TCNT1 = LOAD;
23

24
  sei();
25

26

27
  while(1)
28
  {
29
    LOAD = 10000;
30
    _delay_ms(1000);
31
    LOAD = 20000;
32
    _delay_ms(1000);
33
  }  
34

35
return 0;
36
}
37

38

39

40
ISR(TIMER1_OVF_vect)
41
{
42
  if(PORTC & 0x01)
43
    TCNT1 = STANDARD;
44
  if(!(PORTC & 0x01))
45
    TCNT1 = LOAD;
46

47
  PORTC ^= (1<<PC0);
48

49
}
#2173709
Lesenswert?

AUsserdem benutzt man für sowas den CTC Modus und nicht dieses 
bescheuerte Timer-Vorladen.

Dann hast du überhaupt keine Arbeit sondern weist einfach nur deinen 
neuen Wert dem Vertgleichsregister zu. Die Hardware kümmert sich dann 
selber darum, dass der Vergleichswert erst zum richtigen Zeitpunkt 
übernommen wird.
Gast #2173732
Lesenswert?

@Tueftler
Danke du bist ein Schatz, es geht:)
Was genau bewirkt denn dieses volatile?

@Karl Heinz Buchegger
Ja das hatte ich auch danach vor, wollte es aber einmal so versuchen, 
muss ma wieder nen bisschen in die Timer reinkommen:)

Also vielen Dank euch beiden!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren