Forum: Mikrocontroller und Digitale Elektronik Anfänger sucht Unterstützung bei PIC-Programmierung


von Christian (Gast)


Lesenswert?

Hallo an alle Profis,

für meine Modelleisenbahn versuche ich über eine PICF629 2 Karuselles zu 
steuern. Die Schaltung dazu ist absolut einfach. Die Spannungsversorgung 
wird über eine Z-Dioden stabilisierte Einweggelichrichtung erzeugt. Als 
Eingang und damit als Starttaster wird GP3 verwendet. Die Ausgänge sind 
über Transistorstufen an die Aktoren geschaltet. Im Versuchsaufbau 
übernehmen LED die Motoren- und Hupenfunktion.

Im angehangenen Listing ist die Funktion einigermaßen beschrieben, die 
Lichtsteuerungen sind noch nicht enthalten, die Ausgänge also noch nicht 
benutzt.

Nach dem Schreiben des Programmteils teste ich das ganze mit dem 
Simulator im MPLAB. Dort funktioniert das Programm auch so wie ich es 
mir vorgestellt habe.

Über ein Experimentierboard der Firma Vellman brennte ich mit der 
zugehörigen PIC-Brennersoftware dan PIC. Zu meiner großen Enttäuschung 
funktioniert das Programm leider nicht. Seltsamerweise wird der Ausgang 
GP2 angestuert und das wars dann. Zu Versuchszwecken kommentierte ich 
schon die Abfrage für den Starttaster aus und veränderte natürlich auch 
die Marke entsprechend.

Ich vermutete, dass ich als Anfänger mit meinen Experimenten den PIC 
zerschossen habe (durch dummerweises überschreiben des OSCALL), was sich 
aber nicht bestätigte, denn nach dem Brennen eines Lernbeispiels von der 
Seite sprut.de (und wiederherstellen des OSCALL) läuft dort das 
Beispiel.

Also liegt der Fehler in meinem Progrämmchen. Es gelingt mir leider 
nicht irgendeinen Ansatz noch zu finden, wo der Fehler zu finden ist und 
bitte deshalb um Unterstützung und Hinweise.

Ich bin mir bewusst, dass es wesentlich elegantere Lösungen für die 
Realsierung der Aufgabe gibt.

In der Hoffnung auf Hilfe

mit freundlichem Gruß
1
;*********************************************************** 
2
;Programm zur Steuerung der Karusells mit PIC 12F629 
3
;    
4
;Prozessor-Takt 4 MHz intern 
5
; 
6
;Nach Betätigen der Starttaste als Schalter GP3 beginnt das Programm. 
7
;Das Beleuchtungsprogramm läuft unabhängig/parallel zum Karusellprogramm. 
8
;Folgender Ablauf ist vorgesehen: 
9
;Vor jedem Karusellstart Hupe für 2 sec ein 
10
;K1 für 15 sec ein 
11
;5 sec Pause, dann K2 für 15 sec ein 
12
;10 sec Pause, dann K2 für 15 sec ein 
13
;10 sec nach K2 ein - K1 für 15 sec ein 
14
;nach Ablauf K1 - 5 sec Pause 
15
;K1 für 15 sec ein 
16
;10 sec später K2 für 15 sec ein. 
17
;nach Ablauf K2 Programm von vorn. 
18
;************************************************************* 
19
;*      Pinbelegung 
20
;*    ----------------------------------    
21
;*    GP:     0 > Ausgang Karusell 1 
22
;*        1 > Ausgang Karusell 2 
23
;*        2 > Ausgang Starthupe für beide Karusells 
24
;*        3 < Eingang Start 
25
;*        4 > Ausgang Licht Karusell 1 
26
;*        5 > Ausgang Licht Karusell 2 
27
;************************************************************* 
28
;*      Vereinbarungen 
29
;*    ----------------------------------    
30
    list p=12f629            ;Controllertyp 
31
    #include <P12f629.INC>    ;Standardheaderfile für 12F629 
32
    __CONFIG _CP_OFF &  _BODEN_OFF & _MCLRE_OFF & _PWRTE_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT 
33
; 
34
;************************************************************* 
35
;*      Variablendefinition 
36
;*    ----------------------------------- 
37
    #define    K1    GPIO,0 
38
    #define K2    GPIO,1 
39
    #define H    GPIO,2 
40
    #define Start    GPIO,3 
41
    #define L1    GPIO,4      ;noch nicht benutzt 
42
    #define L2    GPIO,5      ;noch nicht benutzt 
43
    loops    Equ     0x20      ;Zähler für Warteschleife   
44
    loops1  Equ     0x21      ;Zähler für Warteschleife   
45
    loops2  Equ     0x22      ;Zähler für Warteschleife   
46
47
;************************************************************* 
48
    org    0x00 
49
    goto    prog 
50
51
;************************************************************* 
52
;*      Initialisierung 
53
;*    ----------------------------------    
54
init    bcf    STATUS, RP0        ;Auswahl Bank 0 
55
    clrf    GPIO            ;alle E/A aus 
56
    movlw    0x07            ;Vorbereitung für Komperator aus 
57
    movwf    CMCON            ;Komperator aus, Freigabe GP4+5 
58
    bsf    STATUS, RP0        ;Umschalten auf Bank 1 
59
    movlw    B'00001000'        ;GP3=Eingang GP0,1,2,4,5 Ausgang 
60
    movwf    TRISIO            ;nach Register schieben 
61
    bcf    STATUS, RP0        ;Rückschalten auf Bank 0 
62
    bsf    STATUS, RP0        ;Umschalten auf Bank 1 
63
    call    0x3FF            ;Lade 3FF für Taktgeneratorkalibrierung 
64
    movwf    OSCCAL            ;4 MHz Kalibrierung 
65
    bcf    STATUS, RP0        ;Rückschalten auf Bank 0 
66
    return                ;Rückkehr nach call 
67
68
;************************************************************* 
69
;*      Hauptprogramm 
70
;*    ---------------------------------- 
71
prog    call    init        ;Aufruf Initialisierung 
72
    
73
M1    btfss    Start        ;Abfrage Eingang, wenn 1 überspringe nächsten Befehl 
74
    goto    M1        ;warte bis Starttaster gedrückt 
75
;----------------------------------------------------------------------    
76
    bsf    H        ;Hupe ein 
77
    movlw    D'8'        ;Lade Zeit für 2 sec. 
78
    movwf    loops 
79
    call    wait 
80
    bcf    H        ;Hupe aus 
81
    movlw    D'4'        ;1 sec Pause 
82
    movwf    loops 
83
    call    wait 
84
    bsf    K1        ;Karusell 1 ein 
85
    movlw    D'60'        ;Lade Zeit für 15 sec 
86
    movwf    loops 
87
    call    wait 
88
    bcf    K1        ;Karusell 1 aus 
89
;------------------------------------------------------------------- 
90
    movlw    D'20'        ;5 sec Pause 
91
    movwf    loops 
92
    call    wait 
93
;------------------------------------------------------------------- 
94
    bsf    H        ;Hupe ein 
95
    movlw    D'8'        ;Lade Zeit für 2 sec. 
96
    movwf    loops 
97
    call    wait 
98
    bcf    H        ;Hupe aus 
99
    movlw    D'4'        ;1 sec Pause 
100
    movwf    loops 
101
    call    wait 
102
    bsf    K2        ;Karusell 2 ein 
103
    movlw    D'60'        ;Lade Zeit für 15 sec 
104
    movwf    loops 
105
    call    wait 
106
    bcf    K2        ;Karusell 2 aus 
107
;-------------------------------------------------------------------- 
108
    movlw    D'40'        ;10 sec Pause 
109
    movwf    loops 
110
    call    wait 
111
;-------------------------------------------------------------------- 
112
    bsf    H        ;Hupe ein 
113
    movlw    D'8'        ;Lade Zeit für 2 sec. 
114
    movwf    loops 
115
    call    wait 
116
    bcf    H        ;Hupe aus 
117
    movlw    D'4'        ;1 sec Pause 
118
    movwf    loops 
119
    call    wait 
120
    bsf    K2        ;Karusell 2 ein 
121
    movlw    D'40'        ;Lade Zeit für 10 sec 
122
    movwf    loops 
123
    call    wait 
124
    bsf    H        ;Hupe ein 
125
    movlw    D'8'        ;Lade Zeit für 2 sec. 
126
    movwf    loops 
127
    call    wait 
128
    bcf    H        ;Hupe aus 
129
    movlw    D'4'        ;1 sec Pause 
130
    movwf    loops 
131
    call    wait    
132
    bsf    K1        ;Karusell 1 ein, 2 läuft noch 
133
    movlw    D'20'        ;5 sec Restlaufzeit für Karusell 2 
134
    movwf    loops 
135
    call    wait    
136
    bcf    K2        ;Karusell 2 aus; Karusell 1 noch 10 sec weiter 
137
    movlw    D'40'        ;10 sec Restlaufzeit für Karusell 1 
138
    movwf    loops 
139
    call    wait 
140
    bcf    K1        ;Karusell 1 aus 
141
;-------------------------------------------------------------------- 
142
    movlw    D'20'        ;5 sec Pause 
143
    movwf    loops 
144
    call    wait 
145
;-------------------------------------------------------------------- 
146
    bsf    H        ;Hupe ein 
147
    movlw    D'8'        ;Lade Zeit für 2 sec. 
148
    movwf    loops 
149
    call    wait 
150
    bcf    H        ;Hupe aus 
151
    movlw    D'4'        ;1 sec Pause 
152
    movwf    loops 
153
    call    wait 
154
    bsf    K1        ;Karusell 1 ein 
155
    movlw    D'20'        ;Lade Zeit für 5 sec 
156
    movwf    loops 
157
    call    wait 
158
    bsf    H        ;Hupe ein 
159
    movlw    D'8'        ;Lade Zeit für 2 sec. 
160
    movwf    loops 
161
    call    wait 
162
    bcf    H        ;Hupe aus 
163
    movlw    D'4'        ;1 sec Pause 
164
    movwf    loops 
165
    call    wait    
166
    bsf    K2        ;Karusell 2 ein, 1 läuft noch 
167
    movlw    D'40'        ;10 sec Restlaufzeit für Karusell 2 
168
    movwf    loops 
169
    call    wait    
170
    bcf    K1        ;Karusell 1 aus; Karusell 2 noch 5 sec weiter 
171
    movlw    D'20'        ;5 sec Restlaufzeit für Karusell 2 
172
    movwf    loops 
173
    call    wait 
174
    bcf    K2        ;Karusell 2 aus 
175
;-------------------------------------------------------------------- 
176
    movlw    D'20'        ;5 sec Pause 
177
    movwf    loops 
178
    call    wait 
179
    goto    M1        ;Sprung an Anfang 
180
;-------------------------------------------------------------------- 
181
182
    
183
;************************************************************* 
184
;*      Unterprogramme 
185
;*    ---------------------------------- 
186
; 
187
; Warteschleife    250ms*Wert aus loops 
188
wait    movlw   D'250'        ;1. Zähler auf 250 
189
        movwf   loops1   
190
wai     movlw   D'250'      ;2. Zähler auf 250 
191
        movwf   loops2         ;loops1 wird 250 mal durchlaufen => 250*250*4µs => 250ms 
192
wai2    nop             ;loops2 wird 250 mal durchlaufen je 4 Befehle = 4µs => 1ms 
193
        decfsz  loops2, F    ;2. Zähler minus 1, schon 0? 
194
        goto    wai2        ;nein, noch nicht 
195
        decfsz  loops1, F   ;1. Zähler minus 1, schon 0? 
196
        goto    wai         ;nein, noch nicht 
197
        decfsz    loops, F    ;3. Zähler minus 1, schon 0?    
198
    goto    wait        ;nein noch nicht 
199
    retlw    0        ;Rückkehr zum Hauptprogramm 
200
201
    end

von ich (Gast)


Lesenswert?

Versuch mal die Register OPTION_REG, INTCON, PIE1, IOC und WPU auf 0 zu 
setzen. Kannst ja mal gucken, was das alles ist, ich hab in deinem 
Programm jedenfalls nichts gesehen, was etwas davon braucht (Interrupts 
etc).

von ich (Gast)


Lesenswert?

mist, drauf reingefallen.. GPPU ist negiert.. also OPTION_REG auf 
0b10000000, also 128.

Christian schrieb:
> call    0x3FF            ;Lade 3FF für Taktgeneratorkalibrierung

daran könnte es natürlich auch liegen ;) statt call mal movlw nehmen. 
Zudem ist OSCCAL ein Register, das 8 Bit groß ist, deine Zahl aber 12.. 
also hier auch 128 rein, für Center-Frequenz.

von bingo (Gast)


Lesenswert?

1
  bank1           ; macro für Bank 1
2
  CALL 0x3FF 
3
  MOVWF OSCCAL

ist die korrekte Belegung des OSCCON mit dem Kalibrierungswert. Der 
spielt aber keine Rolle, weil hier keine zeitkritischen Dinge 
stattfinden, OSCCAL beeinflusst die Taktfrequenz nur in einem begrenzten 
Rahmen.

Die Warteschleife sieht bei sprut.de übrigens anders aus:
1
;***********************************************************************
2
; Zeitverzögerung um W * 1 ms
3
; 4 MHz externer Takt bedeutet 1 MHz interner Takt
4
; also dauert 1 ms genau 1000 Befehle
5
; 110 Schleifen a 9 Befehle sind 990 Befehle = 0.99 ms
6
; die restlichen 10 Befehle für Einsprung und Rücksprung
7
8
wait250
9
  movlw  D'250'      ; 250 ms
10
waitw
11
  movwf  wloop1      ; W * 1 ms
12
wait1ms 
13
  movlw  D'110'      ; 9 x 110 = 1 ms
14
  movwf  wloop2
15
wait9us
16
  nop
17
  nop
18
  nop
19
  nop
20
  nop
21
  nop
22
  decfsz  wloop2, f
23
  goto  wait9us      ; innere Schleife
24
25
  decfsz  wloop1, f
26
  goto  wait1ms      ; äussere Schleife
27
28
  return

von Lehrmann M. (ubimbo)


Lesenswert?

Hallo,

ich will das mal stückweise durchgehen. Kann sein, dass es ein bisschen 
hart für dich wird nicht persönlich nehmen - ich versuche nur ein 
bisschen deine Fähigkeiten und Sinne zu schulen.

Christian schrieb:
> über eine PICF629

Diesen PIC gibt es nicht.

Christian schrieb:
> Die Spannungsversorgung
> wird über eine Z-Dioden stabilisierte Einweggelichrichtung erzeugt.

Das ist keine Spannungsversorgung sondern ein Quick 'n Dirty. Nicht 
sonderlich gut.

Ich entnehme dieser Beschreibung, dass es sich um eine 
Wechselstromanlage handelt ?!

Christian schrieb:
> Als
> Eingang und damit als Starttaster wird GP3 verwendet.

Okay mit Pullup (gut), Pulldown (ok) oder als Wechsler (schlecht)

Stichwort Interrupt für deine PIC-Schulung (brauchst du bei diesen 
geringen Anforderungen an den PIC nicht, ist aber immer gut zu wissen)

Christian schrieb:
> Die Ausgänge sind
> über Transistorstufen an die Aktoren geschaltet.

PNP oder NPN, welche Vorwiderstände ?

Christian schrieb:
> Zu meiner großen Enttäuschung
> funktioniert das Programm leider nicht.

Welche Configbits hast du gesetzt? Wie ist MCLR beschalten? Welche 
Taktquelle hast du real? Übernimmst du die ConfigBits aus dem Code oder 
setzt du in der Programmersoftware neue?

Christian schrieb:
> Zu Versuchszwecken kommentierte ich
> schon die Abfrage für den Starttaster aus und veränderte natürlich auch
> die Marke entsprechend.

Du hast keinerlei Entprellung realisiert, das ist überhaupts nicht gut.

Christian schrieb:
> Ich vermutete, dass ich als Anfänger mit meinen Experimenten den PIC
> zerschossen habe (durch dummerweises überschreiben des OSCALL), was sich
> aber nicht bestätigte, denn nach dem Brennen eines Lernbeispiels von der
> Seite sprut.de (und wiederherstellen des OSCALL) läuft dort das
> Beispiel.

Man kann einen PIC nicht auf diese Art und Weise zerstören bzw. 
unbrauchbar machen wie die AVRs. Das Register OSCALL gibt es nicht. Dein 
Compiler weiß das nicht ... darum ist immer Präzision erforderlich.


Stelle bitte mal deinen Schaltplan ein, dann können wir uns dem Code 
widmen.

von Christian (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Michael,

nur konstruktive Krtik bringt vorwärts, auch wenn diese manchmal hart 
erscheint.

Tippfehler sind immer da, insbesondere dann, wenn man das eigene 
Schreiben nur oberflächlich korrigiert. Sorry.

Es handelt sich um einen PIC 12F629. Die "12" ist verschwunden.

Zur Klärung der Beschaltung des Bausteins die angehängte Datei. Ich 
bitte die Form zu entschuldigen. Die Platine habe ich ordentlich 
gezeichnet, die äußere Beschaltung nicht.

Alle Pins, mit Ausnahme GP3 sind in der INIT-Routine als Ausgänge 
gesetzt.
1
;************************************************************* 
2
;*      Initialisierung 
3
;*    ----------------------------------    
4
init    bcf    STATUS, RP0        ;Auswahl Bank 0 
5
    clrf    GPIO            ;alle E/A aus 
6
    movlw    0x07            ;Vorbereitung für Komperator aus 
7
    movwf    CMCON            ;Komperator aus, Freigabe GP4+5 
8
    bsf    STATUS, RP0        ;Umschalten auf Bank 1 
9
    movlw    B'00001000'        ;GP3=Eingang GP0,1,2,4,5 Ausgang 
10
    movwf    TRISIO            ;nach Register schieben 
11
    bcf    STATUS, RP0        ;Rückschalten auf Bank 0 
12
    bsf    STATUS, RP0        ;Umschalten auf Bank 1 
13
    call    0x3FF            ;Lade 3FF für Taktgeneratorkalibrierung 
14
    movwf    OSCCAL            ;4 MHz Kalibrierung 
15
    bcf    STATUS, RP0        ;Rückschalten auf Bank 0 
16
    return                ;Rückkehr nach call

Die config-Bits sind wie folgt gesetzt:
1
 __CONFIG _CP_OFF &  _BODEN_OFF & _MCLRE_OFF & _PWRTE_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT
Entprellen ist sicherlich noch notwendigerweise einzuarbeiten. Im ersten 
Step bin ich schon glücklich die einfache Routine zu laufen zu bringen.

In der Hoffnung auf weitere fruchtbringende Hinweise verbleibe ich

mit freundlichem Gruß

Christian.

von ich (Gast)


Lesenswert?

ich schrieb:
> Versuch mal die Register OPTION_REG, INTCON, PIE1, IOC und WPU auf 0 zu
> setzen. Kannst ja mal gucken, was das alles ist, ich hab in deinem
> Programm jedenfalls nichts gesehen, was etwas davon braucht (Interrupts
> etc).

ich schrieb:
> mist, drauf reingefallen.. GPPU ist negiert.. also OPTION_REG auf
> 0b10000000, also 128.
>
> Christian schrieb:
>> call    0x3FF            ;Lade 3FF für Taktgeneratorkalibrierung
>
> daran könnte es natürlich auch liegen ;) statt call mal movlw nehmen.
> Zudem ist OSCCAL ein Register, das 8 Bit groß ist, deine Zahl aber 12..
> also hier auch 128 rein, für Center-Frequenz.

Schon probiert? ;) seh ich nämlich nicht. Call setzt den ProgramCounter 
(also die Adresse im Flashspeicher, wo das prog grade ist) auf den Wert 
bzw. auf die Zeile, wo das Label ist. Zusätzlich speichert er die 
Flash-Adresse, in dem der Call-Befehl steht, im Stack. Also springt er 
an die Adresse 0x3FF, da wird aber sehr warscheinlich nichts sein und 
das Programm läuft ans Ende vom Flash-Speicher.. Ende..

bingo schrieb:
> ist die korrekte Belegung des OSCCON mit dem Kalibrierungswert

Ich hab im Datenblatt gesucht und nichts mit "OSCCON" gefunden. Hat das 
wohl nicht.


Ich würde deinem Taster einen Pull-Up-Widerstand spendieren oder den 
Internen Benutzen.

von ich (Gast)


Lesenswert?

So ich wollte es nochmal wissen... Die letzte Adresse im 
Programm-Speicher ist 0x03FF... Also machst du mit "call 0x3FF" nichts 
anderes, als an die letzte Zeile vom Programmspeicher zu springen. 
Danach hört er meines Wissens auf und ist.. am ende.. macht nichts 
mehr.. Aber selbst, wenn er wieder von vorne anfängt, springst du gleich 
wieder hin.. Also kann es nicht gehen.

von Christian (Gast)


Lesenswert?

Hallo Michael,

in Ergänzung zu meiner vorigen Antwort:
Beim Brennen verändere ich weder die config-bits noch den OSCCAL-Wert.

Letzeres habe ich unvorsichtiger (oder auch aus 
Anfängerahnungslosigkeit) gemacht, inzwischen aber der Ursprungswert 
wieder zurückgeschrieben.

Meine Schaltung scheint schon einigermaßen zu funktionieren, denn ich 
lud in den PIC eine Lernsoftware von sprut.de. Diese Programm 
funktioniert auf meinem PIC. Allerdings ist dieses Lehrbeispiel mit 
Interruptroutinen organisiert. Deshalb habe ich immer noch die 
Vermutung, dass ich mir beim Brennen doch den PIC in der Routine zur 
Kalibrierung verdorben habe. Ich überschrieb den vom Brenner gelesenen 
Wert mit x3ff. Nach dem Erkennen meines Fehlers schrieb ich den 
ursprünglichen Wert wieder ein. Vielleicht jedoch falsch.

Gruß
Christian.

von M. J. (manfred-64)


Lesenswert?

Wie so gibt es immer wieder Leute die hier Fragen stellen und die 
Antworten dann nicht lesen :(
Das durchwirrt mich völlig, last das Bitte Bitte Bitte...

von stepp64 (Gast)


Lesenswert?

Also, bei den 12F629 steht im jungfräulichen Zustand auf 0x03FF ein
RETLW Kallibrierungswert. Das heist, dass man den Kallibrierungswert mit 
einem CALL 0x03FF ins W Register zurückbekommt. ABER: wenn deine 
Brennsoftware den gesamten Flash beschreibt, wird sie auch das RETLW auf 
0x03FF überschreiben und dann hängt sich dein PIC auf. Ich würde dieses 
CALL erst einmal auskommentieren, da es nicht wichtig ist, wie genau 
deine Zeiten eingehalten werden. Was hast du denn auf 0x03FF 
geschrieben? nur den Wert oder ein RETLW Wert?

Zu deiner Schaltung: Durch den 1k im Netzteil begrenzt du den zur 
Verfügung stehenden Strom auf ca. 7mA. Das könnte funktionieren, muss 
aber nicht. Ich würde da ein Übliches Netzteil mit Brückengleichrichter 
und 7805 bauen.

Die Beschaltung an GP3 ist auch Unsinn. Der Eingang hängt bei nicht 
gedrücktem Taster in der Luft. Du brauchst einen Pullup. Also den 1k 
(besser sind 10k) zwischen +5V und GP3 und den Taster zwischen GP3 und 
Masse. Die Diode kannst du weglassen.

Am Programm selbst hab ich erst mal auch nichts weiter gefunden. Sollte 
also gehen.

Sven

von Christian (Gast)


Lesenswert?

Hallo Sven,

vielen Dank für die ersten Ansätze zur Lösung meines Problems.

Ich werde das heute abend sofort ausprobieren und dann berichten.
Ich schrieb einen Wert (x34FF) zurück und bin langsam davon überzeugt, 
dass dort die Ursache zu suchen ist.

Meine Schaltung werde ich deinen Hinweisen entsprechend abändern.

Vielen Dank

Christian

von ich (Gast)


Lesenswert?

Einmal versuche ich es auch noch.

1.) Ändere
1
init    bcf    STATUS, RP0        ;Auswahl Bank 0 
2
    clrf    GPIO            ;alle E/A aus 
3
    movlw    0x07            ;Vorbereitung für Komperator aus 
4
    movwf    CMCON            ;Komperator aus, Freigabe GP4+5 
5
    bsf    STATUS, RP0        ;Umschalten auf Bank 1 
6
    movlw    B'00001000'        ;GP3=Eingang GP0,1,2,4,5 Ausgang 
7
    movwf    TRISIO            ;nach Register schieben 
8
    bcf    STATUS, RP0        ;Rückschalten auf Bank 0 
9
    bsf    STATUS, RP0        ;Umschalten auf Bank 1 
10
    call    0x3FF            ;Lade 3FF für Taktgeneratorkalibrierung 
11
    movwf    OSCCAL            ;4 MHz Kalibrierung 
12
    bcf    STATUS, RP0        ;Rückschalten auf Bank 0 
13
    return                ;Rückkehr nach call

in
1
init    bcf    STATUS, RP0   ;Auswahl Bank 0 
2
    clrf     GPIO            ;alle E/A aus 
3
    movlw    0x07            ;Vorbereitung für Komperator aus 
4
    movwf    CMCON           ;Komperator aus, Freigabe GP4+5 
5
    clrf     INTCON          ;löschen des INTCON-Registers
6
    bsf      STATUS, RP0     ;Umschalten auf Bank 1 
7
    movlw    B'00001000'     ;GP3=Eingang GP0,1,2,4,5 Ausgang 
8
    movwf    TRISIO          ;nach Register schieben 
9
    movlw    0x80            ;Lade 0x80 für Taktgeneratorkalibrierung 
10
    movwf    OSCCAL          ;Kalibrierung Centerfrequenz
11
    movlw    0x80            ;Lade 0x80 für OPTION_REG 
12
    movwf    OPTION_REG      ;Ausschalten der Pull-Ups, einstellen der Timer
13
    clrf     WPU             ;Ausschalten der Pull-Ups
14
    clrf     PIE1            ;Ausschalten der Interrups
15
    clrf     IOC             ;Ausschalten der Interrups
16
    bcf      STATUS, RP0     ;Rückschalten auf Bank 0 
17
    return                   ;Rückkehr nach call

2.) Ändere, wie schon von stepp44 erwähnt, deine 1-Dioden-Gleichrichtung 
durch einen Brückengleichrichter und einen 7805. Der hat auch bei 10mA 
oder 100mA oder 500mA konstante 5V. Daran kannst du dann auch deine LEDs 
hängen, nicht, dass die dann leicht flackern durch die Halbwellen.

3.) Hänge einen Pull-Up-Widerstand von ca. 10k Ohm an den Pin vom 
Taster.

4.) Poste, wenn du die 3 Schritte probiert hast, ob es funktioniert oder 
nicht.


!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!ICH HOFFE, DU SIEHST MEINEN POST DIESES MAL!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!ICH HOFFE, DU SIEHST MEINEN POST DIESES MAL!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

von Christian (Gast)


Lesenswert?

Hallo ich,

vielen Dank für die Hinweise.
Die Änderung der Schaltung werde ich entsprechend ausführen und die 
Änderung der init-Routine heute abend testen, sowohl Svens als auch die 
oben stehende. Das Ergebnis poste ich natürlich.

Nochmals vielen Dank an alle, die mir bis hierher schon Ratschläge 
gaben.

Mit freundlichem Gruß

Christian.

von chrisabi (Gast)


Lesenswert?

Hallo,

ich habe die obigen Hinweise in meine init-Routine eingebaut und:

*fett*ES FUNKTIONIERT!!!*fett*

Vielen Dank an die freundlichen Hilfen. Jetzt kommen die weiteren 
Programmschritte dran und die Deatilanalysen der Befehlsfolgen
1
    movlw    0x80            ;Lade 0x80 für Taktgeneratorkalibrierung 
2
    movwf    OSCCAL          ;Kalibrierung Centerfrequenz
3
    movlw    0x80            ;Lade 0x80 für OPTION_REG 
4
    movwf    OPTION_REG      ;Ausschalten der Pull-Ups, einstellen der Timer
5
    clrf     WPU             ;Ausschalten der Pull-Ups

die den entscheidenden Anstoß zur Funktionsaufnahme gaben.

Nochmals vielen Dank an "ich" zum Hinweis.

Mit freundlichem Gruß

Christian.

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.