Sekundentimer mit ATMEGA88V

Gast #2028367
Lesenswert?

Hallo, bin noch Anfänger,
dachte mir vielleicht kann mir hier jemand schnell weiterhelfen.
Ich versuche über den Timer1 einen Sekunden-Interrupt zu erzeugen.
Im Testszenario will ich an einem B-Pin eine LED b linken lassen.
Das klappt auch, nur blinkt die LED viel zu langsam. Der interrupt wird 
ca alle 8 Sekunden ausgeführt.. Also die Zahl 8 ist ja schon komisch, 
aber dachte ich hätte alles richtig eingestellt.

1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3

4

5
int main(void)
6
{
7

8
  TCCR1B = (1<<CS12);  // Timer 1 mit 256 prescale starten
9
  TIMSK1 = 0x1;    // Overflow Interrupt setzen
10
  TCNT1H = 0x88;    // für 1 Hz
11
  TCNT1L = 0xee;
12

13
  sei();  // Global Interrupts aktivieren
14

15
  DDRB = 0xff;
16

17
  while(1)
18
  {
19
  }
20
  return 0;
21
}
22

23
ISR (TIMER1_OVF_vect)
24
{
25
  TCNT1H = 0x88;  // für 1 Hz
26
  TCNT1L = 0xee;
27
  PORTB ^=0xff;
28
}
Angehängte Dateien:
Gast #2028378
Lesenswert?

Ok, ansonsten ist mein Versuch also korrekt.
Das beruhigt ja schon mal.

Allerdings kann ich nirgends die Einstellugn "1Mhz" finden,
ich finde in den Fuses folgendes:

SUT_CKSEL:
Int. RC Osc. 8 MHz; Start-up time PWRDWN/RESET: 6 CK/14 CK + 65 ms

Daher hätte ich gedacht, dass der schon mit 8MHz läuft.

Wie kriege ich den denn mit Sicherheit auf 8Mhz ?
Persönliche Seite #2028382
Lesenswert?

Wieso benutzt du die gespaltenen Register?
In C brauchst du das nicht!
Und kleine Eigenwerbung: Man kann zawr die Formeln aus dem Datenblatt 
benutzen, Software geht aber auch! Hier gibts den AVRTimerCalculator:
http://apexys-toan.blogspot.com/2011/01/avrtimercalculator.html
Kleiner Tipp:
Es ist ziemlich kompliziert, immer wieder die Timerregister zu setzen.
Mach doch CTC mit dem OCR1A (siehe Datenblatt)!

Mit freundlichen Grüßen,
Valentin Buck

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