Efter några år uppe på vinden så har jag åter igen tagit ner mina elektronikprylar för att laborera lite. Mycket har försvunnit ur huvudet.
Har boken mikrocontrollers skriven av Lars Bengtsson (andra utgåvan) framför mig och sidan http://pcbheaven.com/picpages/General_k ... tructions/ för att försöka förstå hur alla fungerar. Utöver det så tittar jag i databladet för PIC16f877a http://ww1.microchip.com/downloads/en/D ... 39582b.pdf
Jag har stött på ett problem. Jag har 8st lysdioder som är kopplade PORTD på min pic. När jag försöker mig på att rotera bitarna så stannar den på 0x02 och vill inte fortsätta till 0x01.
Ett försök till en illustration.
10000000 - 01000000 - 00100000 - 00010000 - 00001000 - 00000100 - 00000010 (här stannar den). Värdet W vill alltså inte bli 00000001.
Koden. Jag har följt exemplet som följer med i PICKIT 2 men försökt få den till en annan pic med 8 utgångar i stället för 4.
Kod: Markera allt
list p=16f877A ; list directive to define processor
#include <p16f877A.inc> ; processor specific variable definitions
__CONFIG _CP_OFF & _LVP_OFF & _BODEN_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC
#define J 0x20
#define K 0x21
#define Display 0x22
org 0
Start: ;Initierar de första instruktionerna
bsf STATUS,RP0 ; Väljer Bank1
clrf TRISD ; Gör alla portar på PORTD till output
bcf STATUS,RP0 ; Tillbaka till Bank0
movlw 0x80 ; Laddar W med 10000000
movwf Display ; Flytta W till Display
MainLoop:
movf Display,w ; Flytta värdet i Display till W
movwf PORTD ; Flytta W till PORTD
call OndelayLoop ; Dröj här en stund
Rotate:
bcf STATUS,C ; Rensa Carryn
btfss Display,0 ; Hoppa över nästa instruktion om bit0 i Display = 1
goto Rotateright ; Hoppa till RotateRight
goto Rotateleft ; Hoppa till RotateLeft
Rotateright:
rrf Display,f ; Rotera värdet i Display åt höger, spara sen det nya värdet i Display
btfsc Display,0 ; Hoppa över nästa instruktion om bit0 i Display =0
goto Rotateleft ; Hoppa till Rotateleft
goto MainLoop ; Hoppa till MainLoop
Rotateleft:
rlf Display,f ; Rotera värdet i Display åt vänster, spara sen det nya värdet i Display
btfsc Display,7 ; Hoppa över nästa instruktion om värdet i bit7 (MSB) i Display = 0
goto Rotateright
goto MainLoop
OndelayLoop:
decfsz J,f ; Waste time.
goto OndelayLoop ; The Inner loop takes 3 instructions per loop * 256 loopss = 768 instructions
decfsz K,f ; The outer loop takes and additional 3 instructions per lap * 256 loops
goto OndelayLoop ; (768+3) * 256 = 197376 instructions / 1M instructions per second = 0.197 sec.
; call it a two-tenths of a second.
return
end ; Avslutar programmet
Tittade i simulatorn i MPLAB med några breakpoints. W fastnar alltså på 0x02 och sen så loopar den bara runt där.
Någon som har en idé om vad som kan vara felet?