PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Externe Ereignisse zählen mit Timer0 = Counter...



RCO
12.10.2004, 21:53
Also ich will Ereignisse Zählen, die an einem Pin Anliegen (Flanken).

[glow=red:914904f99d]Also ein Counter![/glow:914904f99d]

Leider weiß ich nur soviel, als das ich den Timer0 als Counter deklarieren muss. Weiter nix. Ich bitte euch mir ein wenig Code zu schicken.

MFG Moritz

harryup
12.10.2004, 22:15
hi,

nach dem deklarieren kannst du timer0 direkt auslesen, da haste dann die gezählten flanken drinne. läuft aber bei 256 über, tät ich über 'nen interrupt machen.

dim 256_flanken as word ' der zähler
enable interrupts
enable timer0

on timer0 t0_isr


' ab hier programm
do
.
dein code
irgendwannmal: gosub anzeige
.
loop

end
' -------------------------------------

sub anzeige
256_flanken = 256_flanken * 256 ' der wird nur um 1 erhöht je überlauf
256_flanken = 256_flanken + timer0 ' momentaner zählerstand dazu
lcd "Counts: " ; 256 flanken ' Zähler anzeigen
return
end sub anzeige
' -----------------------------------

to_isr
incr 256_flanken
return
' -----------------------------------

ist saugrob, ich weiss, aber so geht's mal
- wenn kein fatal error drinne is ;-)
gruss, harry

RCO
13.10.2004, 07:53
Danke ich werds mal ausprobieren, allerdings immernoch meine Frage. An welchen Pins zähle ich den jetzt?

UNd was bedeutet 'incr'? heißt das sowas wie 256_flanken++ (also +1)

MFG moritz

harryup
13.10.2004, 08:28
genau das bedeutet es. x++ kenn ich nur von c, geht das unter bascom auch? gezählt wird der t0-pin.
gruss, harry

RCO
13.10.2004, 08:48
Sorry, aber ich habs immer noch net gerafft.
t0-pin?
Aber welcher ist das? Ist der vorbestimmt, oder kann man den wählen, wenn ja, wie gebe ich ihn an?
Ich benutze einen 90S2313, nur so zur Info.

MFg moritz

maw_hn
13.10.2004, 09:10
Also wenn ich ehrlich bin hab ich die Version von HarryUp auch net ganz kapiert. Ich arbeite zwar mit nem andern Controller müsst aber auch bei dir gehen:
Ich hätte den externen Takt- Eingang des Timers (soweit bei deinem uC vorhanden) mißbraucht, indem du an ihn die Leitung anlegst von der die Flanken gezählt werden sollen. Dann zählt er bei jeder Flanke eins weiter. Müsstest natürlich noch einen eventuellen Overflow abfangen (ich weis ja net in welchen Bereichen zu zählen willst).

RCO
13.10.2004, 09:31
Also der Bereich ist nicht so hoch, aber nach dem Code oben klappt das ja auch, oder (also der Overflow).
welcher ist denn der Takt-Eingang?
Ich schätze Harry meinte mit t0-Pin den Eingang für Timer 0, aber welcher ist das? Hab nen AT90S2313, oder kann man den beliebig ändern?

MFG Moritz

RCO
13.10.2004, 10:15
Damit habe ich meine Frage selbst beantwortet:

(muss ich den T0 oder Int0 benutzen)
bzw. für welche Anwendungen benutze ich die INT- und für welche T-Ausgänge?

RCO
13.10.2004, 20:18
Also der Code lieferte ungefähr 9 Fehlermeldungen! Ich geb mich mal ran.

Fertig! Soviel wars garnicht.
Hier ein netter Code:


Config Lcdpin = Pin , Db4 = Portd.6 , Db5 = Portb.0 , Db6 = Portb.1 , Db7 = Portb.2 , E = Portb.3 , Rs = Portb.4 ' Natürlich so wie es wirklich angeschlossen ist (4-Bit-Modus)
Config Lcd = 16 * 2
Initlcd
Display On
Cursor Off
Config Timer0 = Counter , Edge = Rising
Dim 256_flanken As Word ' der zähler
Declare Sub Anzeige
Enable Timer0
Enable Interrupts
On Timer0 T_isr

' -----------------------------------

Cls
Do
Home
Lcd "Cnt.= " ; Timer0 ; " "
Lowerline
Lcd "Overflow = " ; 256_flanken ; " "
Waitms 100
Loop

' -----------------------------------

T_isr:
incr 256_flanken
Return

' -----------------------------------


Danke für die Hilfe

MFG Moritz

RCO
13.10.2004, 20:48
Der Counter läuft, aber jetzt hab ich ein Problem mit der Entprellung Einer 'Mauswelle?':

https://www.roboternetz.de/phpBB2/viewtopic.php?p=35456#35456

harryup
14.10.2004, 09:12
hi moritz,
auch nicht schlecht, den int0 zu nutzen, es wird halt jedes mal ein interrupt ausgelöst, wenn ein puls ankommt. damit kriegst du 'ne maximale frequenz von ca. 25khz gebacken. wenn du den to (pd4) nimmst wird alle 256 pulse ein int ausgelöst, damit kriegst du als max. frequenz etwa halbe systemfrequenz raus, aber wenn's nicht so eilig ist, isses ok mit int0. die entprellerei kannst du im einfachsten fall mit einem kondensator (mal mit 100 nf anfangen) machen, den du vom zählpin nach gnd legst. das signal sollte dann über einen widerstand (10K) an den pin gelegt werden. so kriegt du schön ansteigende und abfallende flanken hin (mit ossifant kontrollieren, wenn du keinen hast, pc + soundkarte + winscope.exe ist ein wunderschöner kleiner ossi). wenn das nicht reicht musst du 'nen flip-flop (timer-ic ne555) als schmitt-trigger nehmen, damit geht's 100% gut, egal wie versaut der puls ist.
gruss, harry

RCO
14.10.2004, 09:19
Danke für die Tips.
Ich habe den Zähler aber an PortD.4 angeschlossen! Oder wie meinst du das? Der Overflow wird auch ausgelöst, und zählt in 256_flanken ein höher. Mit dem Kondesator hatte ich das Problem, dass der von Zeit zur Zeit schon mal den uC resetet hat, darf sowas passieren? Ich werd mal andere Werde ausprobieren. Den NE555 kenne ich nur als Timer, wie benutze ich den als Trigger? Hast du enn Schaltplan parat?
Das mit dem Winsope klingt aus interessant, werde mal versuchen das gebacken zu kriegen.

Danke für die Tips.

MFG Moritz

harryup
17.10.2004, 13:35
hi,
als trigger kannst du ihn gut im 'monostabilen betrieb' nehmen, applikationen gibt's im datenblatt. der vorteil ist, dass du jedesmal, wenn auf dem trigger-input eine neg. flanke ansteht, der timer einen puls fester länge ausgibt, die du mit dem c festlegen kannst. damit ist der putput eine feste zeit positiv, der prell-vielfachimpuls kann in der zeit nicht erneut triggern, geht erst anschliessend wieder.
für winscope isses gut, 2 leds antiparallel mit auf den input zu hängen, fängt die gemeinheiten (alles über 2v) gut ab.
gruss, harry