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


von S. S. (-xc-)


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:
1
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

1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <avr/delay.h>
4
 
5
6
volatile int zahler, sek;
7
main()
8
{
9
//Timer 0 konfigurieren
10
DDRC = 0x0F;  //definiert portC ping 0-3 als ausgang
11
PORTC = 0x0F;  //setzt die ausgänge 0-3 vom port C auf logisch 0
12
TCCR0 = (1<<CS00) | (1<<CS02);   //1024er prescaler
13
14
 
15
16
   TIMSK|=(1<<TOIE0);  //timer overflow interrupt
17
   sei();               //Globale Interrupts aktivieren
18
   while(1)
19
   {
20
    PORTC=sek;
21
  _delay_ms(200);
22
   }
23
 
24
}
25
 
26
 
27
ISR(TIMER0_COMP_vect)
28
{
29
  zahler +=159;
30
31
  if(zahler >=10000) {sek++; zahler -= 10000;}
32
33
}

von holger (Gast)


Lesenswert?

>   TIMSK|=(1<<TOIE0);  //timer overflow interrupt

>ISR(TIMER0_COMP_vect)

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

von Thomas R. (tinman) Benutzerseite


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)

von S. S. (-xc-)


Lesenswert?

danke für die hilfe!

das hätte ich nie gefunden...

ich hoffe mal das ist der einzige fehler...

von gast (Gast)


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

von gast (Gast)


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

von Peter D. (peda)


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:
>
1
OCR0=125;
2
>

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

von S. S. (-xc-)


Lesenswert?

meiner ist ein atmega 8

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

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.