mikrocontroller.net

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


Autor: Max Wild (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Tobi W. (todward)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Max Wild (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tobi W. (todward)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Max Wild (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
INT1:

if countvar = 0 then
  incr countvar
  timervar = 0
elseif countvar >= 1 then
  incr countvar
end if

if timervar >= 3 and countvar > 1 then
 select case countvar
   case 2:
   'status1
   case 6:
   'status2
   case 7:
   'status3
  end select
 timervar = 0

elseif timervar >=3 and countvar <= 1 then
  'status0  
end if

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

Autor: Tobi W. (todward)
Datum:

Bewertung
0 lesenswert
nicht 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:
Int1:
incr flanke
return
dann musste noch in deinem timer1(der laut deiner aussage alle 100ms 
einen overflow liefert) eine weitere Variable hochzählen.
timer1_isr:
....
incr time_for_status
....
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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.