Forum: Mikrocontroller und Digitale Elektronik PIC16F505 reagiert nicht


von Steffen D. (Firma: Indramat (BR)) (steffend93)


Lesenswert?

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. :)

von Max H. (hartl192)


Lesenswert?

Versuchs mal damit:
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
10
    BANKSEL TRISC      ;Wählt dank mit TRISC aus
11
    bcf    TRISC,3     ;PORTC3 Ausgang
12
    BANKSEL PORTC      ;Wählt dank mit PORTC aus
13
    bsf    PORTC,3     ;RC3 auf '1'
14
15
    goto $             ;Endlosschleife
16
17
end

von Poster (Gast)


Lesenswert?

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

von Takao K. (takao_k) Benutzerseite


Lesenswert?

Musste noch das TRIS register richtig setzen sonst kanns nicht gehen.
Steht im Datenblatt.

von Max H. (hartl192)


Lesenswert?

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.

: Bearbeitet durch User
von Steffen D. (Firma: Indramat (BR)) (steffend93)


Lesenswert?

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?

von Takao K. (takao_k) Benutzerseite


Lesenswert?

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.

von Max H. (hartl192)


Lesenswert?

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

: Bearbeitet durch User
von Steffen D. (Firma: Indramat (BR)) (steffend93)


Lesenswert?

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.

: Bearbeitet durch User
von Chris (Gast)


Lesenswert?

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

von Max H. (hartl192)


Lesenswert?

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.

: Bearbeitet durch User
von Ottmar K. (wil1)


Angehängte Dateien:

Lesenswert?

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

von Max H. (hartl192)


Lesenswert?

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.

von Ottmar K. (wil1)


Lesenswert?

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

von Steffen D. (Firma: Indramat (BR)) (steffend93)


Angehängte Dateien:

Lesenswert?

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.

: Bearbeitet durch User
von chirs (Gast)


Lesenswert?

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.

von Steffen D. (Firma: Indramat (BR)) (steffend93)


Lesenswert?

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. ;)

von Max H. (hartl192)


Lesenswert?

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.

: Bearbeitet durch User
von Takao K. (takao_k) Benutzerseite


Lesenswert?

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.

von Max H. (hartl192)


Lesenswert?


von Ottmar K. (wil1)


Angehängte Dateien:

Lesenswert?

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.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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.

von Ottmar K. (wil1)


Angehängte Dateien:

Lesenswert?

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

von Takao K. (takao_k) Benutzerseite


Lesenswert?

Ich verwende da immer 2.2 K Ohm.

Versuch doch mal 16F1824, ist auch 14 pin, aber viel moderner und 
besser.

von Steffen D. (Firma: Indramat (BR)) (steffend93)


Lesenswert?

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:
1
OPTION = nGPWU | nGPPU | T0SE | PSA | PS2 | PS1 | PS0;

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. :)

von Max H. (hartl192)


Lesenswert?

Steffen Dickhardt schrieb:
> OPTION = nGPWU | nGPPU | T0SE | PSA | PS2 | PS1 | PS0;
Bist du inzwischen auf C umgestiegen?

von Steffen D. (Firma: Indramat (BR)) (steffend93)


Lesenswert?

Hm ok ist dann wohl sogar C :D hab ich nicht gewusst, da ich ein 
ziemlicher Anfänger noch bin. :D Aber es 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.