PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PIC 12F675 kaputt??



martini007
14.10.2009, 00:17
Hallo Leute,
ich habe mir erstmalig einen PIC zugelegt und wollte als erstes eine LED zum leuchten/blinken bringen - allerdings ohne Erfolgt. Der Microcontroller gibt keine Lebenszeichen von sich.
Den PIC 12F675 an sich konnte ich fast problemlos mit meinem Programm beschreiben, was ich auch nachträglich nochmal durch Lesen getestet habe.
An der Beschaltung kann es eigentlich auch nicht liegen, hab den Vorwiderstand mal rausgenommen und die Diode direkt an den PIN gesteckt und wieder nichts.
Also entweder es liegt am PIC oder am Programm.
Ich hoffe jemand kann mir bei letzterem weiterhelfen, denn ich bin verzweifelt :-&
Danke schonmal im Voraus!!!



LIST ;P=PIC12F675
NOLIST

#include <C:\PicProg2006\Include\p12f675.inc>


ORG 0 ;PIC's reset vector
BSF STATUS,RP0 ;Bank1
MOVWF OSCCAL ;Calibrate the Int RC osc
GOTO START ;Jump to START routine when boot

DELAY100MS BCF STATUS,RP0 ;Bank0
CLRW
MOVLW D'255'
MOVWF TMR0

;---------------------------------------------------------------------------------------

START CLRWDT ;Clear the watchdog a power up
MOVWF CMCON ;disable comparator

BSF STATUS,RP0 ;Bank1
MOVLW B'11111100' ;
MOVWF TRISIO ;GP0,GP1 = Outputs
CLRF ANSEL ;Digital I/O

LOOP BCF STATUS, RP0 ;Bank0
MOVLW B'11111100' ;
MOVWF GPIO ;GPIO0,GPIO1 = on
CALL DELAY100MS ;Wait for 100mS
CLRF GPIO ;Clear the LED
CALL DELAY100MS ;and wait again for 100mS
GOTO LOOP ;Do forever this loop....

END ;End of source code.

PICture
14.10.2009, 08:25
Hallo martini007!

Die LED muss immer mit Vorwiderstand betrieben werden. Ich vermute, dass du den PIC in Assembler programmieren willst. Dein Programm ist aber nicht i.O. Es fehlt z.B. das Unterorogramm "DELAY100MS" das mit "call" aufgerufen wird. Es gibt noch mehr Fehler in deinem Programm.

Um den PIC auszuprobieren, würde ich dir empfehlen ein fertiges und geprüftes Programm zu nehmen, z.B. "Das erste..." aus dem Wiki Artikel:

https://www.roboternetz.de/wissen/index.php/PIC_Assembler

Viel Erfolg beim Programmieren! :)

MfG

martini007
14.10.2009, 13:30
Hallo,
danke für den praktischen Link, genau das habe ich eigentlich lange gesucht. Aber die Beschreibungen waren meistens nie so detailliert.
Ich werde das Programm mal testen.

Bezüglich meines kleinen Programms wollte ich nur sagen, dass das Unterprogramm "DELAY100MS" gleich am Anfang steht.
Was ist denn noch falsch?
Ich meine so lang ist das Programm ja nicht und eigentlich finde ich den Programmiercode recht logisch aber es ist ja wie schon erwähnt mein erstes Programm ...

PICture
14.10.2009, 14:22
Na ja, mach dir kein Stress ! :)

Ich möchte nicht alle Fehler suchen, aber ich habe z.B. kein "return" Befehl gesehen und deswegen war für mich das ganze Programm nicht verständlich. Aber der Anfang ist immer am schwersten... :)

MfG

PICVB
17.10.2009, 18:16
In dem DELAY100MS fehlt wie picture schon sagtv das return. auserdem seh ich nirgends eine Auswertung des TMR0. Durch fehlen des return durchläuft das Programm immer die selbe schleife von DELAY100MS bis hin zum ersten Aufruf von DELAY100MS.

martini007
17.10.2009, 22:57
Vielen Dank für eure Tips und Anregungen! Ich habe ein neues Programm geschrieben und es mit MPLAB getestet, hat alles in der Simulation funktioniert. Dann habe ich das Programm auf den Controller geschrieben,
5 Volt Versogungsspannung angelegt und wieder nichts.
Ich messe eine Spannung von etwa 0,3 Volt an einigen Pins aber das hat wahrscheinlich nichts mit dem Programm zu tun. Also es regt sich nach wie vor nichts. Könnte das vielleicht an dem Timer liegen?



;

NAME: Flash Led for PIC 12F675


list P=12F675
include "P12F629.inc"
nolist

__config _CP_OFF & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT

#define _DTT1 GPIO,0
#define _CKT2 GPIO,1
#define _T3 GPIO,2
#define _RNG GPIO,3
#define _INT GPIO,4
#define _RL GPIO,5

org 0x0000

call Init

;-----------------------------------------------------------------------------

Haupt
MOVLW b'00000011'
MOVWF GPIO
call DELAY100MS
call DELAY100MS
call DELAY100MS
call DELAY100MS
call DELAY100MS
MOVLW b'00000000'
MOVWF GPIO
call DELAY100MS
call DELAY100MS
call DELAY100MS
call DELAY100MS
call DELAY100MS

goto Haupt

;-----------------------------------------------------------------------------

DELAY100MS
bcf INTCON,T0IF
MOVLW D'255'
MOVWF TMR0
;BTFSS INTCON,T0IF
;goto $-1
return

;-----------------------------------------------------------------------------

Init clrf GPIO
bsf STATUS,RP0
call 0x3FF
movwf OSCCAL
bcf OPTION_REG,7
movlw B'11111100'
movwf TRISIO
bcf STATUS,RP0
movlw 7
movwf CMCON

return

;-----------------------------------------------------------------------------

end

martini007
17.10.2009, 23:02
ach ja, beim compilieren steht in der LIST-Datei, dass einige der verwendeten Funktionen nicht in den angegebenen Bänken stehen.
Allerdings bin ich mir eigentlich "fast" sicher, dass ich die richtigen Bänke verwendet habe, da ich ja auch mit dem Datenblatt gearbeitet habe.
Oder könnte es sein, dass ich die Bänke vertauscht habe?

Siro
18.10.2009, 12:58
Hallo martini007
beim flüchtigen hinschauen, fiel mir einiges auf.
Für welchen PIC soll denn das Programm sein ??? 675 oder 629
weil da gibt es schon einen Wiederspruch in deiner Software:
list P=12F675
include "P12F629.inc"

vor dem wort include, muss meiner Meinung nach ein # stehen, also
#include "P12679.inc"

ich hoffe, deine Programmzeilen sind nicht alle "linksbündig" (stehen ganz links in der Zeile) wie hier im Text. Da dürfen sich nur die Sprungmarken bzw. Labels befinden.
Dann würdest Du aber etliche von Warungen bekommen: Found opcode in column xx
ich hoffe, daß ist nicht der Fall.

Deine Verzögerungsschleife DELAY100MS hast Du ja schon entschärft (Zeilen ausgeklammert), damit der PIC dort nicht "hängen" bleibt.
Das gibt wirklich eine Endlosschleife, hab ich mal simuliert. Da diese Verzögerung nun weg ist, kann es sein (bzw. sehr wahrscheinlich) daß deine LED derart schnell blinkt, daß Du es garnicht mitbekommst.

Der Timer 0 ist noch garnicht initialisiert worden, dadurch läuft er auch nicht.

Übrigens, Timer 0 zählt aufwärts. Wenn Du den Wert im TMR0 Register auf 255 setzt, dann ist der Timer recht schnell fertig,
da im nächsten Zyklus der Wert auf 256 bzw. 0 geht und das Interruptflag T0IF gesetzt wird.
Wenn Du den Wert auf 0 setzt, ist der Timer nach 256 Zyklen fertig, das sind dann aber auch nur 256 mikro Sekunden.
Für deine Blinkfrequenz immer noch unbrauchbar.

Also verpassen wir dem Timer einen Vorteiler, bzw. programmieren ihn.
Dafür gibt es den sogenannten "Prescale" Vorteiler, dieser kann jedoch für den Watchdog oder den Timer 0 benutzt werden.
Standardmäßig ist der Vorteiler für den Watchdog programmiert, daß können wir ändern, indem wir das Bit PSA im OPTION_REG löschen.
Dann gibt es 3 Bits, welche für das Teilerverhältnis zuständig sind PS0,PS1,PS2 ebenfalls im OPTION_REG
wenn wir alle 3 Bits setzen können wir den Timer am langsamsten laufen lassen. Aber selbst dann liegt die Laufzeit des Timers
immer noch unter 100ms. Wir kommen auf ca. 65ms aber schon wesentlich brauchbarer.

baue mal bitte den folgen Code mit in deine Initialisierunge rein:

InitTimer0:
bsf STATUS,RP0 ; die richige BANK auswählen

bcf OPTION_REG,T0CS ; interne Taktquelle wählen für Timer 0
bcf OPTION_REG,PSA ; Vorteiler für Timer 0 benutzen
bsf OPTION_REG,PS0 ; Teilung durch 256 einstellen
bsf OPTION_REG,PS1
bsf OPTION_REG,PS2

bcf STATUS,RP0 ; und die BANK wieder zurückschalten

in der Schleife DELAY100MS schreibts Du dann nicht den Wert 255 sondern 0 in das TMR0 Register

Nun kannst Du, denke ich, alles weitere selbst probieren.
Aller Anfang ist schwer, mach Dir nix draus.
mit freundlichen Grüßen
Siro