Forum: Mikrocontroller und Digitale Elektronik Timer- Interuppt- Problem


von Holger F. (minimaxus)


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.

von Karl H. (kbuchegg)


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.

von Karl H. (kbuchegg)


Lesenswert?

Oder man kann sich überhaupt gleich mal eine Uhr bauen (weil du von 
Turmuhr sprichst) bzw. die in BASCOM bereits eingebaute nehmen. Im 
Programm wird dann ständig die Uhr geprüft und wenn die Minuten auf 0 
sind und die Sekunden kleiner als 11 sind, dann wird die Bimmel 
eingeschaltet und ansonsten eben ausgeschaltet.

von Holger F. (minimaxus)


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

von Karl H. (kbuchegg)


Lesenswert?

Logisch denken
1
On Timer Isr_von_timer1

on Timer ... also wenn ein Timer Overflow stattfindet. Wenn aber jetzt 
ein µC mehrere Timer hat, welcher ist es denn?

von Karl H. (kbuchegg)


Lesenswert?

Holger Frisch schrieb:

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

Aber beim Tiny85 ist der Timer1 ein 8 Bit Timer

von MWS (Gast)


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.

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.