atiny13 timerinterrupt

Gast #2278339
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
#2278429
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
#2278452
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?
Gast #2278571
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?
#2278612
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
Gast #2280785
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!!!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren