Hallo erstmal,
ich bin ein absoluter Neuling in der Mikrocontrollertechnik und leider
finde ich nicht sehr viel über meinen kleinen Anfängerpic 16F505 wie
oben im Betreff steht.
Komme ich zu meinem Problem:
Mein einfacher Code lautet folgendermaßen
1
list p=16f505
2
3
#include <P16f505.INC>
4
5
__CONFIG _MCLRE_ON & _CP_OFF & _WDT_OFF & _HS_OSC
6
7
Init
8
9
bsf PORTC,3
10
11
12
13
end
Er sollte also bei meinem Testaufbau funktionieren. Ich habe für die 6
Pins auf PORTC jeweils eine rote LED mit einem 82 Ohm Widerstand
versehen. Außerdem ist am Ausgang OSC1 und OSC2 ein externe 20Mhz Quarz
mit 2 22pf Kondensatoren gegen Masse angeschlossen.
Jetzt möchte ich gerne von euch wissen was ich falsch mache, weil ich
darin schon einige Stunden investiert habe. Ist der Code falsch, oder
liegt es an der Hardware?
Ich freue mich auf jede Antwort. :)
Schon mal was von den Tris Registern gelesen?
du must den Pin auch auf Ausgabe schalten.
schau dir im Datenblatt nochmal alle relevanten Register für die Ports
an, da sind auch immer Beispiele mit dabei
Takao K. schrieb:> Musste noch das TRIS register richtig setzen sonst kanns nicht gehen.
Ich war mir nicht sicher und habe im Datenblatt nachgeschaut. Nach einem
Reset sind die TRISbits auf '1' --> Eingang. Also muss man sie auf '0'
setzten, dass die IOs als Ausgang funktionieren.
Die obligatorischen Entkoppelkondensatoren zwischen Vcc und Vdd und der
Pullup an Reset dürfen natürlich nicht fehlen.
Max H. schrieb:> BANKSEL TRISC ;Wählt dank mit TRISC aus> BANKSEL PORTC ;Wählt dank mit PORTC aus
Tipp- und Copy-Past-Fehler: Das sollte "Wählt Bank mit ... aus" heißen.
Ich habe bewusst das TRISRegister bei meinem Code weggelassen weil jetzt
wieder der doofe gleiche Fehler auftaucht wie vorher:
"Symbol not previously defined (TRISC)"
Was hat das zu bedeuten, wenn die beiden Zeile mit TRISC entferne
funktioniert der Code. Scheinbar das mit dem Simulieren kann ich aber
auch noch nicht so aber mit Bild all zumindest klappt es ohne die
TRISC-Zeilen.
Was hat es mit dem Pull up Widerstand auf sich wieviel ohm sind das?
Entkoppelkondensator ist das dieser Kondensator zwischen VDD und VSS,
welcher 10 nF als Richtwert hat?
Steffen Dickhardt schrieb:> Ich habe bewusst das TRISRegister bei meinem Code weggelassen weil jetzt> wieder der doofe gleiche Fehler auftaucht wie vorher:> "Symbol not previously defined (TRISC)">> Was hat das zu bedeuten, wenn die beiden Zeile mit TRISC entferne> funktioniert der Code. Scheinbar das mit dem Simulieren kann ich aber> auch noch nicht so aber mit Bild all zumindest klappt es ohne die> TRISC-Zeilen.>> Was hat es mit dem Pull up Widerstand auf sich wieviel ohm sind das?> Entkoppelkondensator ist das dieser Kondensator zwischen VDD und VSS,> welcher 10 nF als Richtwert hat?
Wie waers mit lesen des Datenblatts?
10nF ist falsch, sollte so 1uF bis 10uF sein ist aber eigentlich egal.
Warum brauchste denn 20MHz quartz, ist do nur ein 8pin IC? Hat der
keinen internen Oszillator?
Koennte sein dass es ein Baseline IC ist also musst du dann die TRIS
Anweisung verwenden:
TRIS GPIO oder sowas. Vorher mit MOVLW setzen.
Steffen Dickhardt schrieb:> Ich habe bewusst das TRISRegister bei meinem Code weggelassen
Wenn du die IOs nicht auf Ausgang setzt, wird dir nie eine LED
leuchten!
Neuer Versuch:
1
list p=16f505
2
3
#include <P16f505.INC>
4
5
__CONFIG _MCLRE_ON & _CP_OFF & _WDT_OFF & _HS_OSC
6
7
ORG 0x000 ;Reset Vektor
8
Init:
9
movlw b'00001000'
10
tris PORTC
11
BANKSEL PORTC ;Wählt Bank mit PORTC aus
12
bsf PORTC,3 ;RC3 auf '1'
13
14
goto $ ;Endlosschleife
15
16
end
Edit (habe den Post nicht gesehen):
Takao K. schrieb:> 10nF ist falsch, sollte so 1uF bis 10uF sein ist aber eigentlich egal.
Ich hatte bis jetzt mit 100nF noch nie Probleme
Takao K. schrieb:> ist do nur ein 8pin IC?>>Wie waers mit lesen des Datenblatts?
Der 16F505 hat ganze 14 Pins
Steffen Dickhardt schrieb:> Was hat es mit dem Pull up Widerstand auf sich wieviel ohm sind das?
10kΩ Widerstand zwischen MCLR und Vdd
BUILD SUCCEEDED
Sehr gut der Code scheint endlich zu funktionieren. Jetzt habe ich einen
frischen PIC des gleichen Modells aufgemacht, jedoch scheint es immer
noch nicht an der Hardware zu funktionieren.
Ich werde morgen als mal einen 1-10 uF Kondensator zwischen VSS und VDD
einbauen und einen Pullup-Widerstand von 10k Ohm am Reset nach VDD und
hier danach berichten was passiert. Das Programm scheint wahrscheinlich
in Ordnung zu sein.
Gleich wie der uC kein TRISC Register hat, funktionieren auch die
BANKSEL
MACROS nicht. Wenn man folgende Zeile verwendet, braucht man keinen
Widerstand.
__CONFIG _MCLRE_OFF & _CP_OFF & _WDT_OFF & _HS_OSC
Chris schrieb:> Gleich wie der uC kein TRISC Register hat, funktionieren auch die> BANKSEL MACROS nicht
Der PIC16F505 hat 4 RAM Bänke, die Bank wird mit dem FSR<6:5>
eingestellt. Das "BANKSEL PORTC" wird vom Assembler in
>BCF 0x4,0x5>BCF 0x4,0x6
übersetzt --> BANKSEL funktioniert.
Bei den FSR ist die Bank unwichtig, weil die FSR "Addresses map back to
addresses in Bank 0." Das BANKSEL ist also nicht nötig, schadet aber
auch nicht.
Hallo Steffen,
der 16F505 hat eine etwas spezielle Art wie das TRIS Register zu setzen
ist.
Die Bitfolge im WREG wird mit
TRIS 6 in das Datenrichtungsregister für PORTB übernommen
TRIS 7 in das Datenrichtungsregister für PORTC übernommen
Nimm mal den Code im Anhang, die LEDs müssten mit INTOSC mit ca. 2Hz
blinken.
mfG Ottmar
Ottmar K. schrieb:> TRIS 7 in das Datenrichtungsregister für PORTC übernommen
Da PORTC als 0x07 definiert ist, kann man auch "tris PORTC" schreiben.
Damit wird das Programm meiner Meinung nach einfacher zu lesen.
Max H. schrieb:> Da PORTC als 0x07 definiert ist, kann man auch "tris PORTC" schreiben.> Damit wird das Programm meiner Meinung nach einfacher zu lesen.
Das ist richtig.
@Steffen:
Was bewegt Dich eigentlich dazu einen solchen "Außenseiter" wie den
PIC16F505 als Anfänger zu verwenden?
Denk' mal darüber nach einen moderneren µC wie z.B. 16F1827 (DIL18) oder
16F1937 (DIL28) oder ... zu verwenden? Lies einfach mal die Beschreibung
der entsprechenden Datenblätter!
mfG Ottmar
Der Code von Ottmar funktioniert einwandfrei und siehe da die LEDs
leuchten, auch wenn ich von PORTB auf PORTC den Code abgeändert habe und
erfolgreich auch den externen Quarz mit 20 Mhz testen konnte,
logischerweise war das blinken deutlich schneller. Aufgefallen ist mir
am Test das die LED vom Ausgang RC5/T0CKI ausblieb. Ich hab das Bild von
meinem Testaufbau im Anhang eingefügt. Ist etwa der Interrupt aktiv?
Ich habe den PIC zufällig aufgegriffen, da ich bereits vorher einen
16F887 hatte und dieser mir für einfache Anwendungen zu groß war und ich
deshalb mehrere kleine PICs von diesem Typ mir gekauft habe.
der RC5/T0CKI Pin ist eingang, und zählt das Register 1 hoch, TMR0 bis
du dies über das OPTION register zurücksetzt, dazu wird der option
opcode
benötigt, ist ähnlich wie beim TRIS Register und beides ist historisch
begründet.
chirs schrieb:> der RC5/T0CKI Pin ist eingang, und zählt das Register 1 hoch, TMR0 bis> du dies über das OPTION register zurücksetzt, dazu wird der option> opcode> benötigt, ist ähnlich wie beim TRIS Register und beides ist historisch> begründet.
Und was heißt das muss ich praktisch tun um diesen Pin anzusteuern, also
welchen Befehl muss ich verwenden, damit die LED an RC5 ebenfalls
blinkt?
OPCODE ist mir bis jetzt noch kein Begriff. ;)
Steffen Dickhardt schrieb:> welchen Befehl muss ich verwenden, damit die LED an RC5 ebenfalls> blinkt?
Vesuch mal das T0CS im OPTION zu löschen.
Steffen Dickhardt schrieb:> OPCODE ist mir bis jetzt noch kein Begriff. ;)
Das ist der Programmcode, den du schreibst.
Max H. schrieb:> Steffen Dickhardt schrieb:>> welchen Befehl muss ich verwenden, damit die LED an RC5 ebenfalls>> blinkt?> Vesuch mal das T0CS im OPTION zu löschen.>> Steffen Dickhardt schrieb:>> OPCODE ist mir bis jetzt noch kein Begriff. ;)> Das ist der Programmcode, den du schreibst.
Gibts auch gleich einen Wikipedia Eintrag mit google.
Hallo Steffen,
wenn Du ein Projekt angehst, dann nur mit dem Datenblatt des PIC als
Begleiter. Dort gehst Du Punkt für Punkt durch die auf Deinen
(geplanten) Code zutreffenden Abschnitte und beachtest dabei auch die
Anmerkungen.
In Abschnitt 5.2 des Datenblattes steht:
:
>On power-up, TOCKI functionality is>enabled in the OPTION register and must>be disabled to allow RC5 to be used as>general purpose I/O.
Dann gehst Du zur Beschreibung des OPTION Registers im Abschnitt 4.4.
Dort liest Du folgendes:
bit 5
T0CS: Timer0 clock Source Select bit
1 = Transition on T0CKI pin (overrides TRIS on the T0CKI pin)
(der T0CKI-Pin ist intern mit TMR0 verbunden um an diesen einen
externen Takt anzulegen)
0 = Transition on internal instruction cycle clock, FOSC/4
(der Takt wird nun intern bezogen, der Pin ist frei und kann
als allgemeiner Input/Output verwendet werden.)
Code: "bcf OPTION_REG,T0CS" oder "bcf OPTION_REG,5"
OPCODE
der Assemblercode "GOTO" wird vom Compiler in eine Zahl - den OPCODE -
umgewandelt (vgl. Anhang). Diesen OPCODE kannst Du dann sehen wenn Du in
MPLAB (8.92) im Menü "View - Programm Memory" Dir den Programm-OPCODE
zeigen lässt. Der µC versteht kein Assembler - nur seinen speziellen
OPCODE.
mfG Ottmar
P.S. wegen des verwendeten PIC16F505 wollte ich nur sagen, dass dieser
einfach nicht mehr zeitgemäß ist und meines Erachtens daher nicht zum
Start in die Welt der µC verwendet werden sollte.
P.S. Versuche doch mal ein Bild im Anhang auf geringstmögliche Größe zu
bringen. 2MB ist einfach zu groß (z.B. Irfan View File-Batch Conversion"
verwenden.
Steffen Dickhardt schrieb:> jeweils eine rote LED mit einem 82 Ohm Widerstand> versehen
Tu dir und dem MC den Gefallen und reduziere den Strom mittels höheren
Vorwiderständen. 220R-470R lassen die LED auch gut leuchten.
Hallo Steffen,
Rv=82 Ohm - ich habe das ganz übersehen :-(
Nimm den Einwand von Matthias ernst! Auch hier gibt das Datenblatt
wieder Auskunft (vgl. Anhang).
Bei roten LEDs (Uf = 2V) ergibt sich ein Strom von
(5V-2V)/82 Ohm = 0,036A = 36mA/LED/Pin
das Ganze *6 = 216mA/Port
und liegt somit weit außerhalb der Spezifikation des µC (der LEDs?)!
mfG Ottmar
Hallo nochmal, auch wenn ich mich aus Zeitgründen erst Tage später
zurückmelde habe ich lange probiert und T0CS lies sich einfach nicht
ausschalten bis ich auch diesen Thread gestoßen bin:
http://www.edaboard.com/thread294305.html
Ich habe dort herausgefunden, das man im option register einfach t0cs
rauslöschen muss indem man diesen Code (urprünglich steht t0cs drinnen)
verwendet:
Vielen dank trotzdem ohne eure Hilfe hätte ich das nicht hinbekommen
jetzt sind alle vorgesehenen Ports aktiv und ich habe außerdem noch
einen 2. Widerstand in Reihe geschalten damit die LEDs nicht zu viel
Strom bekommen. :)