Hallo,
Ich bin bin ziemlicher (wenn nicht totaler) Anfänger in der
Mikrocontroller-Programmierung und bräuchte einen Schubs in die richtige
Richtung:
Ich bastle momentan an einem kleinen Munitionszähler für eine Nerf-Gun,
der im Prinzip nur zwei Dinge tun soll:
a)auf der angeschlossenen 7-Segmentanzeige über den Taster 1 von "6"
nach "0" (bzw. "-") runterzählen und dort stehen bleiben.
b)Über den angeschlossenen Taster 2 die Anzeige wieder auf "6"
Sprich, ich öffne die Trommel der Nerf-Gun, lade die 6 Darts rein und
schließe die Trommel ---> Anzeige springt auf "6".
Ich feuere die Darts ab ---> Anzeige zählt "6", "5", "4", ... "-" und
nimmt dann keine weiteren Zähler an, sondern erst wieder wenn ich die
Trommel öffne, lade, schließe usw.
Softwareseitig wollte ich das wie folgt lösen:
1 | $regfile "m8adef.dat"
|
2 | $crystal = 1000000
|
3 |
|
4 | Config Portd = Output
|
5 | Config Pinc.5 = Input
|
6 | Config Pinc.4 = Input
|
7 | Pinc.5 = 0
|
8 | Pinc.4 = 0
|
9 |
|
10 | Dim Dis(8) As Byte
|
11 | Dim Cnt As Byte
|
12 |
|
13 | Dis(2) = &B01000000 'Symbol -
|
14 | Dis(3) = &B00000110 'Ziffer 01
|
15 | Dis(4) = &B01011011 'Ziffer 02
|
16 | Dis(5) = &B01001111 'Ziffer 03
|
17 | Dis(6) = &B01100110 'Ziffer 04
|
18 | Dis(7) = &B01101101 'Ziffer 05
|
19 | Dis(8) = &B01111101 'Ziffer 06
|
20 |
|
21 | Cnt = 8
|
22 |
|
23 | Do
|
24 |
|
25 | If Pinc.5 = 1 Then
|
26 | Portd = Dis(cnt) : Cnt = Cnt - 1
|
27 | Waitms 100
|
28 | End If
|
29 |
|
30 | If Cnt = 1 Then
|
31 | Cnt = 2
|
32 | End If
|
33 |
|
34 | If Pinc.4 = 1 Then
|
35 | Portd = Dis(cnt) : Cnt = 8
|
36 | End If
|
37 |
|
38 | Loop
|
Der Zähler funktioniert tatsächlich auch ABER macht folgende Dinge, aus
denen ich einfach nicht schlau werde:
1.) Schalte ich den Zähler ein, zeigt das Display "6". Wird jetzt der
Schalter 1 an Pinc.5 zum ersten mal (und NUR beim ersten mal) betätigt,
geht das Display komplett aus! Betätige ich dann den Schalter 2 an
Pinc.4, springt das Display, wie gewünscht, auf "6" und durch betätigen
von Schalter 1 zählt das Display jetzt, wiederum so wie gewünscht, von
"6" runter nach "-" allerdings mit der Ausnahme, dass...
2.) ... nach jedem "Reset" jeweils der erste Dart, also die erste
Betätigung von Schalter 1 nicht gezählt wird. Das Display zählt also
quasi "6", "6", "5", "4", usw. (das allerdings total zuverlässig...)
Hardwareseitig scheint alles zu stimmen, denn wenn ich die Funktionen
auf den Taster 1 reduziere, und das ganze einfach nur in "im Kreis"
zählen lasse, funktioniert das einwandfrei:
1 | Do
|
2 |
|
3 | If Pinc.5 = 1 Then
|
4 | Portd = Dis(cnt) : Cnt = Cnt - 1
|
5 | Waitms 100
|
6 | If Cnt = 1 Then Cnt = 2
|
7 | End If
|
8 |
|
9 | Loop
|
Ich nehme an, dass ich hier irgendwo vor lauter Bäumen den Wald nicht
sehe (wie gesagt: Anfänger), aber da ich jetzt seit drei Tagen auf
diesen code starre und nicht dahinter komme und alle vergleichbaren
Projekte die ich im Netz so finde gleich um Welten komplizierter sind,
hier mein mittelgroßer Hilfeschrei.
Ich würde mich freuen, wenn sich jemand erbarmt und mir 'nen Tipp gibt
;-)
Gruß,
Jann