Forum: Mikrocontroller und Digitale Elektronik PCINT0 und Bascom Rising/Falling


von Manfred S. (Firma: Manfred) (xfred343)


Lesenswert?

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

von Sebastian (Gast)


Lesenswert?

Der Code wirkt etwas unorthodox auf mich. In der ISR einen Wait-Befehl 
einzubauen ist oft nicht so günstig.

Normalerweise startet man mit Config Int0 = Rising  / Falling. Wie man 
das über PCMSK realisiert, weiß ich nicht.

Du meinst aber wohl eher etwas was um Deinen Taster zu entprellen. Da 
hilft DEBOUNCE in Kombination mit Bitwait.

Debounce Taste , 0 , Subroutine_to_go , Sub

Subroutine_to_go:
  Bitwait Taste , Reset.....

von Manfred S. (Firma: Manfred) (xfred343)


Lesenswert?

Hallo Sebastian,

der Code ist "bewusst unorthodox", da ein Debouncen damit nicht 
notwendig ist - die Variable wird immer exakt  um 2 hochgezählt, daher 
die Notwendigkeit auf Falling zu prüfen

von spess53 (Gast)


Lesenswert?

Hi

>Einzige Frage, die bleibt: wie kann zwischen Falling und Rising beim
>PCINT unterschieden werden

Man prüft einfach den Zustand des Pins.

MfG Spess

von Manfred S. (Firma: Manfred) (xfred343)


Lesenswert?

spess53 schrieb:
> Hi
>
>>Einzige Frage, die bleibt: wie kann zwischen Falling und Rising beim
>>PCINT unterschieden werden
>
> Man prüft einfach den Zustand des Pins.
>
> MfG Spess

Super Danke, hmm - so einfach wärs gewesen..

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.