atmega64 8 bit timer läuft nicht

Gast #1221066
Lesenswert?

Hallo

Ich versuche den 8 bit timer des atmega 64 zum laufen zu bekommen, doch 
ich kann machen was ich möchte es klappt einfach nicht.

ich habe eine extra initialisierungs funktion für den timer geschrieben.

void timer0Init(void)
{
  //initialisiert Interrupt bit im statusregister
  SREG |= 0x80;

  //timerinterrupt aktivieren
  TIMSK |= (1<<OCIE0);


  //CTC Mode Prescaler 256
  TCCR0 |= (1<<WGM01) | (1<<CS01) | (1<<CS02);

  //vergleichswert
  OCR0 = 0xFF;



}





jedes mal wenn der timer überläuft soll über den uart etwas 
rausgeschrieben werden. (uart funktion funktioniert habe ich getestet)

ISR(SIG_OUTPUT_COMPARE0)
{

  usartPuts("test\r\n");


}





die initialisierungs funktion wird aufgerufen.
avr/signal.h u. interrupt.h werden eingebunden.
Moderator Persönliche Seite #1221141
Lesenswert?

Gizmo wrote:
> ich habe im sreg das I bit per SREG |= 0x80; gesetzt was ist der
> unterschied zu sei(); ?

2 CPU-Takte.

Dein Code ist reichlich altmodisch.  SIGNAL, Vektornamen mit SIG_
und <avr/signal.h> sind schon einige Jahre lang "deprecated".

UART-Ausgaben in einer ISR sind auch nicht das Gelbe.  Bei 9600 Bd
würde diese Ausgabe stolze 6 ms dauern.  Wenn F_CPU = 1 MHz ist,
dann würde sich die Katze etwa bei einem OCR0 von 23 in den Schwanz
beißen, weil die UART-Ausgaben länger dauern als das CTC-Intervall.

Aber einen wirklichen Fehler finde ich da nicht, und ich verwette
meine (nicht vorhandene :) Perücke, dass der Code funktionieren
würde, wenn ich ihn bei mir auf einem ATmega128 (praktisch baugleich
bis auf die Speichergrößen) implementiere.

Ach, *klick*: hast du die M103C-Fuse abgeschaltet?
Gast #1221420
Lesenswert?

hab das flag vor meinem letzten post schon rauß genommen.
ich prüfe gerade das überlaufs flag im TIFR register um sicherzustellen 
ob der timer überhaupt läuft.

das steht gerade als erstes in meiner (while(1)) programmschleife.

    if(TIFR & 0x04)
    {
      usartPuts("tov1\r\n");
    }
so wie es aussieht wird das überlaufsflag nie gesetzt da auf 
hyperterminal nichts erscheint.
sprich der timer läuft garnicht erst an.

heul
Gast #1221493
Lesenswert?

@ Justus Skorps

kannst du eigentlich auch mal was schreiben was einem weiterhilft ?
na ja, warscheinlich nicht da du offensichtlich nicht viel ahnung hast, 
leute die wissen von was sie reden wie alle anderen die mir hier helfen 
wollen schreiben nicht so einen nonsen wie du. Das kannst du dir echt 
sparen.
Ein Tip an dich: Wenn du gerne was tippen möchtest schreib ein Tagebuch.

Bin halt Einsteiger und irgendwann weiß man halt nicht mehr weiter.
zum datenblatt: glaubst da hab ich noch net rein geschaut.
es kann sein das man beim lesen was übersieht, dann fragt man halt wenn 
was nicht klappt. wozu ist ein forum bitte schön da ?

ich wünsche dir noch nen schönen tag

servus
#1221502
Lesenswert?

Gizmo wrote:
> @ Justus Skorps
>
> kannst du eigentlich auch mal was schreiben was einem weiterhilft ?

du meinst sowas

>http://www.mikrocontroller.net/articles/AVR_Fuses#Kompatibilit.C3.A4tsfuses_und_manchmal_l.C3.A4stige_Defaults

oder

> laut deinem ersten Post startest du Timer0, jetzt prüfst du plötzlich
> Timer1...

?

> na ja, warscheinlich nicht da du offensichtlich nicht viel ahnung hast,

wie soll man aus deinen hingeworfenen Code-Fetzen denn Ahnung bekommen?

> leute die wissen von was sie reden wie alle anderen die mir hier helfen
> wollen

denen du auch nicht antwortest, und darauf hab ich mich bezogen...siehe 
Frage nach M103C-Fuse...

> glaubst da hab ich noch net rein geschaut.

anscheinend nicht, sonst wäre

> was ist denn das M103C-Fuse ? hab das noch nie gehört.

nicht gekommen...
Moderator Persönliche Seite #1221505
Lesenswert?

Gizmo wrote:

> kannst du eigentlich auch mal was schreiben was einem weiterhilft ?
> na ja, warscheinlich nicht da du offensichtlich nicht viel ahnung hast,
> leute die wissen von was sie reden wie alle anderen die mir hier helfen
> wollen schreiben nicht so einen nonsen wie du. Das kannst du dir echt
> sparen.

Nun werd' hier mal nicht pampig, sonst redet ganz schnell keiner
mehr mit dir.  Er hat doch mit seiner Frage völlig Recht: du hast
anfangs immer von Timer 0 geschrieben, jetzt prüfst du den Überlauf
von Timer 1 (und noch dazu mit 0x04 statt _BV(TOV1), bei dem man
wenigstens gleich erkennen würde, wofür das Flag gut ist).

Wenn du den Timer im CTC-Modus betreibst, wird er außerdem nie
überlaufen, da er ja vorher zurück gesetzt wird.  Daher benutzt
du ja auch die ISR für compare match statt der für overflow.

Am besten, du postest mal einen kompletten, compilierbaren Code, und
zwar den, den du auch zum Testen benutzt.  (Bitte als Anhang.)
#1221507
Lesenswert?

Na denn, zum Testen ob der Timer überhaupt anläuft, sollte das reichen
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3

4
unsigned char count;
5

6
ISR( TIMER0_OFV_vect )
7
{
8
  PORTB = count++;
9
}
10

11
int main()
12
{
13
  DDRB = 0xFF;
14

15
  TIMSK = ( 1 << TOIE0 );
16
  TCCR0 = ( 1 << CS00 ) | ( 1 << CS01 );
17

18
  sei();
19

20
  while( 1 ) {
21
  }
22
}

Viel Spass.
Gast #1221522
Lesenswert?

>Na denn, zum Testen ob der Timer überhaupt anläuft,

Nö. Dafür braucht er dafür schon sowas:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3

4
unsigned char count;
5
unsigned char count2;
6

7
ISR( TIMER0_OFV_vect )
8
{
9
  PORTB = count++;
10
}
11

12
int main()
13
{
14
  DDRB = 0xFF;
15

16
  TIMSK = ( 1 << TOIE0 );
17
  TCCR0 = ( 1 << CS00 ) | ( 1 << CS01 );
18

19
  sei();
20

21
  while( 1 ) 
22
  {
23
      PORTA = count2++;
24
  }
25
}

:-)

Oliver

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