Timer- Interuppt- Problem

#3201624
Lesenswert?

Guten Morgen,

ich suche eine Idee, wie man nach genau einer Stunde einen pin für 10 
sec. einschaltet
und dann wieder ausschaltet.
Brauche für meine Garteneisenbahn einen " Taktgeber" für die 
"Turmuhrglocke" .
Mit "wait" wird es nichts, da jedesmal zur vollen Stunde eben die 10 
sec. aufaddiert werden.
Und so eine steigende Ungenauigkeit quasi mit einprogrammiert wird.
Die Lösung liegt wahrscheinlich in der "Interrupt"- Steuerung. Da ja 2 
voneinander unabhängige Prozesse
simultan verlaufen sollen.
Bei meinem "Schweißlicht" war es nicht so problematisch.
Ich programmiere in dem hier so gern gesehenen BASCOM. ;)
Als Prozessoren habe ich ATTINY13  45  44 und ATMEGA8 da, Quartz 4Mhz 
/ 8 Mhz.

Vielen Dank für Unterstützung jeglicher Art.
Gruß Minimaxus.
#3201632
Lesenswert?

Holger Frisch schrieb:
> Guten Morgen,
>
> ich suche eine Idee, wie man nach genau einer Stunde einen pin für 10
> sec. einschaltet
> und dann wieder ausschaltet.
> Brauche für meine Garteneisenbahn einen " Taktgeber" für die
> "Turmuhrglocke" .
> Mit "wait" wird es nichts, da jedesmal zur vollen Stunde eben die 10
> sec. aufaddiert werden.

Du wirst ja doch wohl von 1 Stunde (=3600 Sekunden) 10 Sekunden abziehen 
können um damit zu errechnen, dass vom Ende ds Bimmelns bis zum Beginn 
des nächsten Bimmelns 3590 Sekunden vergehen müssen.

> Und so eine steigende Ungenauigkeit quasi mit einprogrammiert wird.
> Die Lösung liegt wahrscheinlich in der "Interrupt"- Steuerung. Da ja 2
> voneinander unabhängige Prozesse

Interrupts sind schon ok. Aber aus einem anderen Grund.
Was du brauchst ist ein Taktgeber. In Form eines Timers, der in 
regelmässigen Zeitabständen deine Interrupt Routine aufruft. Zum 
Beispiel alle 1 Sekunde (muss aber nicht 1 Sekunde sein, rechnet sich 
nur leichter). Und der Rest - na der ist einfach mitzählen. Bei jedem 
Interrupt Aufruf wird ein Zähler erhöht und bei bestimmten Zählerständen 
werden dann Aktionen gemacht (wie zb das Bimmeln ein oder ausschalten) 
und der Zähler gegebenenfalls wieder auf 0 gesetzt- Und ja, man darf 
ruhig auch mehrere Variablen haben, die in der Interrupt Funktion 
verschiedene Dinge abzählen.
#3207796
Lesenswert?

Hallo,

danke für die Hinweise.

Im Anhang mal mein Programm. Es läuft soweit auf einem ATMEGA88.

Dieses Programm soll nun in einen Tiny45/ 85 oder 44 eingebrannt werden.

Ich ändere die Pins und trage die *def.dat ein,nun gibt es eine 2 
Fehlermeldungen .
1
$regfile = "attiny85.dat"                      'Prozessortyp
2
$crystal = 8000000                             'Taktfrequenz 8MHz Quarz
3

4
Config Portb = Output                          'PortB ist Ausgang
5
Config Timer1 = Timer , Prescale = 256         'Konfiguriere Timer1
6
Enable Timer1                                  'schalte den Timer1 ein
7
On Timer Isr_von_timer1            'bei Timer1- Überlauf zu ISR_von_Timer1
8
Enable Interrupts                              'Interrupts freigeben
9
Timer1 = 34285
10
 Dim A As Word                      'Timer1 soll von 34285 wegzählen
11
 A = 0
12
 Portb.2 = 0                              ' Variable A auf 0 setzen
13

14
Do                                         ' Mainloop
15
   If A = 6000 Then Gosub Min
16

17
Loop
18

19
Isr_von_timer1:                            'ISR von Timer1
20
Timer1 = 34285                             'Timer1 zählt von 34285 weg
21
Toggle Portb.0                             'schaltet Portb.0 im Sekundentakt= Kontrolle
22

23
                                           ' Variable
24
A = A + 1
25

26
Return
27

28
Min:
29
Sound Portb.1 , 400 , 450                  ' Testton
30
A = 0                                      ' Variable A auf 0 setzen
31
Portb.2 = 1                                ' Schaltausgang "an" Startimpuls für Gong
32
Waitms 2000                                ' 2 sek. "anlassen"
33
Portb.2 = 0
34
                                           ' Schaltausgang "aus"
35
Return


Error: 117 Line:7 Unknow interrupt [TIMER], in File

Error: 46 Linie: 9 Assignment error [TIMER1:0 34285:112]

Meine BASCOM- Version 1.11.9.1.

Was ist nun wieder falsch ?  Die genannten Proz. haben doch jeweils 
einen Timer1 .

Viele Grüße

Minimaxus
Gast #3207833
Lesenswert?

Holger Frisch schrieb:
> Meine BASCOM- Version 1.11.9.1.

Die Version hat ja ein gesegnetes Alter, meiner Erinnerung nach wurden 
Probleme mit Timer1 bei diesem Prozessortyp erst bei neueren Versionen 
behoben. (Der Timer1 im ATiny25/45/85 hat ein paar Spezialfähigkeiten)

Timer0 hingegen sollte auch in der Uraltversion keine Probleme machen.

Nebenbei sollten Stacks und Frame ausreichend dimensioniert werden, 
schon wegen des Timerinterrupts. Wird der Code nur ein wenig komplexer, 
gibt's sonst Probleme.

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