mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Flankenerkennung mit Attiny


Autor: Wolfran (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Zusammen,
ich habe folgendes Problem. Vielleicht kann mir ja jemand helfen.
Ich möchte mit einem AtTINY2313 auf internem RC-Oszillator (Takt 
8MHz)auf 8 * IO-Kanälen Impulse erkennen.
Hier das Datenblatt:
http://www.atmel.com/dyn/resources/prod_documents/...
Mein Problem ist, dass die Impulse <=0.5us lang sind.
Wenn ich jetzt einen 8-Bit Port in einer Schleife einlese, dauert das 
schon ca 3 us, mit dem Effekt ich erkenne nicht alle eingehenden Pulse?
Kann man auf 8 IOs eine Art Flankenerkennung o.ä. auf dem AVR Typ 
realisieren ?
Was für Möglichkeiten habe ich ?
Vielen Dank

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wolfran schrieb:
> Was für Möglichkeiten habe ich ?

1. schneller takten
2. Assemblerprogramm, dafür reichen dann 8 MHz
3. externe Monoflops (z.B. ne555), um die Impulsdauer zu verlängern
4. externe Kondensatoren und Dioden

  In ---|>|----o----- uC-Pin
               |
              ---
              --- C
               |
             --o---

Bei Flanke wird C geladen. Nun hat der uC Zeit fürs Erkennen. Zum 
Löschen zieht der uC den Pin kurz auf Low (Ausgang).

Allerdings beschreib doch mal was du vor hast, vlt bietet sich noch was 
besseres. :-)

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Was für Möglichkeiten habe ich ?

Pin-Change-Interrupt.

MfG Spess

Autor: Wolfram (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Floh u.a.,
Floh schrieb:
> Allerdings beschreib doch mal was du vor hast, vlt bietet sich noch was
> besseres. :-)
OK ich empfange aus einer externen Bus-Empfängerschaltung Pulse, wenn 
neue Daten anliegen. Diese Daten werden innerhalb der Empfängerschaltung 
in Echtzeit weiterverarbeitet. Dies gleichzeitig auf 8 Leitungen.
Die Impulse sind jedoch sehr kurz wie gesagt 300-400ns.

Ich möchte jetzt mit einem ATTINY quasi 8 Monoflops realisieren, die die 
Impulse verlängern(z.B. 10-50ms) um angeschlossene LEDS ansteuern. Diese 
sollen in Echtzeit anzeigen wenn Daten einlaufen. Das direkte ansteuern 
der LEDs geht in die Hose weil die Pulse zum Teil so kurz sind, dass die 
LEDs kaum leuchten. Klar - wenn jetzt viele Impulse hintereinander 
eingehen, dann leuchten die LEDs halt immer. Wenn aber keine 
Eingangsimpulse mehr kommen, dann gehen die LEDs nach 25ms wieder aus. 
Das wäre mein Wunschszenario.

Diskret mit 555 und Co wollte ichs extra nicht machen, weil es erheblich 
mehr Platz benötigt (der attiny ist im kleinsten Gehäuse nur ca. 4*4mm) 
und ich auch noch nicht weiss wie der visuelle Eindruck bei 
unterschiedlichen Monoflopzeiten ist.

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wolfram schrieb:
> Die Impulse sind jedoch sehr kurz wie gesagt 300-400ns.

Wie schnell kommen die Impulse wieder?

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wolfran schrieb:
> Kann man auf 8 IOs eine Art Flankenerkennung o.ä. auf dem AVR Typ
> realisieren ?

Mal sehen:
INT0
INT1
PCINT0
PCINT1
PCINT2
TIMER1 CAPT
ANALOG COMP
TIMER0 OVF

sind genau 8, geht also.
Bei 8MHz müssen die Pulse >125ns sein.


Peter

Autor: Wolfram (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Floh schrieb:
> Wie schnell kommen die Impulse wieder?

Nun die Impulse werden von Transceiver-Chips ausgegeben wenn der 
Eingangspuffer Daten enthält, die noch nicht weiterverarbeitet wurden. 
Dass heißt das kann sehr undeterministisch sein.
Habs noch nicht genau ausgemessen, da mir bisher die Erkennung nicht 
sicher genug war.
Ich denke minimal alle 1us, maximal vielleicht alle 2-3us.

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wolfram schrieb:
> Ich denke minimal alle 1us, maximal vielleicht alle 2-3us.

Dann wird das nix mit Monoflop durch den tiny ersetzen. Du willst auf 8 
Kanälen Flanken von < 400ns erkennen und noch verlängert an einem 
anderen Port wider ausgeben. Das geht softwaretechnisch schon wegen der 
begrenzten Rechenzeit nicht, bis neue Pulse ankommen.

Würd ich eher über RC-Glied und Schmitttrigger zu lösen probieren, das 
wären dann pro Kanal 1 R 1 C und ein Trigger.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Floh schrieb:
> Dann wird das nix mit Monoflop durch den tiny ersetzen. Du willst auf 8
> Kanälen Flanken von < 400ns erkennen und noch verlängert an einem
> anderen Port wider ausgeben. Das geht softwaretechnisch schon wegen der
> begrenzten Rechenzeit nicht, bis neue Pulse ankommen.

Das ist Quatsch.
Natürlich kann man Pulse in den 25ms Verlängerung nicht anzeigen.
Anner als an geht die LED nunmal nicht.
Du mußt also erst nach 25ms wieder bereit sein, d.h. der ATtiny gähnt 
vor Langeweile.

Wichtig ist eben nur, daß jeder Eingang seinen eigenen Vector erhält. 
Denn zum Ausklamüsern des Pins reichen die 300ns nicht.


Peter

Autor: Wolfram (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ihr seid ja echt fix.

Peter Dannegger schrieb:
> Du mußt also erst nach 25ms wieder bereit sein, d.h. der ATtiny gähnt
> vor Langeweile.

Ja aber nur für den einen Kanal, auf den anderen IOs kanns ja schon 
wieder nötig sein zu reagieren...
>Anner als an geht die LED nun mal nicht.
Das stimmt allerdings ;-)

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wolfram schrieb:
> Ja aber nur für den einen Kanal, auf den anderen IOs kanns ja schon
> wieder nötig sein zu reagieren...

Und wo ist das Problem?
Ist eine LED an, schaltest Du deren Interrupt-Enable aus. Somit haben 
auch alle nieder priorisierten Interrupts 25ms Zeit, ihren Handler 
auszuführen.

Ein gesetztes Interrupt-Pending-Flag geht ja nicht verloren. Es wartet, 
bis der Handler ausgeführt wird.


Peter

Autor: blaubart (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
was mir dazu einfällt. externes parity ic, das die binäre quersumme 
aller bits an den interrupt eingang des tiny weitergibt. dann muss mit 
dem ersten befehl nach auslösen des interrupt der port eingelesen 
werden.

Autor: blaubart (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: avr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beim 2313 ist doch der kpl. PortB als PinChange verwendbar.

Und wenn der µC sonst nichts macht, kann man das Flag in der
Main abfragen (ohne Interruptroutine).

avr

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Folgende Pins sind die Eingänge:
Pin: Vector:
------------
PD2: INT0
PD3: INT1
PB0: PCINT0
PA0: PCINT1
PD5: PCINT2
PD6: TIMER1 CAPT
PB1: ANALOG COMP
PD4: TIMER0 OVF


Peter

Autor: wolfram (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Peter
Peter Dannegger schrieb:
> PD2: INT0
> PD3: INT1
> PB0: PCINT0
> PA0: PCINT1
> PD5: PCINT2
> PD6: TIMER1 CAPT
> PB1: ANALOG COMP
> PD4: TIMER0 OVF

Hallo Peter,
danke für die Liste, aber wie Programmier ich das denn jetzt ? Da ist ja 
leider nix mit "...ich les den Port mal mal ein und guck ob sich was 
getan hat...". Könntest Du mir da helfen ?


@avr
>Beim 2313 ist doch der kpl. PortB als PinChange verwendbar.
Ne leider nur ein teil und dann auch nur als "Sammel Pin Change", dann 
muss man immer noch rausklamüseren welcher es denn war.

mfg wolfram

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wolfram schrieb:
> @Peter
> Peter Dannegger schrieb:
>> PD2: INT0
>> PD3: INT1
>> PB0: PCINT0
>> PA0: PCINT1
>> PD5: PCINT2
>> PD6: TIMER1 CAPT
>> PB1: ANALOG COMP
>> PD4: TIMER0 OVF
>
> Hallo Peter,
> danke für die Liste, aber wie Programmier ich das denn jetzt ? Da ist ja
> leider nix mit "...ich les den Port mal mal ein und guck ob sich was
> getan hat...". Könntest Du mir da helfen ?

Genau darum gehts.
Bei deinen Zeitvorgaben hast du dir Zeit dazu nicht, dass dein Programm 
gemütlich die Ports abklappert.
Da müssen die Signale schon Interrupts auslösen, damit du keinen Puls 
übersiehst. Das erkennen der Pulse muss dir die Hardware machen!

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wolfram schrieb:
> Da ist ja
> leider nix mit "...ich les den Port mal mal ein und guck ob sich was
> getan hat...".

Das macht ja die Hardware für Dich, die erkennt die Flanke und setzt das 
Interruptflag.

Die PCINTx reagieren auf beide Flanken, sollte für Deine Anwendung aber 
nicht stören. Und Du maskierst sie für nur einen Pin, damit brauchst Du 
nicht zu testen, welcher Pin es war.

Der TIMER0 wird auf extern Zählen gesetzt und auf 0xFF, damit er mit der 
Flanke überläuft (und danach wieder auf 0xFF).

Als Schaltschwelle für den Komparator nimmst Du den Brownout (1,1V).

Jede LED kriegt nen Zähler, der mit T1 jede ms weiterzählt, um die 25ms 
Leuchtzeit zu machen.

Fertig.

Pseudocode je LED:
if( Interuptflag == 1)
{
  Interruptflag = 1; // setzen = löschen !
  zähler = 25;       // 25ms
  LED = an;
}
jede ms:
if( --zähler == 0 )
  LED = aus;


Peter

Autor: Wolfram (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Peter, Karl-Heinz et al.
Hallo Zusammen,
ich hatte vergessen mich zu bedanken, da ich noch mit anderen Arbeiten 
beschäftigt war. Jetzt geht es wieder weiter.
Problem war auch dass ich auf neue PCB Versionen warten musste um 
weiterzumachen.
Schönen Gruß
Wolfram

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.