Forum: Mikrocontroller und Digitale Elektronik ATTINY 13 mehre Programmteile synchron laufen lassen?


von Tobi (Gast)


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
von I.N.&B.S. (Gast)


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.
von Karl H. (kbuchegg)


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.
von Tobi (Gast)


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.
von oha (Gast)


Lesenswert?

Man ueberlegt sich welche Programmteile ohne warten durchlaufen und 
haengt die hintereinander. Waehrend man im einem Programm warten muesste 
arbeitet man mit dem anderen Programmteil.
von Tobi (Gast)


Lesenswert?

Was ich ganz vergessen habe, der Frequenzgenerator muss immer laufen bzw 
immer eine konstante Frequenz ausgeben
von Karl H. (kbuchegg)


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
von Karl H. (kbuchegg)


Lesenswert?

Tobi schrieb:
> Was ich ganz vergessen habe, der Frequenzgenerator muss immer laufen bzw
> immer eine konstante Frequenz ausgeben

Klarer Fall für einen Timer.
Dein Schleifen runterzählen war sowieso Murks.
von Tobi (Gast)


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
von Karl H. (kbuchegg)


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.
von Tobi (Gast)


Lesenswert?

gibt es eine möglichkeit eine if anweisung so zu schreiben:

if portb.1=1 'für 2 sekunden or portb.1=0 'für 2 sekunden
then.....
von GeGe (Gast)


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.
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.