PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit XORLW [PIC 12F675]



TimoH
05.12.2010, 18:39
Hallo!

Ich bin neu hier und auch neu beim PIC-Programmieren. Seit einigen Tagen beschäftige ich mich mit dem PIC 12F675. Zum Brennen habe ich ein PICkit2. Die Sprut-Seite kenne ich auch schon und habe dort schon viel gelesen. Ebenso versuche ich mich mit dem Datenblatt zu beschäftigen.

Ich habe jetzt ein Problem, bei dem ich nicht weiterkomme. Vielleicht kann jemand aus dem Forum mir ein wenig auf die Sprünge helfen.

Ich habe am PIC an GPIO0 eine LED mit Vorwiderstand angeschlossen und möchte die zunächst einmal nur zum Blinken bringen. Als Warteschleife für jeweils 0,5 Sekunden habe ich einen Codeschnipsel aus http://www.piclist.com/techref/piclist/codegen/delay.htm
Ich verwende den internen Oszillator.

Jetzt habe ich mir das folgende Programm zusammengestrickt:


list p=12f675 ; list directive to define processor
#include <p12f675.inc> ; processor specific variable definitions

__CONFIG _CP_OFF&_CPD_OFF&_BODEN_OFF&_MCLRE_OFF&_WDT_OFF&_PWRTE_ON&_INTRC_OSC_NOCLKOUT

cblock 0x20
d1
d2
d3
endc

;************************************************* *********************
ORG 0x000 ; processor reset vector

call 0x3FF ; retrieve factory calibration value
bsf STATUS,RP0 ; set file register bank to 1
movwf OSCCAL ; update register with factory cal value
bcf STATUS,RP0 ; set file register bank to 0

bsf STATUS,RP0
bcf ANSEL,ANS0
bcf TRISIO,GPIO0

Anfang bcf STATUS,RP0
movf GPIO,0
xorlw 0x01
movwf GPIO

;499994 cycles
movlw 0x03
movwf d1
movlw 0x18
movwf d2
movlw 0x02
movwf d3
Delay_0
decfsz d1, f
goto $+2
decfsz d2, f
goto $+2
decfsz d3, f
goto Delay_0

;6 cycles
goto $+1
goto $+1
goto $+1

goto Anfang

END

Mit dem XORLW nach der Marke "Anfang" will ich einfach bei jedem Durchlauf das Bit vom GPIO0 ändern. Das klappt aber seltsamerweise nicht. Hat da vielleicht jemand eine Erklärung dafür?

PICture
05.12.2010, 19:37
Hallo!

Ich würde dir empfehlen mit Vestand, also mit Programmablaufdiagram (PAD) zu arbeiten und z.B. mit: http://www.rn-wissen.de/index.php/PIC_Assembler#Das_erste... anfangen, weil dort verwendeter PIC gleiche Pinbelegung hat, wie deiner. :)

MfG

stoerpeak
06.12.2010, 11:10
Der benutzte Pin wird nicht als Ausgang geschaltet weil
die Zeile bcf TRISIO,GPIO0 falsch ist.
Sie muss entweder bcf TRISIO,TRISIO0 oder bcf TRISIO,0 lauten.
siehe Datenblatt Seite20
In diesem Register lauten die Bits nicht GPIO,0-5 sondern TRISIO,0-5

Weiterhin ist die Delay-Routine fehlerhaft:
Die Delayvariablen werden nachdem sie Null erreicht haben nicht wieder auf ihren ursprünglichen Wert zurückgesetzt sondern zählen dann von 0xFF rückwärts.