Forum: Mikrocontroller und Digitale Elektronik Messwerte erfassen geht nicht richtig


von R--- S. (rene66)


Lesenswert?

Hallo,

ich möchte gern mit einem Mega 16 (16Mhz) in Regelmäßigen Abständen ein 
TTL Signal erfassen das mit ca. 46khz An Zeit ca. 4 us Aus ca. 20 us 
Zeit unterwegs ist. Wenn sich im der Aus zeit etwas ändert möchte ich 
gern eine Aktion ausführen. Habe mir dazu was im Assembler Programmiert 
und im Simulator geht auch alles aber in der Praxis gibt es immer wieder 
"Fehlauslösungen"
Wie würdet Ihr so etwas lösen?
Signal liegt bei mir auf Port B1 an und sieht auch auf den Oszi ganz 
sauber aus. Das Signal erfasse ich mit sbis und sbic in schleifen Starte 
damit Timer 1 und wenn dann wieder low kommt stoppe ich den Timer 
wieder. lese den Wert aus glätte Ihn ein bisschen mit andi xxx,0b1111000 
um kleinere Unregelmäßigkeiten zu beseitigen. Ist es möglich das der 
Controller die Relativ kurze "AN Zeit" mal übersieht und dann den 
Doppelten wert abliefert?
Habe auch nichts da wie ich die Werte Sichtbar machen könnte. Habt ihr 
andere Vermutungen?

von Moritz E. (devmo)


Lesenswert?

ich habe deine beschreibung deines algoritmus nich ganz verstanden, ohne 
source code kann man dir auch schlecht helfen, also mindestens der 
betreffende teil, besser noch das ganze ding damit man sieht wie ports 
und anderes IO eingestellt ist.

für erkennung externer flanken oder auch Hi oder Low level gibts dafür 
extra interrupts mit noise-cancler. ich vermute die fehlauslösungen 
gibts durch kleine spikes, also noise. sowas kann man in software 
canceln, in dem du ein Hi oder Lo signal erst dann als korrekt 
anerkennt, wenn es unverändert n mal in folge gesampelt wurde, wobei n 
beliebig, der hardware noise cancler vom AVR  will 4 clockcycles 
stabilen pegel sehen z.b.

ein abblock-C von ein paar nF kannst du auch noch zusätzlich um analogen 
noise canceln an den pin tun.

von R--- S. (rene66)


Lesenswert?

also das mal ein 4 us Impuls übersehnen wird ist wohl ehr 
unwahrscheinlich sehe ich das richtig?


eingsng abfragen


 schlei1: sibs PortB,1  ;warten auf high
          rjmp schlei1

 schlei2: sbic PortB,1  ;warten auf low Timer starten
          rjmp schlei2

              ..
 schlei3: sbic PortB,1  ;immer noch Low dann OK ansonsten Müll
          rjmp error

              ..

  schlei5: sibs PortB,1  ;wieder auf high warten und Timer Stoppen
           rjmp schlei5


Meinst Du so ? So richtig genau dürfte das nicht sein aber ich will ja 
unterschiede von min 14 uS bis ca. 29 uS erkennen können und dann etwas 
auslösen das dann wieder eine Anpassung vornimmt.

von asm (Gast)


Lesenswert?

wenn ".." nicht zu lang ist, solltst Du keinen Impuls verpassen. Laß 
Doch dein Eingangssignal mal ruhen und schau dann, ob es überhaupt 
Auslösungen gibt (Fremdeinwirkung). Betriebsspannung sauber geglättet? 
Billig- Halogenlampe oder Lörkolben in der Nähe? (die streuen manchmal 
ganz schön..)

von R--- S. (rene66)


Lesenswert?

Hallo gibt es für die externen interrupts bestimmte Pins oder kann man 
diese frei zuweisen?

von asm (Gast)


Lesenswert?

ersteres, siehe Datenblatt.

von R--- S. (rene66)


Lesenswert?

Ich wollte das lieber per Software lösen sonst muss ich die Platinen 
wieder "umkratzen"
Also dann 4 Messwerte ermitteln im RAM Speichern vergleichen und wenn 
gleich den neuen wert als gültig übernehmen.

von asm (Gast)


Lesenswert?

Also das Nächste mal vor dem Platinen machen - erstmal auf dem 
Steckbrett probieren.. :-)

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.