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
Gast
#6939199
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
Gast
#6939210
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.
Gast
#6939226
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.
Gast
#6939448
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
Gast
#6939457
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
Gast
#6939508
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!
Gast
#6939517
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 :) )
Gast
#6939518
ach ja, beim oben erwähnten Sprut steht das auch
Gast
#6939521
> 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.
Gast
#6939526
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.
Gast
#6939539
> 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
Gast
#6939546
> 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.
Gast
#6939548
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
Gast
#6939559
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.
Gast
#6939595
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?)
OK, bingo, das bringt mich weiter, werde ich prüfen. Danke
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 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | |
52 | |
53 | |
54 | |
55 | |
56 | |
57 | |
58 | |
59 | |
60 | |
61 | |
62 | |
63 | |
64 | |
65 | |
66 | |
67 | |
68 | |
69 | |
70 | |
71 | |
72 | |
73 | |
74 | |
75 | |
76 | |
77 | |
78 | |
79 | |
80 | |
81 | |
82 | |
83 | |
84 | |
85 | |
86 | |
87 | |
88 | |
89 | |
90 | |
91 | |
92 | |
93 | |
94 | |
95 | |
96 | |
97 | |
98 | |
99 | |
100 | |
101 | |
102 | |
103 | |
104 | |
105 | |
106 | |
107 | |
108 | |
109 | |
110 | |
111 | |
112 | |
113 | |
114 | |
115 | |
116 | |
117 | |
118 | |
119 | |
120 | |
121 | |
122 | |
123 | |
124 | |
125 | |
126 | |
127 | |
128 | |
129 | |
130 | |
131 | |
132 | |
133 | |
134 | |
135 | |
136 | |
137 | |
138 | |
139 | |
140 | |
141 | |
142 | |
143 | |
144 | |
145 | |
146 | |
147 | |
148 | |
149 | |
150 | |
151 | |
152 | |
153 | |
154 | |
155 | |
156 | |
157 | |
158 | |
159 | |
160 | |
161 | |
162 | |
163 | |
164 | |
165 | |
166 | |
167 | |
168 | |
169 | |
170 | |
171 | |
172 | |
173 | |
174 | |
175 | |
176 | |
177 | |
178 | |
179 | |
180 | |
181 | |
182 | |
183 | |
184 | |
185 | |
186 | |
187 | |
188 | |
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
Gast
#6939927
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....
Gast
#6940036
gelöscht
Gast
#6940046
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.
Gast
#6940056
Ich hab das mal etwas lesbarer gemacht.
Gast
#6940064
..sieht ja gleich besser aus.....Danke
Gast
#6940076
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?
Gast
#6940084
Hans B. schrieb: > Im Code steht aber einmal PIC 12F863 Offensichtlicher Zahlendreher.
Gast
#6940103
Hans B. schrieb: > m Code steht aber einmal PIC 12F863 und dann wieder xxxx683 Es gibt keinen PIC12F863
Gast
#6940160
Ja genau! Hab auch keinen gefunden (weltweiter Chipmangel)
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
Gast
#6940927
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!
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.


