Forum: Mikrocontroller und Digitale Elektronik Status/Pulse auswerten mit BASCOM


von Max Wild (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen!

Ich komme bei einem Problem mit BASCOM nicht weiter. Folgendes soll 
realisiert werden:

An einem PIN eines ATmega8 hängt der Statusausgang einer anderen 
Hardware. Dieser Ausgang gibt Pulse in verschiedenen Folgen aus (siehe 
Anhang). Diese sollen nun ausgewertet werden und das Programm 
entsprechend darauf reagieren.

Wie macht man sowas? Soll ich den Timer0 nehmen und einfach zählen, 
wieviel Pulse in 10s da waren? Oder das Ganze mit Timer1 aufbauen, und 
Zeiten zählen? Aber wie mach ich das dann?

Vielleicht hat jemand ein Beispiel dazu. Ich konnte leider nichts 
dergleichen finden.

Gruss, Max

von Tobi W. (todward)


Lesenswert?

wenn ich das richtig sehe sind die impulse nie kleiner als 1ms!
Jetzt könntest du dir mit timer1(16bit) einen overflow von 1ms basteln.
In der Timer_ISR musst du dann nur nachschauen ob der Statuspin 1 oder 
null ist. Wenn der null ist, dann zählste eine die Variable >>aus<< 
hoch. Ist der pin 1, dann zählte die variable >>ein<< hoch.

In der meinschleife musst dann nur noch die variablen auswerten. So alle 
10s. Da du aj die beiden variablen hast, bekommst du ein tastverhältnis 
zwischen an und aus. Wenn du jetzt noch für jeden fall den du bekommmen 
kannst ein muster hinterlegst, kannste den status ermitteln.

Ändert sich das Signal, wenn sich der Status des Moduls ändert?

Gruß
Tobi

von Max Wild (Gast)


Lesenswert?

Danke für die Antwort.

Ja, der Signal ändert sich mit dem Status des Moduls. Ich versuche es 
gerade mit dem INT1 Pin des Megas zu realisieren, aber ich komme da 
einfach nicht weiter.

Ich wollte einfach innerhalb von 5 Sekunden die Anzahl der positiven 
Flanken zählen und dann mit einer Select-Case Anweisung auswerten.

Das mit dem Timer1 geht leider nicht, weil der schon mit 100ms für 
andere Dinge im Programm läuft.

Werde es aber mal mit dem Timer0 versuchen, so wie du es beschrieben 
hast.

Max

von Tobi W. (todward)


Lesenswert?

Das wird nur mit dem prescale knapp bei timer0

Kannste nicht das timing nen runterdrehen? und dann für deine andere 
funktion warten bis 100 overflows waren?

Aber mit dem ext. Interrupt müsste es auch gehen. Ist dann das gleiche 
wie ich das beschrieben habe nur das die auswert funktion wegfällt.
Ich weiss zwar nicht wie sih die signale ändern aber ich könnte mir 
vorstellen, das es vielleicht 2 oder mehr gleiche status gibt.

Probieren geht über studieren....
in diesem sinne noch frohes schaffen

Gruß
Tobi

von Max Wild (Gast)


Lesenswert?

Irgendwie komme ich bei der Auswertung nicht weiter.

Ich habs jetzt mit dem INT1 versucht und jedesmal, wenn sich die Flanke 
ändert eine Variable hochzählen lassen. Dann wird nach 3s geschaut, 
welchen Wert die Variable hat und dementsprechend ausgewertet. Leider 
funktioniert das nicht so wie es soll.

Hier mal ein beispiel
1
INT1:
2
3
if countvar = 0 then
4
  incr countvar
5
  timervar = 0
6
elseif countvar >= 1 then
7
  incr countvar
8
end if
9
10
if timervar >= 3 and countvar > 1 then
11
 select case countvar
12
   case 2:
13
   'status1
14
   case 6:
15
   'status2
16
   case 7:
17
   'status3
18
  end select
19
 timervar = 0
20
21
elseif timervar >=3 and countvar <= 1 then
22
  'status0  
23
end if
24
25
return

Welche besseren und genaueren Möglichkeiten gibt es zur Auswertung? Wie 
aufwendig wäre es, die Pulselängen und Pausen zu ermitteln und 
auszuwerten?

Gruss,
Max Wild

von Tobi W. (todward)


Lesenswert?

Naja also erstmal würde ich den teil der die variable auswertet aus dem 
interrupt packen. Das braucht zuviel zeit. das kannste lieber in der 
hauptschleife machen...
Aber ich muss zugeben ich verstehe deinen code nicht wirklich... ich 
würde das komplett anders lösen.

Ich würde in den interrupt lediglich reinschreiben:
1
Int1:
2
incr flanke
3
return
dann musste noch in deinem timer1(der laut deiner aussage alle 100ms 
einen overflow liefert) eine weitere Variable hochzählen.
1
timer1_isr:
2
....
3
incr time_for_status
4
....
5
return
In der mainschleife mussste jetzt nurnoch die beiden variablen 
verknüpfen.
[code]
Do
....
if time_for_status = 30 then
    time_for_overflow=0
    select case flanke
        case 0:
            'status für flanke=0
        case 1:
            'status für flanke=1
        .....
    end select
end if
.....
loop
[/code

Gruß
Tobi

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.