PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : rauf-runterzählen



Che Guevara
22.05.2008, 12:19
servus leude,

ich habe ja das rn-control board, mit einem atmega32, welchen ich mit bascom programmiere.....
jetzt wollte ich mir mal ein programm schreiben, bei dem ich 5 leds (die, die schon aufm board sind) steuern kann:
ich wollte dafür die 5 on-board taster benutzen (vorerst nur 2)....
in dem programm gibt es den wert i .... dieser ist nie <1 und > 5... i best. die anzahl der zu leuchtenden leds. wenn t1 gedrückt wird, soll i = i - 1 sein.... wenn t2 gedrückt wird, soll i = i + 1 sein..... also entweder 1 rauf oder runter...
wenn i = 1 ist, soll die erste led leuchten, bei i = 2 die 2. led , usw.

habe hier auch schon ein programm, allerdings funktioniert das nicht.
die meisten leds flimmern immer so komisch. zwar leuchtet eine led wenn ich einen taster drücke, allerdings nur solange der taster gedrückt ist......
ich möchte aber, dass sie auch nach dem loslassen des taster noch leuchtet?!!!
außerdem wollte ich später noch eine funktion einbauen, bei der der wert i nach einem tastendruck (im eeprom??) gespeichert wird, damit nach reset der schaltung i wider vorhanden ist...... allerdings habe ich keine ahnung, wie ich das realisieren soll???

hier nun mein code:



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

Config Adc = Single , Prescaler = Auto
Config Portc = Output

L1 Alias Portc.0
L2 Alias Portc.1
L3 Alias Portc.2
L4 Alias Portc.3
L5 Alias Portc.4

Portc.0 = 1
Portc.1 = 1
Portc.2 = 1
Portc.3 = 1
Portc.4 = 1

Dim I As Word
Dim X As Word

X = 1

Do
Start Adc
X = Getadc(7)
If X < 130 Then
I = I - 1
Waitms 20
If I = 1 Then
L1 = 0
L2 = 1
L3 = 1
L4 = 1
L5 = 1
Elseif I = 2 Then
L1 = 1
L2 = 0
L3 = 1
L4 = 1
L5 = 1
Elseif I = 3 Then
L1 = 1
L2 = 1
L3 = 0
L4 = 1
L5 = 1
Elseif I = 4 Then
L1 = 1
L2 = 1
L3 = 1
L4 = 0
L5 = 1
Elseif I = 5 Then
L1 = 1
L2 = 1
L3 = 1
L4 = 1
L5 = 0
Elseif I > 5 Then
I = 1
End If
Elseif X < 220 Then
I = I + 1
Waitms 20
If I = 1 Then
L1 = 0
L2 = 1
L3 = 1
L4 = 1
L5 = 1
Elseif I = 2 Then
L1 = 1
L2 = 0
L3 = 1
L4 = 1
L5 = 1
Elseif I = 3 Then
L1 = 1
L2 = 1
L3 = 0
L4 = 1
L5 = 1
Elseif I = 4 Then
L1 = 1
L2 = 1
L3 = 1
L4 = 0
L5 = 1
Elseif I = 5 Then
L1 = 1
L2 = 1
L3 = 1
L4 = 1
L5 = 0
Elseif I > 5 Then
I = 1
End If
End If
Loop

End


Code Tags verwenden, sieht übersichtlicher aus ! (PicNick)




fragen über fragen, ich hoffe, ihr könnt mir (wenigstens teilweise) helfen!

mfg
chris

for_ro
22.05.2008, 13:55
Hallo Chris,
programm-mäßig sollte dies das gleiche wie deines machen. Kleinere Fehler sind dabei behoben.


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

Config Adc = Single , Prescaler = Auto
Config Portc = Output

Portc = 31

Dim I As Word
Dim X As Word

X = 1

Do
Start Adc
X = Getadc(7)
If X < 130 Then
I = I - 1
If I = 0 Then I = 5
Elseif X < 220 Then
I = I + 1
If I = 6 Then I = 1
End If
Waitms 20
Portc = 31
Portc.i = 0
End If
Loop

End

Annahme ist, dass die beiden Taster überWiderstände am PORTA.7 angeschlossen sind.
Wenn der erste gedrückt ist, kommt ein Wert kleiner 130 raus, wenn der zweite gedrückt ist, ist der Wert zwischen 130 und 220.
Welcher Wertwird ausgegeben, wenn kein Taster gedrückt ist?
Wenn ein Taster länger als deine 20ms Wartezeit gedrückt ist, springt die LED mehrfach weiter.

Gruß

Rolf

Che Guevara
22.05.2008, 14:48
hallo Rolf,

was beudetet den das portc = 31 ????
bei diesem programm passiert fast genau das selbe, wie bei meinem prog!!
am amfang, beim anlegen der betriebsspannung, leuchtet die erste led, wenn ich t2 drücke, geht led1 aus und led2 leuchtet.... wenn ich dann nochmal t2 drücke, dann geht led2 aus und keine led leuchtet mehr?!!??!?!??!

mfg
chris

PicNick
22.05.2008, 14:59
X = 1
Do
....

du wolltest sicher schreiben
I = 1

denk' ich

for_ro
22.05.2008, 15:33
Hallo Chris,
hier sind noch einige Fehler korrigiert.


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

Config Adc = Single , Prescaler = Auto
Config Portc = Output

Portc = 62 'hier werden die Ausgänge 1-5 auf 1 gesetzt (00111110)
Start Adc

Dim I As Byte
Dim X As Word

X = 1
I = 1
Do
X = Getadc(7)
If X < 130 Then
I = I - 1
If I = 0 Then I = 5
Elseif X > 220 Then
I = I + 1
If I = 6 Then I = 1
End If
Waitms 20
Portc = 62
Portc.i = 0
Loop

End

Welchen Wert gibt Getadc(7) zurück, wenn kein Taster gedrückt ist und wie reagiert das Programm?

Gruß

Rolf

Andree-HB
22.05.2008, 15:45
was beudetet den das portc = 31 ????


...an den Pins vom Port C wird damit die binäre Analogie von dezimal 31 ausgegeben.

Che Guevara
22.05.2008, 15:50
könntest du mir erklären, was binäre analogie ist???

mfg
chris

Andree-HB
22.05.2008, 15:53
"31" binär = 31 dezimal

http://www.arndt-bruenner.de/mathe/Allgemein/binaersystem.htm

..sowie
http://de.wikipedia.org/wiki/Analogie :-)

for_ro
22.05.2008, 18:12
Hallo Chris,
zum Dualsystem (binär) schau mal hier
http://de.wikipedia.org/wiki/Dualsystem

Wie ich schon geschrieben habe bedeutet

PORTC=31 ' = &B00011111

soviel wie

PORTC.0=1
PORTC.1=1
PORTC.2=1
PORTC.3=1
PORTC.4=1
PORTC.5=0
PORTC.6=0
PORTC.7=0

Ist halt nur etwas kürzer.
Ich hatte mich übrigens zwischendurch von deinem L1 usw. ablenken lassen und dachte, du hättest mit PORTC.1 angefangen. War natürlich Quatsch. Also ist 31 bei deinen Anschlüssen richtig.
Du hast immer noch nicht die Frage beantwortet:

Welchen Wert gibt Getadc(7) zurück, wenn kein Taster gedrückt ist und wie reagiert das Programm?

Dann könnte man dir evtl. noch weiterhelfen.

Gruß

Rolf

Che Guevara
22.05.2008, 18:20
wenn kein taster gedrückt ist, ist x = 0 .
dadurch wird solange das der fall ist, immer i = i - 1 gelten......
dadurch zählt das prog von 65353 (glaube ich) bis 0 runter, dann gehts wider so weiter!!

mfg
chris

for_ro
22.05.2008, 21:00
Warum fragst du dann auf "<130" ab?
Wenn kein Taster gedrückt ist, soll sich doch gar nichts ändern, oder?
Im Moment wird er mit etwa 50Hz runterzählen, wenn kein Taster gedrückt ist. Dann sind alle LEDs nur schwach an.
Ich würde das dann so machen:


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

Config Adc = Single , Prescaler = Auto
Config Portc = Output

Portc = 30 'LED 1 ist an PORTC=00011110
Start Adc

Dim I As Byte
Dim X As Word

X = 1
I = 1
Do
X = Getadc(7)
If X > 0 Then
If X < 130 Then 'Taster für runter gedrückt
I = I - 1
If I = 255 Then I = 4 'dann hat es einen Überlauf gegeben, I ist Byte, also 0-255
Else 'Taster für rauf gedrückt
I = I + 1
If I = 6 Then I = 0
End If
Portc = 31 'Alle LEDs aus
Portc.i = 0 'LED Nr. i an
End If
Waitms 20 'das ganze etwa 50 mal pro Sekunde
Loop

End

Gruß

Rolf

Che Guevara
22.05.2008, 21:29
hallo rolf,

auch dein code funzt genau wie die andern nicht :-(
vielleicht ist meine platine (oder der atmega) kaputt?!?!
könnte vielleicht jemand freundlicherweise das prog mal mit seinem rn-control ausprobieren??

mfg
chris

for_ro
22.05.2008, 22:43
Was passiert denn jetzt?
Ist die erste LED an, wenn kein Taster gedrückt ist?
Und wenn du einen Taster drückst, bleibt danach die LED an?
Erklär mal etwas genauer, was nicht geht.

Gruß

Rolf

Che Guevara
22.05.2008, 23:06
am anfang, nach anlegen der spannung leuchtet led1.
wenn kein taster gedrückt ist, ist das ganze wie ein lauflicht!! wahnsinnig schnell, könnte vielleicht 50hz sein (wegen waitms 20??).
wenn man eine taste drückt, ändert sich überhauptnichts!!
habe jetzt auch schon den atmega32 gegen einen anderen atmega32 ausgetauscht, ohne erfolg!! :-(

for_ro
23.05.2008, 12:28
Bist du dir ganz sicher, dass immer x=0 ist, wenn kein Taster gedrückt ist? Das Programm sollte bei X=0 nicht in den Bereich laufen, wo die Ausgänge geändert werden. Ist X aber >0, dann wird der erste Teil der IF-Abfrage dauernd durchlaufen und du bekommst ein Lauflicht.
Hast du vielleicht noch eine LED, die du an PORTC.5 klemmen kannst?
Die könnte man dann benutzen um anzuzeigen, dass tatsächlich x=0 ist.
Oder du gibst den Wert von X über Print an den PC, wenn du eine Verbindung hast. Oder auf ein Display.
Im Moment denke ich jedenfalls, ist der Wert von X das Problem.

Gruß

Rolf

PicNick
23.05.2008, 12:59
Um das Mysterium zu lüften:
Lt. RnControl Test Programm ist die korrekte Tastenabfrage folgendermassen:


Start Adc
Ws = Getadc(7)
If Ws < 1010 Then
Select Case Ws
Case 410 To 450 'TASTE 1 gedrückt
Case 340 To 380 'TASTE 2 gedrückt
Case 265 To 305 'TASTE 3 gedrückt
Case 180 To 220 'TASTE 4 gedrückt
Case 100 To 130 'TASTE 5 gedrückt
End Select
End If

Also ist KEINE Taste ist offenbar >= 1010




ANderes Problem:


If X < 130 Then
I = I - 1
Waitms 20
If I = 1 Then ....
Elseif I > 5 Then ....

Beim Runterzählen macht man üblicherweise
Elseif I < 1 Then ....
Die Zahl kann ja nur kleiner werden und nicht grösser

Noch was :
bei I > 5 oder < 1 setzt du immer I=1
da du aber sofort +1 oder -1 rechnest, kommt also entweder 2 oder 0 raus, die "1" kommt NIE

Che Guevara
24.05.2008, 01:51
kann mir den niemand helfen??

ich habe schon oft gelesen, wie ein paar leute die geschwindigkeit stufenweise mit zwei tastern geregelt haben! wie funktioniert das?? kann sich bitte jemand melden??
das müsste doch das gleiche sein, oder???

mfg
chris