Forum: Mikrocontroller und Digitale Elektronik Timer1 extern takten


von Micha R. (michaavr)


Lesenswert?

Hallo,

wie kann ich einen ATMega 8 mit Bascom dazu bringen, den Timer1 mit nem 
externen Takt hochzuzählen?

Wie muß ich den Timer1 Konfigurieren?

von Sebastian (Gast)


Lesenswert?

"Clock Select" für Timer 1 auf "External Clock" (=> Datenblatt)
Dann den Takt an den entsprechenden Pin anlegen ("T1" heißt der mein 
ich)

von Micha R. (michaavr)


Lesenswert?

Danke für deine Antwort.

mir geht es aber um die Register, wie ich die setzen muß.
Ich probiere jetzt schon sein 4 Stunden und ich kriege den T1 nicht auf 
den Zähler durchgeschaltet.

Wie müssen die Register TCCR1A, TCCR1B gesetzt werden?
Muß ich weitere Register oder Bits setzen?

von Sebastian (Gast)


Lesenswert?

=> http://www.atmel.com/dyn/resources/prod_documents/doc2486.pdf

TCCR1A = 0;
TCCR1B = (1 << CS10) | (1 << CS11) | (1 << CS12); /* Wert 0x07, 
Extclock, rising edge */
(C-Syntax, weiß nicht wie das in Bascom aussehen muss...)

Würd ich jetzt spontan sagen...

von Sebastian (Gast)


Lesenswert?

Ach ja: Seite 100 im verlinkten Datasheet

Kann man hier irgendwie editieren?

von Micha R. (michaavr)


Lesenswert?

Hi Sebastian,

habe die Register geprüft.
TCCR1A ist 0 gesetzt und TCCR1B ist (dezimal) 7.
Der Simulator zeigt dies an. Trotzdem gehts nicht.

Im Datenblatt (Seite 100) ist die Tabelle mit der 
Clock-Select-Description. Direkt darunder steht noch ein Satz, den ich 
nicht verstehe.

Soll ich den Pin D5 (T1) wirklich als Ausgang schalten? Oder verstehe 
ich das falsch? Da steht Software-Control des Zählers.

Was bedeutet dieser Satz?

Hier mal der Quellcode von mir:
1
' MCU:         ATmega (noch nicht genau definiert / 8 oder 16 ist pinabhängig)
2
' Clock:       3,686400MHz
3
4
5
6
' Beschreibung:
7
' Frequenz-Zähler
8
9
10
$regfile = "m8def.dat"                                      ' ATMega8
11
'$regfile = "m16def.dat"                                     ' ATmega16
12
$Crystal = 3686400                                          ' Takt extern 3,6864MHz
13
$hwstack = 32
14
$swstack = 24
15
$framesize = 24
16
17
$baud = 9600
18
19
' -----------------------------------------------
20
' Konstanten und Variablen
21
' -----------------------------------------------
22
23
Dim ZeitBasisCount as Byte
24
Dim Flags as Byte
25
Dim Zaehlerstand as Word
26
27
LEDRed Alias PortC.2
28
config LEDRed = output
29
30
31
' -----------------------------------------------
32
'     Zeitbasis mit Timer2 konfigurieren
33
' -----------------------------------------------
34
35
   on oc2 ISR_Zeitbasis
36
   enable oc2
37
   config Timer2 = Counter , Prescale = 256 , Clear Timer = 1
38
   compare2 = 144 - 1
39
   start Timer2
40
   enable interrupts
41
42
' -----------------------------------------------
43
'     Zähler-Eingang mit Timer1 konfigurieren
44
' -----------------------------------------------
45
46
   'on tov1
47
   'enable tov1
48
   config Timer1 = counter , Edge = Rising
49
   tccr1a = 0
50
   tccr1b = 7
51
   'portd.5 = 0
52
   'config portd.5 = output
53
54
' -----------------------------------------------
55
56
'                 Hauptschleife
57
58
' -----------------------------------------------
59
60
61
do
62
   If Flags.0 = 1 then
63
      Flags.0 = 0
64
      toggle LEDRed
65
      print Zaehlerstand
66
   end if
67
Loop
68
69
End
70
71
' OC2-Interrupt von Timer 2
72
' wird alle 0,01 Sekunden aufgerufen
73
ISR_Zeitbasis:
74
   incr ZeitBasisCount
75
   if ZeitBasisCount = 50 then
76
      Zaehlerstand = timer2
77
      ZeitBasisCount = 0
78
      Timer2 = 0
79
      Flags.0 = 1
80
   end if
81
Return

von Micha R. (michaavr)


Lesenswert?

Hallo Leute,

vielen Dank für eure Hilfe.
Den Fehler konnte ich jetzt finden.

Es lag nicht an den Registern.
Sondern meine Output-Compare2 Interruptroutine war falsch.

Ich Dödel (ups) muß doch den Timer 1 zurücksetzen und auch diesen 
auslesen!


' OC2-Interrupt von Timer 2
' wird alle 0,01 Sekunden aufgerufen
ISR_Zeitbasis:
   incr ZeitBasisCount
   if ZeitBasisCount = 50 then
      Zaehlerstand = timer2
      ZeitBasisCount = 0
      Timer2 = 0
      Flags.0 = 1
   end if
Return

Jetzt funzt es! :)

Danke an alle!

Gruß Mitch

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.