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
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?!
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
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.
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
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
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
reiner_l schrieb: > Wie würde denn der Befehl für(2.) aussehen? Der Komparator ist in Kapitel 8 des Datenblattes ausführlich beschrieben
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
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!
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 :) )
> 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.
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.
> bei den PICs ist das aber zumindest etwa so.
Ich bin ja auch ein begeisterter Datenblattleser!
Und kann mir solche Dinge auch merken.
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
> 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.
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.
Oh ja, sehr interessant. Bin aber nicht sicher, helfen mir eure Beiträge weiter? ;-) Gruß Reiner
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.
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?)
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
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....
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.
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?
Hans B. schrieb: > m Code steht aber einmal PIC 12F863 und dann wieder xxxx683 Es gibt keinen PIC12F863
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
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 ?
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.