PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 16f628a - RB4 permanent auf "0": Warum?



kante23
20.11.2007, 22:16
Hallo,
ich beschäftige mich erst seit kurzem mit den PIC controllern, hab aber schon einige vortschritte verzeichnen können. Nun hat mich aber ein sehr komischer Fehler wieder zurück geworfen: Ich arbeite mit dem 16f628a und Mplab, also Assambler. Mein Code ist sehr einfach gestrickt, er soll einfach nur alle I/O von PortB auf "1" schalten. Dies machte er auch im prinzip, außer an Pin RB4. Dort ist, egal was ich mache, immer eine "0". Und dass auch noch bei zwei verschiedenen Controllern. Frag mich echt warum.... kann mir einer helfen, bzw. hatte jemand ein ähnliches Problem und kann sich vorstellen woran es liegen könnte? Dachte mir ja eigentlich am Code, da es ja beide betrifft oder an meiner versuchsplatine. Aber der Code is so einfach (und hat ja auhc schon vor ein paar tagen wunderbar funktioniert) und bei der Platine liegt Pin 4 blank (also keinerlei beschaltung). Ich bin verzweifelt ....
Es war bis hierhin so schön :)
liebe grüße Kante

Code:


list p=16f628a
#include <p16f628a.inc>

org 0x000
goto _main

_main
bcf STATUS, 5
bcf STATUS, 6
movlw B'00000000'
movwf INTCON

bsf STATUS, 5
movlw B'00000000'
movwf TRISB

bcf STATUS, 5
movlw B'11111111'
movwf PORTB

end
[/code]

HF SHOOTER
21.11.2007, 00:11
Hi

Es wäre schön wenn Du für STATUS,5 -> STATUS,RP0 schreibst, dann erkennt man gleich das damit die Bankumschaltung gemeint ist.

Was bei dir noch fehlt ist dei Endlosschleife. Vor end einfach noch goto _main schreiben.

mfg
Benny

phaidros
21.11.2007, 00:44
Füge doch mal am Ende deines Codes eine Endlos-Schleife ein. Der Prozessor macht sonst einfach weiter mit dem Müll, der hinter deinem Programm steht.

Also:

loop
goto loop

end


Die "End" - Anweisung macht nämlich gar nichts. Man kann einen PIC nicht wirklich stoppen. Der rechnet immer weiter. Vielleicht liegts ja daran.

kante23
21.11.2007, 07:58
Vielen Dank, das war mir neu. Werds heut nachmittag gleichma ausprobieren.
Glaub zwar nicht wirklich daran, dass das die Ursache sein soll aber ein versuch ist es wert.
Poste dann meine ergebnisse.
kante

JayCool
21.11.2007, 12:35
Hi Kante!

So ein ähnliches Problem mit dem RB4 hatte ich letzte Woche auch bei einem PIC 16F628, der zum 16F628A kompatibel ist.

Bei denen ist herstellungsbedingt zunächst immer der LVP-Mode aktiviert.
Als ich bei meinem Beispielprogramm in der CONFIG-Option noch

__CONFIG [...] & _LVP_OFF

reingeschrieben habe, ging es plötzlich wunschgemäß!

Näheres speziell zu diesem Thema auf
http://sprut.de/electronic/pic/config/config_emb.htm

Gruß, Jan

kante23
21.11.2007, 16:44
Vielen dank.
Der Tip von JayCool hats gebracht. Aber das bringt mich gleich auf ein anderes Thema, was ganz gut passt:
Und zwar arbeite ich ja mit Mplab, jedoch läst sich bei mir dort nicht der _config-"befehl" benutzen. Ich kann ihn zwar angeben (am anfang des Programms anch "list" und #innclude) aber sobald ich dahinter einen Wert, egal ob hexadezimal oder binär, wert angebe spuckt der compiler mir
diesen Fehler aus: Error[108] illeagal charakter('3') (bei "_config 3fa8"). Das selbe geschieht wenn ich die vordefinierten Konstanten benutze oder den Wert binär angebe.
Hatte jemand schonmal das Problem?
grüße Kante

JayCool
21.11.2007, 17:12
Hi,

ich schätze, dass MPLAB nicht weiss, dass '3fa8' eine Hexadezimalzahl ist.
Hast Du es stattdessen schonmal mit '0x3fa8' probiert?

Ich würde aber empfehlen, die in der zugehörigen Include-Datei hinterlegten (für sich sprechenden) Konstanten zu verwenden. Siehe z.B. http://sprut.de/electronic/pic/config/config_emb.htm

Das Assembler-File wird dadurch besser lesbar und die Fehlersuche gestaltet sich einfacher, weil man nicht erst das 14 Bit breite Config-Word auseinanderdröseln muss.

Siro
21.11.2007, 18:12
Thema Übersichtlichkeit:

warum benutzt Du nicht den BANKSEL Befehl

Beispiel:

movlw 0
BANKSEL TRISB
movwf TRISB

BANKSEL PORTB
bsf PORTB,RB4

der Compiler erzeugt dann automatisch den gewünschtne Code
für die Bankumschaltung um auf das entsprechende Register zuzugreifen.
So kann es Dir eigentlich eagl sein in welcher Bank sich das Register
befindet.

um auf BANK 0 zu schalten, nehme ich gerne folgende Sequence
clrf STATUS
hier werden gleich beide RP0 und RP1 im Status Register gelöscht.


Bei RB4 "MUSS" Low Voltage Programming unbedingt ausgeschaltet sein, sonst kannst Du den Pin nicht benutzen.

_config sollte nie ganz links am Zeilenanfang stehen

Hexwerte immer mit 0x anfangen z.B 0x3FFF usw.

!! Vorab Hinweis: Böse Falle, wenn du den Pin RA4 benutzen willst, dieser Pin braucht unbedingt einen Pullup (Widerstand nach Plus). Sonst bekommst Du den Pin nie nach High gezogen. Hab ich auch vergessen und verzweifelt in meiner Software gesucht.

mit freundliche Bits
Bernd Siroyznski

HF SHOOTER
21.11.2007, 18:25
Hast Du auch 2x _ vorangeschfrieben?

Nicht _CONFIG sonder
__CONFIG

mfg
Benny

kante23
21.11.2007, 19:05
hey shooter,
vielen Dank für den Tip, Hatte ich natürlich nicht gemacht und deshalb hats auch nicht gefunzt. Jetzt gehts. Super
vielen Dank nochmal
@Siro
das mit dem Banksel werd ich mir mal angewöhnen. auch dir danke
@JayCool
mit den Konstatnen werd ich jetzt arbeiten, seit dem es endlich funktioniert

Ihr seit super =D>

Danke Kante

Siro
21.11.2007, 19:16
Sorry, __CONFIG natürlich mit zwei Unterstrichen,
bitte um Entschulding.
Siro

Sonic111
02.03.2008, 11:45
Hallo zusammen!

Ich habe in der Vergangenheit ein bisschen mit dem PIC16F84A herumprobiert und das hat dann auch soweit geklappt...

Nun habe ich hier den PIC16F628A und das RB4 ist ebenfalls immer konstant auf "0". Als Beispielcode habe ich ein einfaches Lauflicht von Sprut genommen.
Alle Leds laufen, nur RB4 nicht...

Das mit der LVP Programmierung dachte ich wäre das Problem, aber Fehlanzeige.. als ich das Config Word mit LVP_OFF angepasst habe, funktioniert RB4 immer noch nicht?

(__CONFIG _PWRTE_ON & _WDT_OFF & _HS_OSC & _BODEN_OFF & _LVP_OFF)

Ich verwende den Brenner8 den ich von Sprut nachgebaut habe, über USB.
Kann es sein, dass ich LVP_OFF nicht aktivieren kann, weil der Brenner8 über USB versorgt wird (= nur 5V?).

Muss ich nu auf RB4 verzichten ?

Grüße,
Heiko

HF SHOOTER
02.03.2008, 13:35
Hallo,

Der Brenner8 kann auch den High Voltage Modus bei der Programmierung. Die Spannung wird durch einen kleinen Schaltregler "hochgepusht".
Hast Du auch bei USBurn den LVP deaktiviert?

Um einen vorher mit LVP programmierten PIC per HVP programmieren zu können muss man glaub ich einen bestimmten Pin auf Masse halten, hier weiß ich aber nicht ob der Brenner8 dies auch macht.

mfg
Benny

Sonic111
02.03.2008, 17:01
Hallo Benny,

jetzt funktioniert es *g, Danke !

Habe bei USBurn die Configuration manuell geändert.
Komisch, aber dass es nicht korrekt vom Hex File gelesen wird.

Na ja, .. da wird wohl noch irgendwo ein Fehler in meinem Programm sein.
Probier noch ein bisschen herum und vergleiche mal mit original Sourcen von Sprut...

Danke nochmal !

Grüße,
Heiko