PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : einfacher Zähler funktioniert im Simulator, real jedoch nich



Unkaputtbar
03.05.2010, 21:01
Hey,
Ich möchte in der nächsten Zeit eine Geschwindigkeitsanzeige programmieren. Nun habe ich erstmal angefangen etwas zu programmieren, damit eine Zahl bei jeder steigenden Taktflanke, die durch einen einfachen Schalter ausgelöst werden soll um 1 erhöht wird. Im Bascom-Simulator funktioniert das Programm. In der Realität sieht es jedoch folgendermaßen aus: Solange der Schalter nicht betätigt ist, zählt das Programm einfach schnell nach oben ohne Halt. Sobald man den Schalter betätigt, bleibt der Zähler stehen. Löst man den Schalter wieder, zählt das Programm weiter.
Woran kann das liegen?
Folgendes ist der Quellcode:


$sim
$regfile = "m32def.dat"
$crystal = 16000000
Config Lcdpin = Pin , Db4 = Portb.1 , Db5 = Portb.2 , Db6 = Portb.3 , Db7 = Portb.4 , E = Portb.5 , Rs = Portb.6
Config Portd.2 = Input
Config Int0 = Rising
Enable Interrupts
Enable Int0
Cls

Initlcd
Dim D As Integer
Enable Interrupts


Config Lcd = 20 * 4
D = 0
On Int0 Abc
Do
Initlcd
Cls
Lcd D
Loop
End

Abc:
D = D + 1
Return

Jaecko
03.05.2010, 21:25
Wie schaut denn die Hardwareanbindung vom Taster aus?
Der Beschreibung nach hat der Pin INT0 bei nicht gedrücktem Schalter keinen festen Pegel.

Unkaputtbar
03.05.2010, 21:26
Der Taster ist an - (5V) angeschlossen.

Jaecko
03.05.2010, 22:07
Naja... wie genau?
Oder anders gefragt: Hat der Pin am AVR bei nicht gedrücktem Schalter einen definierten Pegel oder hängt der frei in der Luft und wird nur bei gedrücktem Schalter auf +5V bzw. Masse gezogen?
Falls letzteres: Schlecht. Dem Programm nach soll der Schalter den Pin anscheinend nach +5V bringen. D.h. es fehlt ein Widerstand am Pin, der ihn nach Masse runterzieht.
Ohne irgendwas sucht sich der Pin irgendeinen Pegel; darum feuert der Interrupt auch die ganze Zeit.

Unkaputtbar
03.05.2010, 22:09
Ich habe einen internen Pull-Up-Widerstand genutzt. Also so sieht der Quelltext aus, mit dem ich die Schaltung getestet habe.


$regfile = "m32def.dat"
$crystal = 16000000

Config Lcd = 20 * 4
Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portc.5 , Rs = Portc.4
Config Lcdbus = 4


Config Pind.2 = Input

Config Portd.2 = 1

Enable Interrupts

Cls

Initlcd
Dim D As Integer
Enable Interrupts



D = 0


Do
If Portd.2 = 0 Then D = D + 1

Locate 1 , 1
Lcd D
Loop
End

Asuro91
03.05.2010, 23:06
Hallo alle zusammen
ich versuche auch so was zu realisieren doch ich hab festgestelt, dass auf meinem Display sofort hochgezählt wird wenn ich an meinem rn-contoler Bord den Portd.2 (into) mit einem draht berühre der aber an keiner Spannung oder Masse angeschlossen ist. Ich hab nicht herausfinden können an was das liegt. Falls ihr ne idee habt also mir kommt das ihrgendwie komisch vor ich hab auch schon gemessen ob ihrgend wie ein kurzschluss vorhanden ist , is aber keiner.
Würed mich über ideen freune

lg Micha

Jaecko
04.05.2010, 11:07
D.h. der Interne Pullup zieht nach 5V und der Taster beim drücken nach GND? Wäre dann Pegelmässig ok.


Nur wundert mich, wenn es mit dem Quelltext geklappt hat, da die Zeile:
If Portd.2 = 0 Then D = D + 1
nicht das liest, was du haben willst. Zum Einlesen von Tastern braucht man Pind.2.

Und was genau hast du mit Config Portd.2 = 1 vor? Den auf 1 setzen? Dann braucht man Config nicht. Zum Einschalten der Pullups auch nicht.
Config braucht man da nur zum Festlegen, ob der Pin Input oder Output sein soll.




dass auf meinem Display sofort hochgezählt wird wenn ich an meinem rn-contoler Bord den Portd.2 (into) mit einem draht berühre der aber an keiner Spannung oder Masse angeschlossen ist.

Und das ist genau das Problem mit dem nicht definierten Pegel. Da nur ein Draht dranhängt, wirkt dieser Draht (oder idealerweise schon der Pin des Controllers) als Antenne. Jedes el. Feld in der Nähe zieht den Pegel irgendwohin; hängt von Mondphase, Sauberkeit der Katze, etc. ab, also im Prinzip nicht vorhersagbar.
Darum braucht man hier eben einen Pullup/Pulldown-Widerstand, der den Pin im unbeschalteten Zustand trotzdem auf einen definierten Pegel bringt.

Hängt also nur der Draht am Pin und sonst nichts, ist das ein total normales Verhalten.

Ich hab das gleiche Phänomen mal bei den ADC-Pins gehabt, d.h komplett unbeschaltete Pins (nur ca. 10cm Kabel bis zum Stecker) und dann mal ständig die Spannung am Pin gemessen. Resultat:
http://www.youtube.com/watch?v=-1LVgI2BDJ0
Die Netzfrequenz von 50Hz (die ja eigentlich überall ist) hat sich mit der Abtastfrequenz überlagert und damit dieses langsame Schwingen erzeugt.

Asuro91
04.05.2010, 21:50
hey Jaecko

vielen dank des mit dem internen pillup wiederstand hab ich ihrgendwie verpeilt das man da kein config braucht dake( anfänger fehler ;-))

ich muss des dann mal ausprobieren aber ich denk dan gibts keine probleme

noch mal danke
lg Micha

Asuro91
11.05.2010, 23:10
hey Jaecko
noch mal danke hatte jetzt mal zeit des kurz zu testen und hat alles problemlos geklappt
gruß micha