mikrocontroller.net

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


Autor: Gizmo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hast du Interupts aktiviert mit sei?

Autor: Gizmo (Gast)
Datum:

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Gizmo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gizmo wrote:

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

Datenblatt??

http://www.mikrocontroller.net/articles/AVR_Fuses#...

Autor: Gizmo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Jörg

was wäre der richtige interrupt handler ?

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gizmo wrote:

> was wäre der richtige interrupt handler ?

TIMER0_COMP_vect

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

Autor: Gizmo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht 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??

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gizmo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Gizmo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht 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#...

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na denn, zum Testen ob der Timer überhaupt anläuft, sollte das reichen

#include <avr/io.h>
#include <avr/interrupt.h>

unsigned char count;

ISR( TIMER0_OFV_vect )
{
  PORTB = count++;
}

int main()
{
  DDRB = 0xFF;

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

  sei();

  while( 1 ) {
  }
}

Viel Spass.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Na denn, zum Testen ob der Timer überhaupt anläuft,

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

unsigned char count;
unsigned char count2;

ISR( TIMER0_OFV_vect )
{
  PORTB = count++;
}

int main()
{
  DDRB = 0xFF;

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

  sei();

  while( 1 ) 
  {
      PORTA = count2++;
  }
}

:-)

Oliver

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.