Forum: Mikrocontroller und Digitale Elektronik atiny13 timerinterrupt


von udo (Gast)


Lesenswert?

HALLO,

dieses kleine Programm will auf dem atiny13 nicht laufen. Auf dem 
ATMEGA16 läuft es, mit den entsprechenden Änderungen des TCCR0B und 
TIMSK0.

Über AVRSTUDIO 5 flashe ich den tiny13. Habe die aktuelle WINAVR in 
Betrieb.

Der FLASHVORGANG erfolgt fehlerlos, bloß die LED blinkt nicht.

Es ist nur die FUSE SPIEN angeklickt und SUT_CKSEL mit 9,6MHZ 
ausgewählt.

Habe den Verdacht, dass der TIMER0 nicht anläuft. Fehlt etwas im 
Programmcode?

Hat jemand einen TIP? Die Hardware ist o.k.


1
#include <avr/io.h>
2
#include <avr/interrupt.h>  
3
4
//###################### TIMER 0  Zeitschleifen  ######################
5
6
ISR(TIMER0_OVF_vect)       
7
  
8
{
9
  
10
  PORTB ^= ( 1 << PB0 );
11
12
}  // Ende ISR
13
14
15
int main()
16
{
17
  
18
  TCCR0B |= (1<<CS00 | 1<<CS02);     
19
  TIMSK0 |= (1<<TOIE0);    
20
                
21
  sei();       // enable timer interrupt
22
  DDRB |=( 1 << PB0 );        // PB0 an PORTB als Ausgang setzen
23
    
24
25
  while(1)          
26
      {
27
    } // Ende while
28
29
  return 0;
30
} //Ende main

von Hubert G. (hubertg)


Lesenswert?

Im AVR-Studio4 heisst die ISR: ISR(TIM0_OVF_vect)

von Uwe (de0508)


Lesenswert?

habe ich richtig gerechnet, die led flakert mit 18,3Hz ?
TIMSK0 und TCCR0B sind für den tiny13 schon richtig.

diese bits würde ich setzen.
-U lfuse:w:0x7a:m -U hfuse:w:0xff:m

siehe : http://www.engbedded.com/fusecalc/

von Hubert G. (hubertg)


Lesenswert?

9,6MHz  1024  2 ist bei mir etwas mehr als 18,3Hz

von Vlad T. (vlad_tepesch)


Lesenswert?

kann es sein, dass du den Programmer noch dranhängen hast?
PB0 ist Master Out. dH dein Tiny treibt eventuell gegen den Prommer.

von Hannes L. (hannes)


Lesenswert?

Hubert G. schrieb:
> 9,6MHz  1024  2 ist bei mir etwas mehr als 18,3Hz

Stimmt, allerdings braucht der Timer auch noch 256 Ticks bis zum 
Überlauf...

...

von Vlad T. (vlad_tepesch)


Lesenswert?

Hubert G. schrieb:
> 9,6MHz  1024  2 ist bei mir etwas mehr als 18,3Hz
>

wie kommst du auf 1024 und 2

der Timer ist 8bit, der Prescaler ist 8
9,6Mhz / 256 / 8

das macht 4,7kHz
Da kann man natürlich auch nix flackern sehen

für die meisten AVRs kann man übrigends statt
  PORTB ^= ( 1 << PB0 );
auch schreiben:
  PINB = ( 1 << PB0 );
letzteres ist schneller.
Da der alte wert nicht erst eingelesen und verreichnet werden muss

von Hubert G. (hubertg)


Lesenswert?

@Vlad Tepesch
Da liegen wir beide falsch.
CS00 und CS02 sind Prescaler 1024
Ich habe die Ticks vergessen und die Led leuchtet nur bei jedem zweiten 
Überlauf.

von Vlad T. (vlad_tepesch)


Lesenswert?

Hubert G. schrieb:
> @Vlad Tepesch
> Da liegen wir beide falsch.
> CS00 und CS02 sind Prescaler 1024
> Ich habe die Ticks vergessen und die Led leuchtet nur bei jedem zweiten
> Überlauf.

Hast recht.
komme ich denn nur auf 8??? Ich hatte doch extra in die Tabelle 
geschaut.

also stimmen die ~18Hz ist natürlich immer noch recht schnell, sollte 
jedoch wahrnembar sein..
Ich tippe weiterhin auf den Programmer ;)

edit:
noch eine Frage, nur um sicher zu gehen:
Den Targettyp hast du im Studio umgestellt auf Tiny13?

von Uwe (de0508)


Lesenswert?

Also die Zahl, die ich oben geschrieben habe..

von udo (Gast)


Lesenswert?

hallo,

danke für eure Beiträge.

Habe mit dem Oskar an PB0 gemessen. Der Port bleibt auf 0V hängen. Keine 
Aktivität. Das Programm ist doch o.k? Oder?

Meine konkrete Frage:

Ich muss doch mindestens ein "CS-Bit" setzen, damit der Timer überhaupt 
läuft oder?

Mit TCCR0B |= (1<<CS00 | 1<<CS02) wird der Takt auf 1/1024 geteilt.

Wenn die CS-Bits auf "0" bleiben, dann läuft der Timer nicht. Oder ist 
das beim ATINY13 anders, als bei den MEGAS?

Bei den Fuses habe ich laut Empfehlung CKDIV8 angeklickt. Bedeutet das 
nochmals eine Teilung durch 8?

Also 9,6 MHZ geteilt durch 8 (CKDIV8) und dann noch die beiden CS-Bits 
(1024). Das würde doch bedeuten, dass der Takt bei 1,2Khz liegt. Kann 
das sein?

von Vlad T. (vlad_tepesch)


Lesenswert?

das steht alles im Datenblatt.

für CS2:0 :
0 -> timer aus
5 -> 1024

wenn div8 gesetzt ist (Werkseinstellung) wird der Takt duch 8 geteilt.
mit internen Takt läuft er also dann auf 1,2Mhz

toggle den Pin doch mal im Hauptrogramm mit einem ausreichend lagem 
delay dazwischen um zu schauen, ob der Pin überhaupt noch funktioniert

von Hubert G. (hubertg)


Lesenswert?

Hast du den ISR Aufruf schon geändert?  ISR(TIM0_OVF_vect)
Du müsstest ein Warning bekommen und es funktioniert sonst sicher nicht.

von udo (Gast)


Lesenswert?

Hallo,

habe es auch mit toggeln probiert. Ebenfalls hatte ich schon die ISR mit 
(TIM0_OVF_vect) aufgerufen im TINY13 Device. Es kam auch keine 
Warnmeldung, als ich aus dem ATMEGA16 Programm die Syntax der 
ISR(TIMER0_OVF_vect) irrtümlich kopiert hatte.

Kurzum:

Ich ätze mir noch einmal eine neue Platine. Vielleicht ist irgendwo im 
Layout irgendetwas nicht o.k. Steckt manchmal der Wurm drin.

Wenn es wieder nicht funktioniert, melde ich mich noch mal. Gehe aber 
davon aus, dass es funktioniert, weil das obige Programm wohl o.k. ist, 
mit Ausnahme der ISR Syntax

Danke an alle!!!

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.