ATTINY 13 mehre Programmteile synchron laufen lassen?

Gast #2376937
Lesenswert?

Hallo,

bin ziemlich neu im Bereich der Mikrocontrollertechnik.

Meine Frage ist nun ob ich nicht zwei Programmteile synchron ablaufen 
lassen kann, oder wie ich in den schon beschrieben Bereich springen 
nachdem kein Interrupt Signal mehr kommt?

Programmiert habe ich das ganze mit Bascom.
Vielleicht hat einer ne gute Idee :)
mfg
Tobi

1
$regfile = "attiny13.dat"
2
$crystal = 1200000
3
$hwstack = 16
4
$swstack = 5
5
$framesize = 16
6

7

8
'Impulseingang an PB1
9

10
Config Int0 = Change
11
Enable Interrupts
12
Enable Int0
13
On Int0 Sprung0
14

15
'Lautsprecher an PB3
16
Speaker Alias Portb.3
17
Config Speaker = Output
18

19
'Notaus an PB4
20
Aus Alias Portb.4
21
Config Aus = Output
22

23
'Frequenzgenerator
24
Dim I As Integer
25

26
Config Portb.5 = Input                                      ' Poti Pin1
27
Config Portb.0 = Output                                     ' Takt Pin2
28

29
Config Adc = Single , Prescaler = Auto , Reference = Avcc
30
Start Adc
31

32

33

34
Do
35
   I = 1024 - Getadc(0)
36
   Do
37
      Waitms 1
38
      Decr I
39
   Loop Until I = 0
40
   Toggle Portb.0
41

42

43

44
Loop
45

46
'wie kann ich hier hin springen falls sprung0 nach mehr als 2 sekunden nicht mehr aktiviert war 
47

48
Speaker = 1
49
Wait 5
50
Aus = 1
51

52

53
End
54

55
Sprung0:
56

57
Aus = 0
58
Speaker = 0
59

60
Return
Gast #2376940
Lesenswert?

Laß das Springen, pack deine Programmfunktionen in Blöcke und 
kontolliere den Ablauf über bedingte Ausführung (if, do, while, 
until,...) dieser Blöcke. Sonst wird es unübersichtlich und irgendwann 
unkontrollierbar.
#2376953
Lesenswert?

> Programmiert habe ich das ganze mit Bascom.
> Vielleicht hat einer ne gute Idee :)

Ja. Vergiss die Idee, du könntest "2 Programme, die du unabhängig 
voneinander entwickelt hast, ganz einfach in eines zusammenkopieren"

Diese Denkweise bringt dich nicht weiter.

Statt dessen musst du die beiden unabhängigen 'Programme' Staubsauegn 
und Gulasch kochen so zusammenbringen, dass du 1 Sekunde Staub saugst 
und 1 Sekunde Gulasch umrührst. Dann wieder 1 Sekunde staubsaugen und 
wieder 1 Sekunde Gulasch umrühren.
Im Endeffekt hast du damit 'gleichzeitig' die Küche gestaubsaugt und 
Gulasch gekocht. Auch wenn keiner der Vorgänge genau so abgelaufen ist, 
wie wenn du nur ein Gulasch hättest kochen müssen.
Gast #2376958
Lesenswert?

Hi,
danke für die schnelle Antwort.
Ich finde aber leider keine Lösung um es mit einer if anweisung 
hinzubekommen, da im Normalfall ein Impuls an int0 anliegt und der 
Lautsprecher und somit auch Notaus sollen erst angehen, wenn kein 
Impulssignal ankommt.
Das Problem ist nun, dass das Impulssignal von Durchflussmesser einer 
Wasserkühlung kommt und dieser bei Stillstand sowohl logisch0 als auch 
logisch 1 sein kann.
#2376966
Lesenswert?

Tobi schrieb:
> Hi,
> danke für die schnelle Antwort.
> Ich finde aber leider keine Lösung um es mit einer if anweisung
> hinzubekommen, da im Normalfall ein Impuls an int0 anliegt und der
> Lautsprecher und somit auch Notaus sollen erst angehen, wenn kein
> Impulssignal ankommt.
> Das Problem ist nun, dass das Impulssignal von Durchflussmesser einer
> Wasserkühlung kommt und dieser bei Stillstand sowohl logisch0 als auch
> logisch 1 sein kann.


Du musst deine Denkweise umstellen.

Wie würdest du selbst das machen, wenn du immer nur kurz auf den Einfang 
schauen darfst. Zwar sehr schnell aber immer nur kurz hinschauen. Diesen 
Ablauf packst du in die zentrale

Do

  ... hier ist die Programmlogik
  ... du schaust einmal auf den Eingang und entscheidest mithilfe dessen
  ... was du siehst, was du zu tun hast.

Loop
Gast #2376995
Lesenswert?

Karl Heinz Buchegger schrieb:
> Klarer Fall für einen Timer.
> Dein Schleifen runterzählen war sowieso Murks.

kann ich den timer laufen lassen

hab das ganze nun mal mit nem timer versucht

glaubst das ganze funktioniert so?
oder beißen sich die beiden Interrupts?


$regfile = "attiny13.dat"
$crystal = 1200000
$hwstack = 16
$swstack = 5
$framesize = 16


'Impulseingang an PB1

Config Int0 = Change
Enable Interrupts
Enable Int0
On Int0 Sprung0

'Lautsprecher an PB3
Speaker Alias Portb.3
Config Speaker = Output

'Notaus an PB4
Aus Alias Portb.4
Config Aus = Output

'Timer
Config Timer0 = Timer , Prescale = 64
Enable Timer0
On Timer0 Sprung1



Do
Wait 1
Speaker = 1
Wait 5
Aus = 1

Loop
End

Sprung0:
Speaker = 0
Aus = 0


Sprung1:

Toggle Portb.0

Return
#2377001
Lesenswert?

> oder beißen sich die beiden Interrupts?

* Den Pin Interrupt brauchst du nicht wirklich
  Den könnte man daher los werden

* Ich hab die Timer vom Tiny13 nicht im Kopf.
  Aber mindestens einen Modus, in dem der Timer ganz von alleine
  einen Pin toggelt, haben eigentlich alle AVR-Prozessoren.
Gast #2377043
Lesenswert?

Das funktioniert so nicht.

Versuche mal einen anderen Weg, dafür sind ja Interrupts hervorragend 
geeignet.
- Timerinterrupt programmieren (overflow) der alle 0,1s in die Routine 
springt
- Hier eine vorher globalen Variable erhöhen, falls diese über 20 
(=2sec) ist dein Notprogramm aufrufen.

- in deinem INT0-Interrupt wird diese globale Variable jedesmal auf 0 
gesetzt, solange dies geschieht wird dein Notprogramm auch nicht 
aufgerufen.

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