Forum: Mikrocontroller und Digitale Elektronik Pic10F200 - Programm mit Taste (Ein/Aus)


von Heinrich P. (piccer)


Lesenswert?

Hallo,

bin neu hier und auch unerfahren im Umgang mit der Pic-Programmierung.

Ich habe einen Pic10F200 und möchte mit dem einem Ausgang einen Lampe 
ansteuern.
Mit einem anderen Eingang möchte ich m,it einer Taste diese Lampe sowohl 
ein-, als auch ausschalten können.
Da ich ganz neu bin habe ich mir das Programm "BlinkLED" genommen, doch 
das schalten habe ich nicht hin bekommen.
Habe mich bisher auch nur in .asm eingelesen.
Ich hoffe, hier kann mir jemand helfen.
Wenn es sein muß, werde ich mich auch noch in "C" schlau machen, um das 
Problem lösen zu können.
Hat ausserdem noch jemand eine hilfe, wie ich ein Flackerlicht hin 
bekomme.
Habe bis jetzt 10 Schleifen mit unterschiedlichen Zeiten für das 
Leuchten der LED benutzt.

Vielen Dank schon einmal.

Euer Piccer.

von roeben (Gast)


Angehängte Dateien:

Lesenswert?

Hallo piccer,

schau mal, ob Du hiermit was anfangen kannst. In dem Code wird eine 
Taste an GP3 abgefragt (kurz drücken = EIN/AUS, lange drücken = nächster 
Modus). Je nach Modus werden an 2 Ausgängen PWM-Werte erzeugt. Was Du 
nicht brauchst, kannst Du ganz einfach rauswerfen; Timer oder sonstiges 
hab ich nicht eingesetzt.

von chris (Gast)


Lesenswert?

Hallo, bei verschiedenen Benutzern schwirrt eine Glaskugel herum,
leider fehlt mir die, um den Schaltplan, sowie die asm anzusehen,
damit ich dir helfen könnte.

von Heinrich P. (piccer)


Lesenswert?

Also,

danke erst einmal für das C-Programm.
Schaffe es aber leider nicht es in irgend einer weise so zu compilieren, 
oder so, um es auf den PIC zu bekommen.
Eventuell kannst du mir ja sagen, wie ich das machen kann. Danke.


Wegen der Glaskugel!
Ich habe auch keine, versuche aber jetzt klarheit in die Sache zu 
bringen.
Hier die .asm :
1
  list p=10f200
2
;***********************************************************************
3
;*    Pinbelegung
4
;*  ----------------------------------  
5
;*  GP:   0 > LED mit 1 kOhm Vorwiderstand
6
;*    1 -
7
;*    2 -
8
;*  GP:  3 > Taster als Eingang
9
;*  
10
;***********************************************************************
11
;
12
;sprut (zero) Bredendiek 05/2005
13
;
14
; Blinklicht mit PIC10F202 am Pin GP0
15
;
16
; Prozessor 10F202 (oder 10F200) 
17
;
18
; Prozessor-Takt  4 MHz intern
19
;
20
;
21
;***********************************************************************
22
; Includedatei für den 10F202 einbinden
23
24
  #include <p10f202.inc>
25
26
; Configuration festlegen:
27
;  kein codeprotection
28
;  kein WDT-Timer
29
;  kein Reset-Pin
30
31
  __CONFIG _CP_OFF & _WDT_OFF & _MCLRE_OFF
32
33
;***********************************************************************
34
; Variablen festlegen ab 10h
35
36
  cblock  0x10
37
  loops
38
  loops2
39
  endc
40
  wert
41
42
  #define  LED  GPIO,0
43
  #define TASTE  GPIO,3
44
45
;*******************************************************
46
; Beginn des Programmcodes
47
48
  org  0x0000
49
50
  movwf  OSCCAL    ; Oszillator kalibrieren
51
52
  movlw  b'00001110'  ; GP0 output
53
  tris  GPIO
54
55
;  bcf  CMCON0,CMPON  ; Comparator off nur bei 10F204/206
56
;*******************************************************
57
; Warten auf Taste GP3
58
59
60
Taste1
61
  btfsc  TASTE    ; Wenn Taste gedrueckt
62
  call Mainloop    ; Bei Taste ins Unterprogramm
63
  goto  Taste1    ; bei keiner Taste weiter
64
65
66
;*******************************************************
67
68
69
;*******************************************************
70
Mainloop
71
  bsf  LED    ; LED an
72
  call  WAIT1    ; 250 ms warten
73
  bcf  LED    ; LED aus
74
  call  WAIT9    ; 50 ms warten
75
76
  bsf  LED    ; LED an
77
  call  WAIT2    ; 100 ms warten
78
  bcf  LED    ; LED aus
79
  call  WAIT9    ; 50 ms warten
80
81
  bsf  LED    ; LED an
82
  call  WAIT3    ; 150 ms warten
83
  bcf  LED    ; LED aus
84
  call  WAIT9    ; 50 ms warten
85
86
  bsf  LED    ; LED an
87
  call  WAIT4    ; 200 ms warten
88
  bcf  LED    ; LED aus
89
  call  WAIT9    ; 50 ms warten
90
91
  bsf  LED    ; LED an
92
  call  WAIT5    ; 300 ms warten
93
  bcf  LED    ; LED aus
94
  call  WAIT9    ; 50 ms warten
95
96
  bsf  LED    ; LED an
97
  call  WAIT6    ; 275 ms warten
98
  bcf  LED    ; LED aus
99
  call  WAIT9    ; 50 ms warten
100
101
  bsf  LED    ; LED an
102
  call  WAIT7    ; 180 ms warten
103
  bcf  LED    ; LED aus
104
  call  WAIT9    ; 50 ms warten
105
106
  bsf  LED    ; LED an
107
  call  WAIT8    ; 400 ms warten
108
  bcf  LED    ; LED aus
109
  call  WAIT9    ; 50 ms warten
110
111
  Return      ; Springe ins Hauptprogramm
112
113
;*******************************************************
114
; Warteschleife für 50 ms
115
WAIT1
116
  movlw  .250
117
  movwf  loops
118
119
; die top-Schleife verzögert 1 ms = 250 x 4µs
120
top11  
121
  movlw   .250
122
        movwf   loops2
123
; die top2-Schleife verzögert 4 Takte = 4 µs
124
top12
125
  nop
126
        decfsz  loops2, F 
127
        goto    top12
128
        decfsz  loops, F
129
        goto    top11
130
        retlw  .0
131
132
  RETURN
133
134
;*******************************************************
135
; Warteschleife für 100 ms
136
WAIT2
137
  movlw  .100
138
  movwf  loops
139
140
; die top-Schleife verzögert 1 ms = 15 x 4µs
141
top21
142
  movlw   .100
143
        movwf   loops2
144
; die top2-Schleife verzögert 4 Takte = 4 µs
145
top22
146
  nop
147
        decfsz  loops2, F 
148
        goto    top22
149
        decfsz  loops, F
150
        goto    top21
151
        retlw  .0
152
153
  RETURN
154
155
;*******************************************************
156
; Warteschleife für 150 ms
157
WAIT3
158
  movlw  .150
159
  movwf  loops
160
161
; die top-Schleife verzögert 1 ms = 150 x 4µs
162
top31  
163
  movlw   .150
164
        movwf   loops2
165
; die top2-Schleife verzögert 4 Takte = 4 µs
166
top32
167
  nop
168
        decfsz  loops2, F 
169
        goto    top32
170
        decfsz  loops, F
171
        goto    top31
172
        retlw  .0
173
174
  RETURN
175
176
;*******************************************************
177
; Warteschleife für 200 ms
178
179
WAIT4
180
  movlw  .200
181
  movwf  loops
182
183
; die top-Schleife verzögert 1 ms = 200 x 4µs
184
top41  
185
  movlw   .200
186
        movwf   loops2
187
; die top2-Schleife verzögert 4 Takte = 4 µs
188
top42
189
  nop
190
        decfsz  loops2, F 
191
        goto    top42
192
        decfsz  loops, F
193
        goto    top41
194
        retlw  .0
195
196
  RETURN
197
198
;*******************************************************
199
; Warteschleife für 300 ms
200
WAIT5
201
  movlw  .300
202
  movwf  loops
203
204
; die top-Schleife verzögert 1 ms = 300 x 4µs
205
top51  
206
  movlw   .300
207
        movwf   loops2
208
; die top2-Schleife verzögert 4 Takte = 4 µs
209
top52
210
  nop
211
        decfsz  loops2, F 
212
        goto    top52
213
        decfsz  loops, F
214
        goto    top51
215
        retlw  .0
216
217
  RETURN
218
219
;*******************************************************
220
; Warteschleife für 275 ms
221
WAIT6
222
  movlw  .275
223
  movwf  loops
224
225
; die top-Schleife verzögert 1 ms = 275 x 4µs
226
top61  
227
  movlw   .275
228
        movwf   loops2
229
; die top2-Schleife verzögert 4 Takte = 4 µs
230
top62
231
  nop
232
        decfsz  loops2, F 
233
        goto    top62
234
        decfsz  loops, F
235
        goto    top61
236
        retlw  .0
237
238
  RETURN
239
240
;*******************************************************
241
; Warteschleife für 180 ms
242
WAIT7
243
  movlw  .180
244
  movwf  loops
245
246
; die top-Schleife verzögert 1 ms = 180 x 4µs
247
top71  
248
  movlw   .180
249
        movwf   loops2
250
; die top2-Schleife verzögert 4 Takte = 4 µs
251
top72
252
  nop
253
        decfsz  loops2, F 
254
        goto    top72
255
        decfsz  loops, F
256
        goto    top71
257
        retlw  .0
258
259
  RETURN
260
261
;*******************************************************
262
; Warteschleife für 400 ms
263
WAIT8
264
  movlw  .400
265
  movwf  loops
266
267
; die top-Schleife verzögert 1 ms = 400 x 4µs
268
top81  
269
  movlw   .400
270
        movwf   loops2
271
; die top2-Schleife verzögert 4 Takte = 4 µs
272
top82
273
  nop
274
        decfsz  loops2, F 
275
        goto    top82
276
        decfsz  loops, F
277
        goto    top81
278
        retlw  .0
279
280
  RETURN
281
282
;*******************************************************
283
; Warteschleife für 50 ms
284
WAIT9
285
  movlw  .50
286
  movwf  loops
287
288
; die top-Schleife verzögert 1 ms = 50 x 4µs
289
top91  
290
  movlw   .50
291
        movwf   loops2
292
; die top2-Schleife verzögert 4 Takte = 4 µs
293
top92
294
  nop
295
        decfsz  loops2, F 
296
        goto    top92
297
        decfsz  loops, F
298
        goto    top91
299
        retlw  .0
300
301
  end

Und die Schaltung soll so sein, das ich mit dem Ausgang 0 eine LED 
ansteuere und an dem Eingang 3 einen Taster habe, der mir die LED 
flackern lassen soll, oder aus macht.
Hoffe, jetzt ist eine Glaskugel nicht mehr notwendig.
Wenn noch was unklar ist, einfach schreiben.

Bin total verzweifelt.

Danke

von roeben (Gast)


Lesenswert?

Hallo piccer,

mit ASM kanst Du mich so jagen, wie ich Dich mit C. Ich habe das ganze 
in MPLAB mit dem freien C-Compiler von Hi-Tech gemacht. Wenn Du eine 
aktuelle Version von MPLAB installierst, wird das im Anschluß gleich 
mitinsatlliert. Danach musst Du natürlich noch das Projekt entsprechend 
einrichten. Kann ich Dir bei Bedarf heute Abend mehr zu sagen, wenn ich 
zu Hause bin;
Oder anders herum: Definiere das Flackern doch mal etwas genauer, dann 
kann ich Dir mit ein paar Zeilen entgegen kommen.

von roeben (Gast)


Lesenswert?

Ja schon gut. Habs jetzt auch gesehen...

von Chris S. (schris)


Lesenswert?

Hallo, bei der schnellen Durchsicht ist mir aufgefallen, daß die 
pull-ups
nicht eingeschalten sind. Warscheinlich liegt es daran.

hier dann noch der Code
1
Hier die .asm :  list p=10f200
2
;***********************************************************************
3
;*    Pinbelegung
4
;*  ----------------------------------  
5
;*  GP:   0 > LED mit 1 kOhm Vorwiderstand
6
;*    1 -
7
;*    2 -
8
;*  GP:  3 > Taster als Eingang
9
;*  
10
;***********************************************************************
11
;
12
;sprut (zero) Bredendiek 05/2005
13
;
14
; Blinklicht mit PIC10F202 am Pin GP0
15
;
16
; Prozessor 10F202 (oder 10F200) 
17
;
18
; Prozessor-Takt  4 MHz intern
19
;
20
;
21
;***********************************************************************
22
; Includedatei für den 10F202 einbinden
23
24
  #include <p10f202.inc>
25
26
  radix dec
27
28
; Configuration festlegen:
29
;  kein codeprotection
30
;  kein WDT-Timer
31
;  kein Reset-Pin
32
33
  __CONFIG _CP_OFF & _WDT_OFF & _MCLRE_OFF
34
35
;***********************************************************************
36
; Variablen festlegen ab 10h
37
38
  cblock
39
  dly_0
40
  dly_1
41
  dly_2
42
  endc
43
44
  #define  LED  GPIO,0
45
  #define TASTE  GPIO,3
46
47
;*******************************************************
48
; Beginn des Programmcodes
49
50
  org  0x0000
51
52
  movwf  OSCCAL    ; Oszillator kalibrieren
53
54
 movlw   b'01001111'  ; OPTION Pull-UP
55
  option 
56
57
;  bcf  CMCON0,CMPON  ; Comparator off nur bei 10F204/206
58
;*******************************************************
59
; Warten auf Taste GP3
60
61
62
Taste1
63
64
65
;*******************************************************
66
67
68
;*******************************************************
69
Mainloop
70
  movlw  b'00001110'  ; GP0 output
71
  tris  GPIO
72
  bcf LED
73
  btfss  TASTE    ; Wenn Taste nicht gedrueckt
74
  goto Mainloop    ; dann springe
75
  movlw 25
76
  call led_on
77
  movlw 10
78
  call led_on
79
  movlw 15
80
  call led_on
81
  movlw 20
82
  call led_on
83
  movlw 30
84
  call led_on
85
  movlw 27
86
  call led_on
87
  movlw 18
88
  call led_on
89
  movlw 40
90
  call led_on
91
  goto Mainloop      ; Springe ins Hauptprogramm
92
93
;*******************************************************
94
95
led_on
96
  bsf LED
97
  call delay_10ms
98
  bcf LED
99
  movlw 5
100
 
101
;*******************************************************
102
103
delay_10ms
104
  movwf  dly_0    
105
  movlw  0xCE
106
  movwf  dly_1
107
  movlw  0x08
108
  movwf  dly_2
109
  decfsz  dly_1, f
110
  goto  $+2
111
  decfsz  dly_2, f
112
  goto  $-3
113
  decfsz  dly_0, f
114
  goto delay_10ms
115
  return

von Sven S. (stepp64) Benutzerseite


Lesenswert?

Die verschachtelten Rücksprünge bei led_on würde ich nicht so machen 
auch wenn es in dieser Variante funktioniert. Besser wäre:

led_on
  bsf LED
  call delay_10ms
  bcf LED
  movlw 5
  call delay_10ms
  return

auch die goto $ sollte man sich nicht erst angewöhnen. Ein zusatzlicher 
Befehl dazwischen und nichts geht mehr...

von Chris S. (schris)


Lesenswert?

Die goto $ kommen von einem delay-generator, also automatisch generiert.
Sorry.

von Heinrich P. (piccer)


Lesenswert?

So,

habe das Prog. mal getestet.
Doch leider ohne Erfolg.
Wenn ich den Taster drücke, bleibt die LED dauerhaft an und geht nicht 
mehr aus.
Als funktioniert die Schleife und das EIN7AUS schalten nicht.
Schade, hatte mich so darauf gefreut.

Eventuell kann ja noch mal einer nachscheuen, was der Fehler sein 
könnte.

Noch mal zur Funktion :

1. Ich möchte mit dem Taster an GP3 eine Funktion ein- und wieder 
ausschalten
(Wenn sie eingeschaltet ist, soll Sie solange die Funktion ausführen, 
bis die Taste erneut gedrückt wird.)
2. Die Funktion soll ein Flackerlicht sein, Ähnlich einem Feuer.
(Mal länger oder kürzer an, oder mal länger oder kürzer aus)
3. Wenn es geht das Programm in .asm damit ich es verstehe
Wenn es in C ist, auch kein Problem, aber dann bitte mit kleiner 
Anleitung, wie ich es in den Baustein bekomme. Danke.
4. Es muß alles in den PIC10F200 passen, denn das ist der Baustein, den 
ich dafür nehmen will und muß.

Schon mal vielen Dank an Alle, die mir bisher geholfen haben und noch 
helfen werden !

Euer Piccer.

von Erhard (Gast)


Lesenswert?

Hallo Piccer,

1. Du hast deine Taste nicht entprellt.
2. Momentan bleibt deine LED nur aus, wenn du die Taste ständig gedrückt 
hältst.

Mainloop
  movlw  b'00001110'  ; GP0 output
  tris  GPIO
  bcf LED                                      ;LED ist aus
  btfss  TASTE    ; Wenn Taste nicht gedrueckt  ;dann gehe zum restl. 
Code
  goto Mainloop    ; dann springe       ;solange die Taste gedrückt



tu mal so:

Hier die .asm :  list p=10f200
;***********************************************************************
;*    Pinbelegung
;*  ----------------------------------
;*  GP:   0 > LED mit 1 kOhm Vorwiderstand
;*    1 -
;*    2 -
;*  GP:  3 > Taster als Eingang
;*
;***********************************************************************
;
;sprut (zero) Bredendiek 05/2005
;
; Blinklicht mit PIC10F202 am Pin GP0
;
; Prozessor 10F202 (oder 10F200)
;
; Prozessor-Takt  4 MHz intern
;
;
;***********************************************************************
; Includedatei für den 10F202 einbinden

  #include <p10f202.inc>

  radix dec

; Configuration festlegen:
;  kein codeprotection
;  kein WDT-Timer
;  kein Reset-Pin

  __CONFIG _CP_OFF & _WDT_OFF & _MCLRE_OFF

;***********************************************************************
; Variablen festlegen ab 10h

  cblock
  dly_0
  dly_1
  dly_2
  M0
  endc

  #define  LED  GPIO,0
  #define TASTE  GPIO,3

;*******************************************************
; Beginn des Programmcodes

  org  0x0000

  movwf  OSCCAL    ; Oszillator kalibrieren

 movlw   b'01001111'  ; OPTION Pull-UP
  option

;  bcf  CMCON0,CMPON  ; Comparator off nur bei 10F204/206
;*******************************************************
; Warten auf Taste GP3





;*******************************************************


;*******************************************************
Mainloop
  movlw  b'00001110'  ; GP0 output
  tris  GPIO
  bcf LED
  bcf M0,0        ;Merker gelöscht
;
Start
  btfss  M0,0      ;Funktion ein oder aus?
  goto   Taste_ein ;Funktion ist aus, soll eingeschaltet werden
Taste_aus
  btfss  TASTE    ; Taste gedrückt?
  goto AUS    ;ja, dann schalte Flackerlicht aus
  movlw 25        ;nein, Flackerlicht an
  call led_on
  movlw 10
  call led_on
  movlw 15
  call led_on
  movlw 20
  call led_on
  movlw 30
  call led_on
  movlw 27
  call led_on
  movlw 18
  call led_on
  movlw 40
  call led_on
  goto Start      ; Springe ins Hauptprogramm

AUS
  movlw   .10
  call    delay_10ms ;Entprellung
  btfsc   TASTE      ;Taste immer noch gedrückt?
  goto    Start      ;nein, Abbruch
  btfss   TASTE      ;Warten bis Taste losgelassen
  goto    $-1
  bcf     LED        ;LED aus
  bcf     M0,0       ;Merker löschen
  movlw   .5
  call    delay_10ms
  goto    Start

Taste_ein
  btfsc   TASTE      ;Taste gedrückt?
  goto    Start      ;nein
  movlw   .10        ;ja
  call    delay_10ms ;Entprellung
  btfsc   TASTE      ;Taste immer noch gedrückt?
  goto    Start       ;nein, Abbruch
  btfss   TASTE      ;ja,warten bis Taste losgelassen
  goto    $-1
  bsf     M0,0       ;ja, Flackerlicht ein
  movlw   .5
  call    delay_10ms
  goto    Start

;*******************************************************

led_on
  bsf LED
  call delay_10ms
  bcf LED
  movlw 5

;*******************************************************

delay_10ms
  movwf  dly_0
  movlw  0xCE
  movwf  dly_1
  movlw  0x08
  movwf  dly_2
  decfsz  dly_1, f
  goto  $+2
  decfsz  dly_2, f
  goto  $-3
  decfsz  dly_0, f
  goto delay_10ms
  retlw  0
;*******************************************************+++


end



Das Programm habe ich nicht getestet, also keine Garantie darauf!
Vielleicht hilft dir das auch so weiter.

Ich muß jetzt auf dem Weihnachtsmarkt!
Viel Glück für dein Krippenlagerfeuer!!!

MfG Erhard

von Heinrich P. (piccer)


Lesenswert?

Sorry, das ich mich erst jetzt wieder melde.
Hatte ein wenig Stress auf der Arbeit!!

Ich habe Dein (@Erhard) Programm getestet, doch leider scheint etwas 
nicht zu funktionieren!

Wenn ich den Pic10F200 schiesse und dann einstecke,
ist die LED sofort an und reagiert auch nicht auf den Taster!
Man sieht auch kein Flackern!
SCHADE !

Doch es wird langsam Zeit, da meine Frau immer mehr am drängeln ist !

Die Krippe hat immer noch kein Feuer !!!   :-(

Ich hoffe, jemand kann mir den entscheidenden Tip geben!
Entweder eines der oberen Programme zu erweitern, oder einen anderen 
Vorschlag zu unterbreiten, der funktioniert.

Vielen Dank schon einmal für alle tatkräftige Unterstützung.

Ich wünsche schon mal allen ein schönes und frohes Weihnachtsfest.

Euer Piccer.

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.