Forum: Mikrocontroller und Digitale Elektronik PIC12F683 2 LED auf ON


von Reiner L. (reiner_l)


Lesenswert?

Hallo an alle,

ich habe zwar schon oft hier gelesen, aber jetzt habe ich ein Problem zu 
dem ich keine Antwort gefunden habe.
Der von mir benutzte PIC12F683 soll 2 LED naheinander einschalten, die 
dann aber auch aktiv bleiben sollen.
Ich kenne das vom 16F628A, da ist es kein Problem wenn ich z.B.
    BSF PORTB,RB1  ; LED1
    BSF PORTB,RB2  ; LED2
ausführe, dann wird eine LED nach der anderen auf ON gesetzt.
Das gleiche, denke ich tue ich beim 12F683 mit
    BSF GPIO, GP2
    BSF GPIO, GP5
aber das funktioniert nicht, ich kann GP5 nur auf ON setzen, wenn ich 
zuvor GP2 auf OFF setze?

Gibt es dafür eine Erklärung, ich habe keine.

Danke vorab, Gruß Reiner

von Teo (Gast)


Lesenswert?

Nein, ist .... sollte identisch sein.
Funst da nicht auch die Makroexpansion?! Wenn ja, sieh dir halt mal an 
was da dahinter steckt.
Evtl. sitzt Du da dem Read-Modivied-Error auf.
Das heißt die LED zieht den Pin auf Lowpegel und da erst mal der gesamte 
Port eingelesen wird, wird da auch eine null gelesen und auch wieder 
zurückgeschrieben. Die LED löscht sich quasi selbst.... Hast Du da evtl. 
keinen VRs an den LEDs?!

von Frank K. (fchk)


Lesenswert?

Hast Du im ANSEL Register die ANSx Bits für die verwendeten Portbits 
gelöscht? Nach einem Reset sind die auf 1, und damit sind die Bits als 
analoge Portbits konfiguriert. 0 konfiguriert sie als digitale Portbits. 
Ist ein typischer Anfängerfehler.

fchk

von Helfer (Gast)


Angehängte Dateien:

Lesenswert?

Vermutlich fehlt das Abschalten der analogen Funtktion auf GP2.
- Comparator richtig konfiguriert?
- ADC richtig konfiguriert?
- CCP-Modul richtig konfiguriert?

Das entfällt beim 16F628, da an RB1/RB2 nur "digitale" Funktionen 
liegen.

von Hans B. (Gast)


Lesenswert?

Könnte wie bereits beschrieben ein Konfigurationsproblem sein.
Überprüfe genau: Komparator abgeschaltet?
UND:
Wenn zwei bsf-Befehle unmittelbar hintereinander stehen kann es immer 
Probleme geben. (read-modify-write)
Durch kapazitive Belastung des Portpins dauert es ein wenig bis wirklich 
ein neuer Pegel anliegt. Ist der nächste Befehl schneller da, dann 
gibt's "Fehlfunktionen".
Teste einmal, 1 od. 2 "nop" zwischen den bsf-Befehlen. (So mach ich das 
fast immer.)
Einige "PIC-Fallen" sind bei sprut.de gut beschrieben:
https://www.sprut.de/electronic/pic/fallen/fallen.html

von Peter D. (peda)


Lesenswert?

Die beiden genannten PIC haben keine extra Adresse für das Output-Latch, 
d.h. Bitbefehle lesen erst den Eingang ein (von hinten durch die Brust 
ins Auge). Da das einen Zyklus dauert, ist der Wert bei aufeinander 
folgenden Befehlen veraltet, der erste Bitbefehl wird daher ignoriert.
Steht aber auch im Datenblatt:
"5.3.2 SUCCESSIVE OPERATIONS ON I/O PORTS
...
When in doubt, it is better to separate these instructions with a NOP or 
another instruction not accessing this I/O port."

Neuere PIC16/18 haben extra Output-Register, damit tritt das Problem 
nicht mehr auf.

: Bearbeitet durch User
von reiner_l (Gast)


Lesenswert?

Hallo an Alle und vielen Dank für die vielen Informationen.

Ich versuche mal alle Hinweise, soweit ich sie verstehe abzuarbeiten.
1. ANSEL wird im Startbereich ausgeführt, sollten also alle Ports auf 
Digital I/O stehen, ich kann die LED ja auch direkt einzeln schalten 
On/Timer/Off.

2. Komparator abgeschaltet? Kann ich nur beatworten wenn der Befehl 
dafür genannt wid, dann prüfe ich das. Ich denke ja.

3. Mit NOP zwischen den beiden Befehlen habe ich es noch nicht versucht, 
aber ich hatten schon eine Zeitschleife von 0.5 Sewkunden dazwischen, 
das ändert nichts. Kann sein das da NOP besser ist. Das Problem hatte 
ich aber beim 16F628 noch nicht. Da kann ich direkt, wie oben 
dargestellt, zwei oder mehr LED's nacheinander einschalten und der 
Status bleibt auch erhalten, bis der nächste BCF-Befehl für die LED 
kommt?

Leider kann ich erst heute Abend prüfen was ihr so geschrieben habt.
Wie würde denn der Befehl für(2.) aussehen?

Danke und Gruß Reiner

von bingo (Gast)


Lesenswert?

reiner_l schrieb:
> Wie würde denn der Befehl für(2.) aussehen?

Der Komparator ist in Kapitel 8 des Datenblattes ausführlich beschrieben

von Reiner L. (reiner_l)


Lesenswert?

Ja, vielen Dank bingo, wo es steht wüßte ich schon, habe es eben auch 
noch mal versucht zu lesen, aber mein Englisch ist nicht so toll, ich 
verstehe also eigentlich nur Bahnhof.
Könnte mir aber auch vorstellen das ich es in Deutsch eben so wenig 
verstehen würde.
Deshalb brauche ich die Infos für totale Blindgänger ;-).

Gruß Reiner

: Bearbeitet durch User
von Hans B. (Gast)


Lesenswert?

Teo hat auch schon gefragt wie stark der Ausgang für die LED belastet 
wird.
Bei zu hoher Last sinkt der Spannungspegel am Pin möglicherweise so weit 
ab, dass read-modify-write falsche Ergebnisse liefert!
Pin hat bei HI grösseren Innenwiderstand als bei LOW. Daher schalte ich 
LEDs meistens nach LOW=ON. Bei kleinen Betriebsspannungen (z.B. 3V) des 
PIC steigt der Innenwiderstand der Portpins stark an!

von bingo (Gast)


Lesenswert?

Reiner L. schrieb:
> Deshalb brauche ich die Infos für totale Blindgänger ;-).

benutze im PDF-Dokument mal die Suchfunktion und suche nach 'comparator 
off', wenn Du dann immer noch nicht durchblickst, melde Dich nochmal und 
erläutere, was Du da nicht verstehst.

Keine Angst, hier wird Dich geholfen (neue Version von hier wirst Du 
geholfen :) )

von bingo (Gast)


Lesenswert?

ach ja, beim oben erwähnten Sprut steht das auch

von Cartman (Gast)


Lesenswert?

> Pin hat bei HI grösseren Innenwiderstand als bei LOW.

Das war bei vielen TTL im letzten Jahrtausend so.

Ein PIC hat komplementaere CMOS-Treiber am Ausgang.
Der kann LO genauso viel "sinken", wie HI "sourcen".
Schreib dir das auf, wenn du dir das nicht merken kannst.

von bingo (Gast)


Lesenswert?

Cartman schrieb:
> Der kann LO genauso viel "sinken", wie HI "sourcen".
> Schreib dir das auf, wenn du dir das nicht merken kannst.

Es muss nicht unbedingt sein, dass push-pull-Ausgänge bzgl. sink-source 
symmetrisch sein, bei den PICs ist das aber zumindest etwa so.

von Cartman (Gast)


Lesenswert?

> bei den PICs ist das aber zumindest etwa so.

Ich bin ja auch ein begeisterter Datenblattleser!
Und kann mir solche Dinge auch merken.

von Reiner L. (reiner_l)


Lesenswert?

OK, ich vermute mal das dies die Info ist, die ich benötige:
Zitat Sprut ->
Damit ein Ausgangspin auch als Ausgangspin funktioniert, muss das 
zugehörige Bit im TRIS-Register des Ports auf 0 gesetzt werden.
Ich werde das also heute Abend mal prüfen.

Ich meine aber das ich im TRIS-Register alles auf 0 setze?

Danke dafür, Gruß Reiner

von Cartman (Gast)


Lesenswert?

> Es muss nicht unbedingt sein, dass push-pull-Ausgänge bzgl.
> sink-source symmetrisch sein

Naja, mit steigenden Geschwindigkeiten ist das eher schon
ein unumgaenglices Erfordernis, wenn man impedanzkontrolliert
Teile von Schaltungen verbinden will.
Wie will man eine "Leitung" seriell richtig terminieren, wenn
der Ausgangstreiber je nach Logikpegel seine Quellimpedanz
aendert.

von Hans B. (Gast)


Lesenswert?

Cartman schrieb:
> Der kann LO genauso viel "sinken", wie HI "sourcen"

Ja, das ist richtig ABER:
Ich hab Datenblätter, die Grafiken enthalten und darin die Spannungen am 
Pin gegenüber der Strombelastung darstellen. Da gibt's eine f. HI u. 
eine f. LO und die zeigen unterschiedliche Spannungsverluste.
Besonders dann, wenn die Betriebsspannung klein ist.
Allerdings hab ich das niemals nachgemessen.

von Reiner L. (reiner_l)


Lesenswert?

Oh ja, sehr interessant.
Bin aber nicht sicher, helfen mir eure Beiträge weiter?

;-) Gruß Reiner

von bingo (Gast)


Lesenswert?

bei Sprut steht u.a. der Satz (12F675 und 12F683 sind da identisch)
; 12F675 alle Comparator-/ADC-Eingänge auf Digital umschalten

Im Datenblatt steht bei der Beschreibung von CMCON0:
111 = CIN pins are configured as I/O, COUT pin is configured as I/O, 
Comparator output disabled, Comparator off.

D.h. Du musst Bit 0-2 des CMCON0 auf 1 setzen.

von Hans B. (Gast)


Angehängte Dateien:

Lesenswert?

Hans B. schrieb:
> Cartman schrieb:
>> Der kann LO genauso viel "sinken", wie HI "sourcen"

Nachtrag zu meinen möglicherweise missverstandenen Hinweisen zum 
Innenwiderstand der Portpins. Was gemeint war ist:
Auf der beiliegenden Grafik (bei 5V Betriebsspannung) kann man die 
typischen Pinspannungen bei Belastung entnehmen.
zB. HI mit 20 mA belastet:  ca. 3 V zu erwarten  (2V Spannungsverlust)
    LO mit 20 mA            ca. 0,5 V            (ca. 0,5V Verlust)

Wie man sehen kann wird bei 20mA HI der Logik-HI-Pegel möglicherweise 
nicht mehr erreicht. (5mA sollten immer OK sein)
bei 3 V Betriebsspannung sieht's noch deutlich schlechter aus.
Ob das bei allen PIC-Familien so ist hab ich nicht nachgesehen - da 
müsste man die die "alles" umfassenden Datenblätter ansehen.
(PICmicro Mid-Range MCU Family Reference Manual?)

von Reiner L. (reiner_l)


Lesenswert?

OK, bingo, das bringt mich weiter, werde ich prüfen.
Danke

von Reiner L. (reiner_l)


Lesenswert?

Hallo, ich konnte jetzt meinen Code auf Eure Hinweise prüfen und bin der 
Meinung, der passt.

Um euch aber einen besseren Einblick zu geben, eine kurze Beschreibung, 
was soll das Projekt tun, gefolgt vom gesamten Code.

Es handelt sich um einen Öffner für Tore die mit einem Elektromagneten 
verriegelt sind.
Das hatte ich zuerst in konventioneller Elektronik umgesetzt, aber die 
Relais zicken ab und zu mal rum, deshalb sollten jetzt mehr 
elektronische Komponenten zum Einsatz kommen.

Also für die Logik der Microcontroller, die Relais werden durch LR7843 
oder soetwas ersetzt.

Ein Tastenfeld gibt nach Freigabe die 12V auf die Steuerung. Ein 
Spannungsregler stellt daraus die 5V bereit. Es gibt 2 LED Taster, für 
rechtes- und linkes Tor, die nach anliegen der 5V blinken sollen. Das 
betätigen eines Tasters soll dann über einen Optokoppler den jeweiligen 
LR7843 ansteuern und für ca. 5-6 Sekunden das Magnetschloss entriegeln.
Das betätigen des Tasters soll die jeweilige LED dann leuchten lassen 
und gleichzeitig die LED des Optokopplers ansteuern. Nach den 5-6 
Sekunden soll zumindest die LED des Optokopplers abfallen, die andere 
könnte weiter leuchten, weil nach ca 10 Sekunden das Nummernfeld den 
Strom weg nimmt.

Grundsätzlich funktioniert der Code so wie ich in jetzt erstellt habe.
Aktuell habe ich mir dahingehend geholfen, dass nach betätigen eines 
Tasters die zugehörige LED für ca. 1 Sekunde leuchtet und dann ausgeht, 
dann nach ca. 0,5 Sekunden die LED für den Optokoppler für die 5-6 
Sekunden angestuert wird, dansch wieder für 1 Sekunde die Taster LED 
leuchtet.
Ich hoffe ich konnte das einigermaßen verständlich schreiben.

Hier dann der vollständige Code für den PIC:
1
; TODO INSERT CONFIG CODE HERE USING CONFIG BITS GENERATOR
2
; PIC12F863 Configuration Bit Settings
3
;
4
; ::RL220105 - Opener for Transit Bike Garage:
5
;   bei Betätigung eines Tasters jeweils rechtes und linkes Tor
6
;   soll ein Relais und eine LED für ca. 5-6 Sek. angesprochen werden
7
;
8
; als Taktgeber wird der intern Takt von 4MHz genutzt, dazu __CONFIG _FOSC_INTOSCIO ....
9
; bei externen Takt __CONFIG _FOSC_XT ...... setzen
10
; Assembly source line config statements
11
12
; PIC12F683 Configuration Bit Settings
13
14
; Assembly source line config statements
15
16
#include "p12f683.inc"
17
;#include <p12F683.inc>  ;auch gültige Schreibweise
18
     __config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _IESO_OFF & _FCMEN_OFF)
19
     
20
;Variablendefinition im Block 
21
CBLOCK 0x20
22
    d1
23
    d2
24
    d3
25
ENDC 
26
27
     org 0                ; Start at flash address 0
28
     
29
delay  res  1
30
counter  res  1
31
  
32
Start:
33
     bsf    STATUS,RP0    ; Select Registers at Bank 1
34
     movlw  0x70
35
     movwf  OSCCON        ; Set the internal clock speed to 8 Mhz
36
     movlw  0x07
37
     movwf  CMCON0        ; Turn off Comparator (GP0, GP1, GP2)
38
     clrf   ANSEL         ; Make all ports as digital I/O
39
     MOVLW b'00011000'    ; GP5=Out, GP4 und GP3=In, GP3 und GP2=Out, GP0=Out
40
     movwf  TRISIO        ; TRISIO = 0x38
41
     bcf    STATUS,RP0    ; Back to Registers at Bank 0
42
43
MainLoop:
44
     ;die LED's aus
45
     BCF GPIO, GP0
46
     BCF GPIO, GP1
47
     BCF GPIO, GP2
48
     BCF GPIO, GP5
49
     
50
     CALL BLINK
51
     
52
    goto   MainLoop      ; Goto MainLoop
53
     
54
BLINK   
55
    ;prüfen ob ein Taser gedrückt wurde?
56
    BTFSS GPIO, GP3    ;wenn GP3 offen = 0 (GP3 liegt immer an 1, beim Betätigen geht er auf 0), dann nächste Zeile überspringen
57
    goto   NOTPRESS
58
    BTFSS GPIO, GP4    ;wenn GP4 offen = 0 (GP4 liegt immer an 1, beim Betätigen geht er auf 0), dann nächste Zeile überspringen
59
    goto   NOTPRESS
60
    ;ab hier Blinkroutine ausführen
61
    BSF GPIO, GP1  ; BSF S steht für Set setzt GP1 auf 1  -> sonst BCF C steht für Clear würde den GP1 auf 0 setzen
62
    call _delay_0_2s  ; ruft Wait Funktion auf, die Funktion ist unten definiert und wartet Dalay 1 = ca. 1 Sekunde
63
    BCF GPIO, GP1     ; BCF S steht für Set setzt GP2 auf 0  -> schaltet den Port auf LOW
64
    ;
65
    BSF GPIO, GP2  ; BSF S steht für Set setzt GP1 auf 1  -> sonst BCF C steht für Clear würde den GP1 auf 0 setzen
66
    call _delay_0_2s  ; ruft Wait Funktion auf, die Funktion ist unten definiert und wartet Dalay 1 = ca. 1 Sekunde
67
    BCF GPIO, GP2  ; BCF S steht für Set setzt GP1 auf 0  -> schaltet den Port auf LOW
68
    
69
    goto  BLINK
70
  
71
NOTPRESS
72
     btfss GPIO, GP3    ;wenn GP3 offen = 0 (GP3 liegt immer an 1, beim Betätigen geht er auf 0), dann nächste Zeile überspringen
73
     call _SET_LEDS_GPR_ON ;dann das, schalte LED an GP2 für ca. 6 Sekunden an
74
     BCF GPIO, GP2     ; BCF S steht für Set setzt GP2 auf 0  -> schaltet den Port auf LOW
75
     
76
     btfss GPIO, GP4    ;wenn GP4 offen = 0 (GP4 liegt immer an 1, beim Betätigen geht er auf 0), dann nächste Zeile überspringen
77
     call _SET_LEDS_GPL_ON ;dann das, schalte LED an GP1 für ca. 6 Sekunden an
78
     BCF GPIO, GP1  ; BCF S steht für Set setzt GP1 auf 0  -> schaltet den Port auf LOW
79
     
80
     goto   NOTPRESS
81
     
82
;RL Functions     
83
_SET_LEDS_GPL_ON  ;Aktionen Links auslösen
84
    ;BANKSEL PORTB  ; wechselt PortB
85
    ; die gewünschte LED einschalten
86
    BSF GPIO, GP1  ; BSF S steht für Set setzt GP0 auf 1  -> sonst BCF C steht für Clear würde den GP1 auf 0 setzen
87
    call _delay_2s  ; ruft Wait Funktion auf, die Funktion ist unten definiert und wartet Dalay 1
88
    call _delay_2s  ; ruft Wait Funktion auf, die Funktion ist unten definiert und wartet Dalay 1
89
    BCF GPIO, GP1  ; BCF S steht für Set setzt GP0 auf 0  -> schaltet den Port auf LOW
90
    BSF GPIO, GP0  ; BSF S steht für Set setzt GP1 auf 1  -> sonst BCF C steht für Clear würde den GP1 auf 0 setzen
91
    call _delay_2s  ; ruft Wait Funktion auf, die Funktion ist unten definiert und wartet Dalay 1
92
    call _delay_2s  ; ruft Wait Funktion auf, die Funktion ist unten definiert und wartet Dalay 1
93
    call _delay_2s  ; ruft Wait Funktion auf, die Funktion ist unten definiert und wartet Dalay 1
94
    call _delay_2s  ; ruft Wait Funktion auf, die Funktion ist unten definiert und wartet Dalay 1
95
    call _delay_2s  ; ruft Wait Funktion auf, die Funktion ist unten definiert und wartet Dalay 1
96
    call _delay_2s  ; ruft Wait Funktion auf, die Funktion ist unten definiert und wartet Dalay 1
97
    call _delay_2s  ; ruft Wait Funktion auf, die Funktion ist unten definiert und wartet Dalay 1
98
    call _delay_2s  ; ruft Wait Funktion auf, die Funktion ist unten definiert und wartet Dalay 1
99
    call _delay_2s  ; ruft Wait Funktion auf, die Funktion ist unten definiert und wartet Dalay 1
100
    call _delay_2s  ; ruft Wait Funktion auf, die Funktion ist unten definiert und wartet Dalay 1
101
    ;BCF GPIO, GP0  ; BCF S steht für Set setzt GP0 auf 0  -> schaltet den Port auf LOW
102
    BCF GPIO, GP0  ; BCF S steht für Set setzt GP1 auf 0  -> schaltet den Port auf LOW
103
    BSF GPIO, GP1  ; BSF S steht für Set setzt GP0 auf 1  -> sonst BCF C steht für Clear würde den GP1 auf 0 setzen
104
    call _delay_2s  ; ruft Wait Funktion auf, die Funktion ist unten definiert und wartet Dalay 1
105
    call _delay_2s  ; ruft Wait Funktion auf, die Funktion ist unten definiert und wartet Dalay 1
106
    BCF GPIO, GP1  ; BCF S steht für Set setzt GP0 auf 0  -> schaltet den Port auf LOW
107
    goto   NOTPRESS     ; Loop NOTPRESS
108
     
109
_SET_LEDS_GPR_ON  ;Aktionen Links auslösen
110
    ;BANKSEL PORTB  ; wechselt PortB
111
    ; die gewünschte LED einschalten
112
    BSF GPIO, GP2  ; BSF S steht für Set setzt GP2 auf 1  -> sonst BCF C steht für Clear würde den GP2 auf 0 setzen
113
    call _delay_2s  ; ruft Wait Funktion auf, die Funktion ist unten definiert und wartet Dalay 1
114
    call _delay_2s  ; ruft Wait Funktion auf, die Funktion ist unten definiert und wartet Dalay 1
115
    BCF GPIO, GP2  ; BCF S steht für Set setzt GP0 auf 0  -> schaltet den Port auf LOW
116
    call _delay_2s  ; ruft Wait Funktion auf, die Funktion ist unten definiert und wartet Dalay 1
117
    BSF GPIO, GP5  ; BSF S steht für Set setzt GP5 auf 1  -> sonst BCF C steht für Clear würde den GP2 auf 0 setzen
118
    call _delay_2s  ; ruft Wait Funktion auf, die Funktion ist unten definiert und wartet Dalay ca. 0,5 Sekunden
119
    call _delay_2s  ; ruft Wait Funktion auf, die Funktion ist unten definiert und wartet Dalay ca. 0,5 Sekunden
120
    call _delay_2s  ; ruft Wait Funktion auf, die Funktion ist unten definiert und wartet Dalay ca. 0,5 Sekunden
121
    call _delay_2s  ; ruft Wait Funktion auf, die Funktion ist unten definiert und wartet Dalay ca. 0,5 Sekunden
122
    call _delay_2s  ; ruft Wait Funktion auf, die Funktion ist unten definiert und wartet Dalay ca. 0,5 Sekunden
123
    call _delay_2s  ; ruft Wait Funktion auf, die Funktion ist unten definiert und wartet Dalay ca. 0,5 Sekunden
124
    call _delay_2s  ; ruft Wait Funktion auf, die Funktion ist unten definiert und wartet Dalay ca. 0,5 Sekunden
125
    call _delay_2s  ; ruft Wait Funktion auf, die Funktion ist unten definiert und wartet Dalay ca. 0,5 Sekunden
126
    call _delay_2s  ; ruft Wait Funktion auf, die Funktion ist unten definiert und wartet Dalay ca. 0,5 Sekunden
127
    call _delay_2s  ; ruft Wait Funktion auf, die Funktion ist unten definiert und wartet Dalay ca. 0,5 Sekunden
128
    call _delay_2s  ; ruft Wait Funktion auf, die Funktion ist unten definiert und wartet Dalay ca. 0,5 Sekunden
129
    call _delay_2s  ; ruft Wait Funktion auf, die Funktion ist unten definiert und wartet Dalay ca. 0,5 Sekunden
130
    BCF GPIO, GP5  ; BCF S steht für Set setzt GP5 auf 0  -> schaltet den Port auf LOW
131
    BSF GPIO, GP2  ; BSF S steht für Set setzt GP2 auf 1  -> sonst BCF C steht für Clear würde den GP2 auf 0 setzen
132
    call _delay_2s  ; ruft Wait Funktion auf, die Funktion ist unten definiert und wartet Dalay 1
133
    call _delay_2s  ; ruft Wait Funktion auf, die Funktion ist unten definiert und wartet Dalay 1
134
    BCF GPIO, GP2  ; BCF S steht für Set setzt GP0 auf 0  -> schaltet den Port auf LOW
135
    goto   NOTPRESS     ; Loop NOTPRESS
136
    
137
138
    
139
;--------------------------------------------------------------------------- 
140
; Delay = 1 seconds
141
; Clock frequency = 4 MHz
142
; Actual delay = 1 seconds = 1000000 cycles
143
; Error = 0 %
144
_delay_2s
145
      ;999990 cycles
146
  movlw  0x07
147
  movwf  d1
148
  movlw  0x2F
149
  movwf  d2
150
  movlw  0x03
151
  movwf  d3
152
_delay_2s_0
153
  decfsz  d1, f
154
  goto  $+2
155
  decfsz  d2, f
156
  goto  $+2
157
  decfsz  d3, f
158
  goto  _delay_2s_0
159
160
      ;6 cycles
161
  goto  $+1
162
  goto  $+1
163
  goto  $+1
164
165
      ;4 cycles (including call)
166
  return
167
168
; Delay = 0.2 seconds
169
; Clock frequency = 4 MHz
170
; Actual delay = 0.2 seconds = 200000 cycles
171
; Error = 0 %
172
_delay_0_2s      ;199998 cycles
173
  movlw  0x3F
174
  movwf  d1
175
  movlw  0x9D
176
  movwf  d2
177
_delay_0_2s_0
178
  decfsz  d1, f
179
  goto  $+2
180
  decfsz  d2, f
181
  goto  _delay_0_2s_0
182
183
      ;2 cycles
184
  goto  $+1
185
  return
186
  
187
END
188
;EOF: Main.asm

Also wenn jemand noch mal Lust hat, ich hätte eben gern das die LED für 
den Optokoppler zeitgleich mit der Taster LED leuchtet.
Na dann, Danke und Gruß Reiner

von Teo (Gast)


Lesenswert?

Reiner L. schrieb:
> Grundsätzlich funktioniert der Code so wie ich in jetzt erstellt habe.

Grundsätzlich, ohne Angabe was nich, bzw. wie es gerade funst, nicht 
hilfreich!
Den "Rest" killt die "neue" Foren-SW! -> Sorry, null Bock....

von Hans B. (Gast)


Lesenswert?

gelöscht

von Hans B. (Gast)


Lesenswert?

Funktioniet dein Code wirklich irgendwie? Ich glaube nicht.
Nimm jetzt bitte einmal das Datenblatt, Seite 8, DATA MEMORY MAP OF
THE PIC12F683
z.B.
movwf  CMCON0        ; Turn off Comparator (GP0, GP1, GP2)
ABER es wurde wenige Zeilen vorher nach bank 1 umgeschaltet! CMCON0 
liegt aber in bank0. Siehe Seite 8. (Tatsächlich wird nach VRCON 
geschrieben!)
Komparator ist also noch EIN und die Pins sind blockert. Daher banksel 
CMCON0 vorher einfügen.
Irgendwo steht z.B. BANKSEL PORTB  Aber das git's nicht - sondern nur 
GPIO! siehe wieder Seite 8.
Der Code ist vorerst einmal auf weitere Fehler bei der Bankumschaltung 
genau zu prüfen und nachzubessern.

von H. H. (Gast)


Angehängte Dateien:

Lesenswert?

Ich hab das mal etwas lesbarer gemacht.

von Hans B. (Gast)


Lesenswert?

..sieht ja gleich besser aus.....Danke

von Hans B. (Gast)


Lesenswert?

Möglicherweise ist aber alles ganz anders weil:
Im Eingangspost steht PIC 12F683
Im Code steht aber einmal PIC 12F863 und dann wieder xxxx683
Was ist jetzt richtig und welches Datenblatt ?
Oder ist es eine ganz andere Nummer?

von H. H. (Gast)


Lesenswert?

Hans B. schrieb:
> Im Code steht aber einmal PIC 12F863

Offensichtlicher Zahlendreher.

von bingo (Gast)


Lesenswert?

Hans B. schrieb:
> m Code steht aber einmal PIC 12F863 und dann wieder xxxx683

Es gibt keinen PIC12F863

von Hans B. (Gast)


Lesenswert?

Ja genau!
Hab auch keinen gefunden (weltweiter Chipmangel)

von Reiner L. (reiner_l)


Lesenswert?

Vielen Dank für die vielen Antworten und für das bessere Optische 
aufbereiten des Code, wußte nicht was ich nutzen muss, damit es besser 
dargestellt wird, Sorry.

Aber hallo, nun bleibt mal entspannt, ja in der ersten Kommentar Zeile 
ist ein Schreibfehler, was für eine Verschwörung ;-), ich denke das 
sollte keinen Einfluss haben auf die Funktioinalität, bitte Hand heben 
wer anderer Meinung ist.

Aber halt da ist ja noch eine Zeile die komplett übel ist:
;BANKSEL PORTB  ; wechselt PortB
stimmt auch, aber auch das ist ein Kommentar.
Eine Zeile die aus einem anderen Code stammt der kopiert wurde.

Was Hans.B schreibt ist schon wirklich zu prüfen, Danke.
Da mach ich mir noch mal Gedanken drüber. Ich habe mir das Datnblatt 
angeshen. Leider verstehe ich nicht so Recht was genau da falsch ist. 
Super wäre eventuell eine Korrektur des Abschnitts.

Aber erst einmal schönen Abend noch und Gruß Reiner

von Reiner L. (reiner_l)


Lesenswert?

Hans.B ich habe das noch geprüft, gemeint ist sicher die Zeile:
bsf    STATUS,RP0    ; Select Registers at Bank 1
Ich denke da wird auf Bank0 geschaltet, der Kommentar ist falsch, oder ?

von Reiner L. (reiner_l)


Lesenswert?

Hans.B

Du hast aber trotzdem Recht mit der Zeile:

movwf  CMCON0        ; Turn off Comparator (GP0, GP1, GP2)

die habe ich jetzt direkt nach Start: eingefügt, dann funktioniert es 
tatsächlich das beide LED's gemeinsam leuchten.

Super Danke.

Jetzt aber wirklich schönen Abend.
Grüße

von Hans B. (Gast)


Lesenswert?

Tipp:
Wenn man nicht sicher ist in welcher bank das Rgister ist dann kann man 
einfach vor jedem Zugriff auf ein Register eifügen:
"banksel REGISTERNAME"
(Dann erzeugt der Assembler einen passenden Code zur Bankfestlegung.)
Im Datenblatt Seite 31, "GPIO PORT" steht auch ein fertiger Code für die 
Konfiguration der Pins als digitale IN/OUT:

BANKSEL GPIO   ;
CLRF   GPIO   ;Init GPIO
MOVLW   07h   ;Set GP<2:0> to
MOVWF   CMCON0   ;digital I/O
BANKSEL ANSEL   ;
CLRF   ANSEL   ;digital I/O
MOVLW   0Ch   ;Set GP<3:2> as inputs
MOVWF   TRISIO   ;and set GP<5:4,1:0>
        ;as outputs

Schön, dass es jetzt funktioniert!

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.