Schönen Abend,
hab heute abends ein Miniprojekt für meine Tochter gemacht: einen
Puzzle-Leuchtturm mit 3 LEDs beleuchten. Ist schon toll, wie schnell das
mit AVR geht - kleine runde Lochrasterplatine bestückt, Atiny gesockelt,
10-pol ISP eingelötet, 3 LEDs mit Vorwiderstand, 1 Taster,
Knopfzellenhalter für CR2025 und Schottkydiode zur Trennung vom
Programmer.
Klappt alles wunderbar, geschaltet wird das mit einem Taster zwischen
PIN2 (PCINT3) und Ground - mit PCMSK=8 wird dieser Interrupt gewählt.
Einzige Frage, die bleibt: wie kann zwischen Falling und Rising beim
PCINT unterschieden werden - denn beim Drücken der Taste löst er immer
2x aus, wodurch das Miniprogramm noch nicht optimiert ist...
1 | $regfile = "attiny13.dat"
|
2 | $crystal = 600000
|
3 | $hwstack = 32
|
4 | $framesize = 4
|
5 | $swstack = 20
|
6 | Dim Xon As Long
|
7 | Dim Xfeuer As Byte
|
8 | Ddrb = &B00000111
|
9 | Taster Alias Pinb.3
|
10 | Portb.3 = 1
|
11 | Portb.4 = 1
|
12 | Portb.5 = 1
|
13 | Pcmsk = 8
|
14 | Weissa Alias Portb.0
|
15 | Weissb Alias Portb.1
|
16 | Rot Alias Portb.2
|
17 | Stop Adc
|
18 | Stop Ac
|
19 | Stop Watchdog
|
20 | Enable Pcint0
|
21 | Enable Interrupts
|
22 | On Pcint0 Int3_isr
|
23 | Xon = 0
|
24 | Do
|
25 | If Xon = 0 Then
|
26 | Weissa = 0
|
27 | Weissb = 0
|
28 | Rot = 0
|
29 | Xfeuer = 0
|
30 | Power Powerdown
|
31 | End If
|
32 | Select Case Xfeuer
|
33 | Case 1 To 2
|
34 | Weissa = 1
|
35 | Wait 1
|
36 | Weissa = 0
|
37 | Wait 1
|
38 | Rot = 1
|
39 | Wait 1
|
40 | Rot = 0
|
41 | Wait 1
|
42 | Weissb = 1
|
43 | Wait 1
|
44 | Weissb = 0
|
45 | Wait 2
|
46 | Case 3 To 4
|
47 | Weissa = 1
|
48 | Weissb = 1
|
49 | Wait 1
|
50 | Weissa = 0
|
51 | Weissb = 0
|
52 | Rot = 1
|
53 | Wait 1
|
54 | Rot = 0
|
55 | Wait 2
|
56 | Case 5 To 6
|
57 | Weissa = 1
|
58 | Weissb = 1
|
59 | Rot = 1
|
60 | Wait 1
|
61 | Weissa = 0
|
62 | Weissb = 0
|
63 | Rot = 0
|
64 | Wait 1
|
65 | Case 7 To 8
|
66 | Weissa = 1
|
67 | Waitms 100
|
68 | Weissa = 0
|
69 | Waitms 100
|
70 | Weissb = 1
|
71 | Waitms 100
|
72 | Weissb = 0
|
73 | Waitms 100
|
74 | Rot = 1
|
75 | Waitms 100
|
76 | Rot = 0
|
77 | Case 9 To 10
|
78 | Weissa = 1
|
79 | Weissb = 1
|
80 | Waitms 80
|
81 | Weissa = 0
|
82 | Weissb = 0
|
83 | Waitms 80
|
84 | Rot = 1
|
85 | Waitms 80
|
86 | Rot = 0
|
87 | Case Else
|
88 | Xon = 1
|
89 | End Select
|
90 | Decr Xon
|
91 | Loop
|
92 | End
|
93 |
|
94 | Int3_isr:
|
95 | Weissa = 1
|
96 | Weissb = 1
|
97 | Rot = 1
|
98 | Waitms 500
|
99 | Weissb = 0
|
100 | Weissa = 0
|
101 | Rot = 0
|
102 | Waitms 100
|
103 | Xon = Xon + 255
|
104 | Incr Xfeuer
|
105 | Return
|