Forum: Compiler & IDEs atmega64 8 bit timer läuft nicht


von Gizmo (Gast)


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.

von Ich (Gast)


Lesenswert?

hast du Interupts aktiviert mit sei?

von Gizmo (Gast)


Lesenswert?

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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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?

von Gizmo (Gast)


Lesenswert?

Hallo

Jörg danke für deine Antwort mein atmega 64 läuft mit internem 
oszillator auf 8 Mhz das calibration byte ist geschrieben.

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

von Justus S. (jussa)


Lesenswert?

Gizmo wrote:

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

Datenblatt??

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

von Gizmo (Gast)


Lesenswert?

Hi Jörg

was wäre der richtige interrupt handler ?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Gizmo wrote:

> was wäre der richtige interrupt handler ?

TIMER0_COMP_vect

Das ist der Name aus dem Datenblatt, "_vect" angehängt.

von Gizmo (Gast)


Lesenswert?

hi jörg

wenn ich den von dir genannten interrupt vektor verwende bekomme ich 
folgendes warning.
: warning: 'TIMER1_COMP_vect' appears to be a misspelled signal handler

von Justus S. (jussa)


Lesenswert?

Gizmo wrote:
> hi jörg
>
> wenn ich den von dir genannten interrupt vektor verwende bekomme ich
> folgendes warning.
> : warning: 'TIMER1_COMP_vect' appears to be a misspelled signal handler

wie wäre es dann jetzt mal mit einem Blick ins Datenblatt??

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Gizmo wrote:

> wenn ich den von dir genannten interrupt vektor verwende bekomme ich
> folgendes warning.

Den habe ich nicht vorgeschlagen...

Aber der Vektorname ist ein Schönheitsfehler, nicht dein eigentliches
Problem.  Das wird wohl nach wie vor die M103C-Fuse sein.

von Gizmo (Gast)


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

von Karl H. (kbuchegg)


Lesenswert?

Nochmal:
Solange du die M103 Fuse nicht korrekt einstellst, stürzt dein µC beim 
ersten Funktionsaufruf ab.
Solange diese Fuse nicht korrekt steht (und bei einem nagelneuen M128 
steht sie falsch!) ist es sinnlos, sich über andere Fehler Gedanken zu 
machen.

von Justus S. (jussa)


Lesenswert?

Gizmo wrote:

> sprich der timer läuft garnicht erst an.
>
> *heul*

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

was red ich, du ignorierst ja eh alles...

von Gizmo (Gast)


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

von Justus S. (jussa)


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...

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.)

von Karl H. (kbuchegg)


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.

von Oliver (Gast)


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

von Karl H. (kbuchegg)


Lesenswert?

Oliver wrote:
>>Na denn, zum Testen ob der Timer überhaupt anläuft,
>
> Nö. Dafür braucht er dafür schon sowas:

Hast recht. Könnte ja auch noch ein Fehler beim Flashen sein.
Aber den PORTA noch auf Ausgang setzen.

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.