www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 8-Bittimer und Interrupts :(


Autor: S. S. (-xc-)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
abend..

vorweg frequenzen/prescaler usw. sind total bescheuert gewählt aber egal 
mir geht es ums prinzip..

das ganze soll letztlich ein binärzähler sein der im sekundentakt 
hochzählt....dummerweise tut er das nicht er ist einfach dauer an :P
unabhängig davon ob ich den uC mit 16MHZ oder 1MHZ laufen lasse...

die leds hängen an PORTC 0-3

das original beispiel kommt aus dem gcc tutorial. allerdings 
funktionierte das nicht da einige bezeichnungen und register scheinbar 
falsch waren.

erste frage: wenn der zähler 255 erreicht hat und umspringt, wird dann 
ein interrupt ausgelöst?
im original beispiel war extra eine zahl definiert an der der interrupt 
ausgelöst wird.
das register gibt es nur leider nicht welches dort verwendet wird:
OCR0=125;
beim lesen der atmega dokumentation hörte es sich aber so an als würde 
beim 255 -> 0 ein overflow produziert....daher habe ihc mir gedacht 
nehme ich den und rechne es mir passend...

die hier genutzten zahlen sind für ein 16MHZ quarz ausgelegt.

seht ihr auf anhieb fehler?

gute nacht

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

volatile int zahler, sek;
main()
{
//Timer 0 konfigurieren
DDRC = 0x0F;  //definiert portC ping 0-3 als ausgang
PORTC = 0x0F;  //setzt die ausgänge 0-3 vom port C auf logisch 0
TCCR0 = (1<<CS00) | (1<<CS02);   //1024er prescaler

 

   TIMSK|=(1<<TOIE0);  //timer overflow interrupt
   sei();               //Globale Interrupts aktivieren
   while(1)
   {
    PORTC=sek;
  _delay_ms(200);
   }
 
}
 
 
ISR(TIMER0_COMP_vect)
{
  zahler +=159;

  if(zahler >=10000) {sek++; zahler -= 10000;}

}

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>   TIMSK|=(1<<TOIE0);  //timer overflow interrupt

>ISR(TIMER0_COMP_vect)

Das ist der falsche ISR Name für den overflow Interrupt.

Autor: Thomas R. (tinman) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
/* Timer/Counter0 Compare Match */
#define TIMER0_COMP_vect    _VECTOR(10)
#define SIG_OUTPUT_COMPARE0    _VECTOR(10)

/* Timer/Counter0 Overflow */
#define TIMER0_OVF_vect      _VECTOR(11)
#define SIG_OVERFLOW0      _VECTOR(11)

Autor: S. S. (-xc-)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke für die hilfe!

das hätte ich nie gefunden...

ich hoffe mal das ist der einzige fehler...

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich mache sowas mit dem compare des timers

in das OCR register schreibe ich den wert der sih aus ( 
F_CPU/(prescaler* (1/ zeit) )  )  errechnet

damit ist man zumindest in grenzen abgedeckt

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also 16bit timer zB
1024er prescaler
compare modus  ( CTC ) einschalten

#define zeit  ( F_CPU/(1024*1) )


in
OCRAH = zeit>>8 ;
OCRAL = zeit;

die
ISR(TIMER0_COMP_vect)
{
}
sollte nun alle 1 sek ausgeführt werden


solange in der configuration der richtige F_CPU wert steht ist das alles 
kein thema

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
S. S. schrieb:
> im original beispiel war extra eine zahl definiert an der der interrupt
> ausgelöst wird.
> das register gibt es nur leider nicht welches dort verwendet wird:
>
OCR0=125;
> 

Es drängt sich mir der Eindruck auf, daß es vielleicht nicht ganz unklug 
wäre, wenn Du endlich mal den AVR-Typ nennen würdest.

Sonst reden hier alle noch Ewigkeiten aneinander vorbei.


Peter

Autor: S. S. (-xc-)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
meiner ist ein atmega 8

im tutorial wird ein AT90S2313 (bin mir aber nicht 100% )

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.