Lysdioder, Optiska sensorer, Fiberoptik, Displayer, Lasrar, Optiska kopplare
xezer
Inlägg: 65 Blev medlem: 8 mars 2005, 20:41:21
Inlägg
av xezer » 4 oktober 2006, 15:00:05
Har ändrat en del i koden sen sist jag postade den. Här kommer den igen.
Som sagt, problemet är att displayen töms inte och cursorn hoppar fram 5 tecken.
Sodjan:
Jag tror att det blir W xor W, altså den töms?
Kod: Markera allt
;*********************************************
;* Delay på 5mSek, genererad från
;* http://www.piclist.com/techref/piclist/codegen/delay.htm *
;*********************************************
; Delay = 0.005 seconds
; Clock frequency = 4 MHz
; Actual delay = 0.005 seconds = 5000 cycles
; Error = 0 %
Delay_5ms:
;4998 cycles
MOVLW h'E7'
MOVWF TIMER1
MOVLW h'04'
MOVWF TIMER2
Delay_5ms_0:
DECFSZ TIMER1, 1
GOTO $+2
DECFSZ TIMER2, 1
GOTO Delay_5ms_0
;3 cycles
GOTO $+1
;2 cycles (including call)
RETURN
;*********************************************
;* Sänder data till display *
;*********************************************
DISPLAY_SEND:
IORLW DISP_STAT ;Lägger till eventuella status-bitar som E och RS
MOVWF PORTB ;Skickar till displayen
XORLW DISP_E ;Tar bort Enable
MOVWF PORTB
CALL Delay_5ms ;Dröjer 5mSek
MOVLW b'00000000'
MOVWF PORTB
;CALL Delay_5ms ;Dröjer 5mSek
RETURN
;*********************************************
;* Initiera display *
;*********************************************
DISPLAY_INIT:
CALL Delay_5ms
CALL Delay_5ms
CALL Delay_5ms
CALL Delay_5ms ;Låter displayen starta upp i 20mSek
MOVLW b'00110000'
CALL DISPLAY_SEND ; 8-bit
MOVLW b'00110000'
CALL DISPLAY_SEND ; 8-bit
MOVLW b'00110000'
CALL DISPLAY_SEND ; 8-bit
MOVLW b'00100000'
CALL DISPLAY_SEND ; 4-bit!
MOVLW b'00100000'
CALL DISPLAY_SEND
MOVLW b'10000000'
CALL DISPLAY_SEND ; 2rader och 5x7pixlars font
MOVLW b'00000000'
CALL DISPLAY_SEND
MOVLW b'10000000'
CALL DISPLAY_SEND ; Display off, curs off, blink off
MOVLW b'00000000'
CALL DISPLAY_SEND
MOVLW b'00010000'
CALL DISPLAY_SEND ; Clear display
CALL Delay_5ms
MOVLW b'00000000'
CALL DISPLAY_SEND
MOVLW b'01100000'
CALL DISPLAY_SEND ; Display shift off
MOVLW b'00000000'
CALL DISPLAY_SEND
MOVLW b'11110000'
CALL DISPLAY_SEND ; Display on, curs on, blink on
RETURN
;*********************************************
;* Start rutinen *
;*********************************************
START:
;###Initiera PICen
MOVLW b'00000111'
MOVWF CMCON ;Alla pinnar ska vara digitala
BSF STATUS, RP0 ;Switchar till Bank1
MOVLW b'11111'
MOVWF TRISA ;Alla pinnar på PortA är inputs
MOVLW b'00000000'
MOVWF TRISB ;Alla pinnar på PortB är outputs
BCF STATUS, RP0 ;Switchar tillbaka till Bank0
;###
BSF DISP_STAT,DISP_EBIT ;Sätter Enable pinnen
CALL DISPLAY_INIT ;Initiera displayen
BSF DISP_STAT,DISP_RS ;Sätter RS-flaggan så det är tecken vi handskas med nu
sodjan
EF Sponsor
Inlägg: 43251 Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Inlägg
av sodjan » 4 oktober 2006, 15:15:29
> Jag tror att det blir W xor W, altså den töms?
Jag misstänke att du trodde det...
För övrigt saknas det delar av din kod för att kunna säga
något om den. Definition av konstanter (DISP_RS t.ex) och
variabler (som tex TIMER1 och TIMER2)...
xezer
Inlägg: 65 Blev medlem: 8 mars 2005, 20:41:21
Inlägg
av xezer » 4 oktober 2006, 15:31:26
Okej, här kommer resten av koden
Kod: Markera allt
#include <include_files/P16F628A.INC>
__CONFIG _BODEN_ON & _CP_OFF & _DATA_CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_ON & _INTOSC_OSC_NOCLKOUT
;==========================================================================
; Globala variabler
;==========================================================================
DISP_E EQU b'00000001' ;Enable
DISP_EBIT EQU d'7' ;Enable
DISP_RS EQU b'00000010' ;Register-select
DISP_RW EQU b'00000100' ;Read/Write
DISP_STAT EQU b'00000000' ;Håller i statusen för DISP_RS, E och DISP_RW
TIMER1 EQU h'E7'
TIMER2 EQU h'04'
;Bootar upp
ORG 0x0 ; Resettar vektor adressen
GOTO START ; Hoppa till START vid boot
sodjan
EF Sponsor
Inlägg: 43251 Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Inlägg
av sodjan » 4 oktober 2006, 15:38:08
Du behöver läsa på mer, både databladet och tidigare inlägg i tråden.
Du har *inte* rättat de fel som har nämnt här tidigare...
> TIMER1 EQU h'E7'
> TIMER2 EQU h'04'
Helt galet...
Kolla var adresserna H'04' resp h'E7' ligger !!
Är det verkligen där du vill ha variablerna ???
Är allt klart nu när det gäller "literal" instruktionerna ?
xezer
Inlägg: 65 Blev medlem: 8 mars 2005, 20:41:21
Inlägg
av xezer » 4 oktober 2006, 15:50:48
TIMER1 och TIMER2 hade jag satt såhär innan:
CBLOCK 0x20
TIMER1
TIMER2
ENDC
Ändrade visst aldrig tillbaka efter det att jag hade fifflat runt och testat en massa.
sodjan
EF Sponsor
Inlägg: 43251 Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Inlägg
av sodjan » 4 oktober 2006, 15:53:14
Innan vadå ?
CBLOCK'et ser väl helt OK ut.
Varför ändra det ?
Och har du fixat DISP_RS ?
xezer
Inlägg: 65 Blev medlem: 8 mars 2005, 20:41:21
Inlägg
av xezer » 4 oktober 2006, 16:26:07
Sodjan:
Innan jag såg en delay-funktion som hade satt variablerna utanför ett CBLOCK, tyckte det borde vara fel men testade att ta bort det och sätta värden.
om du menar:
BSF DISP_STAT,DISP_RS
så är det ändrat till:
DISP_RSBIT EQU d'1' ;Register-select bit
BSF DISP_STAT, DISP_RSBIT
Jag tror felet har med antingen att jag initierar den fel eller att Enablen inte är som den ska; den verkar komma ur fas eller något
EDIT:
Ska man skicka ut bitarna, sedan sätta på Enable, sedan sätta av Enable, sedan ta bort bitarna?
Icecap
Inlägg: 26647 Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark
Inlägg
av Icecap » 4 oktober 2006, 16:50:08
Till editen: JA!
På min hemsida, under "Freebies", finns ett PDF-dokument som anger hur man styr såna LCD.
xezer
Inlägg: 65 Blev medlem: 8 mars 2005, 20:41:21
Inlägg
av xezer » 4 oktober 2006, 16:55:56
Icecap:
Så om jag skriver om DISPLAY_SEND såhär borde den delen fungera?
Kod: Markera allt
;*********************************************
;* Sänder data till display *
;*********************************************
DISPLAY_SEND:
IORLW DISP_STAT ;Lägger till eventuella status-bitar som RS och RW
MOVWF PORTB ;Skickar till displayen
BSF PORTB,DISP_EBIT ;på ;Sköter enable?
BCF PORTB,DISP_EBIT ;av
MOVLW b'00000000'
MOVWF PORTB
CALL Delay_5ms ;Dröjer 5mSek
RETURN
sodjan
EF Sponsor
Inlägg: 43251 Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Inlägg
av sodjan » 4 oktober 2006, 16:59:24
> IORLW DISP_STAT
Fungerar, men antagligen inte som du tror...
DISP_STAT är ju = b'00000000', så du gör *alltid* OR med b'00000000'.
Som sagt, du behöver kolla lite extra på "literal" instruktionerna...
xezer
Inlägg: 65 Blev medlem: 8 mars 2005, 20:41:21
Inlägg
av xezer » 4 oktober 2006, 17:08:20
Sodjan:
Det hade jag inte tänk på. Jag la dit DISP_STAT i CBLOCKet nu och sätter värde på den med:
movlw b'00000000'
movwf DISP_STAT
Icecap:
Bra manual det där
sodjan
EF Sponsor
Inlägg: 43251 Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Inlägg
av sodjan » 4 oktober 2006, 17:14:40
Lite "goddag yxskaft" det här...
Vad har CBLOCK'et med IORLW att göra ????
Skit samma, jag hoppar av...
xezer
Inlägg: 65 Blev medlem: 8 mars 2005, 20:41:21
Inlägg
av xezer » 4 oktober 2006, 17:20:33
Sodjan:
>Vad har CBLOCK'et med IORLW att göra ????
Inte mycket, vad jag trodde du menade var att DISP_STAT är en konstant och kommer alltid erhålla värdet 0.
Därför satte jag det bland övriga variabler.
sodjan
EF Sponsor
Inlägg: 43251 Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Inlägg
av sodjan » 4 oktober 2006, 17:26:53
Så som du använder DISP_STAT (d.v.s i IORLW instruktionen) så
är DISP_STAT fortfarande en konstant, nämligen adressen till
en variabel som heter DISP_STAT...
Så du kommer hela tiden att göra OR med *adressen* till DISP_STAT...
Kolla *IGEN* på hur IORLW fungerar !
Och alla andra "literal" intstruktioner...
xezer
Inlägg: 65 Blev medlem: 8 mars 2005, 20:41:21
Inlägg
av xezer » 4 oktober 2006, 20:44:57
Nu förstår jag literala operatorer bättre och inser misstaget med IORLW.
Nu har jag delvis fått det att fungera, displayen clear'as, det ända som är lite lustigt är att cursorn förflyttas framåt hela tiden
Vad kan vara fel?
Initieringen ser ut som följande:
Kod: Markera allt
DISPLAY_INIT:
CALL Delay_5ms
CALL Delay_5ms
CALL Delay_5ms
CALL Delay_5ms ;Låter displayen starta upp i 20mSek
MOVLW b'00110000'
CALL DISPLAY_SEND ; 8-bit
MOVLW b'00110000'
CALL DISPLAY_SEND ; 8-bit
MOVLW b'00110000'
CALL DISPLAY_SEND ; 8-bit
MOVLW b'00100000'
CALL DISPLAY_SEND ; 4-bit!
MOVLW b'00100000'
CALL DISPLAY_SEND
MOVLW b'11000000' ;5x10
CALL DISPLAY_SEND ; 2rader och 5x7pixlars font
MOVLW b'00000000'
;XORLW W
CALL DISPLAY_SEND
MOVLW b'10000000'
CALL DISPLAY_SEND ; Display off, curs off, blink off
MOVLW b'00010000'
;XORWF W
CALL DISPLAY_SEND
MOVLW b'11000000'
CALL DISPLAY_SEND ; Display shift off
MOVLW b'00000000'
;XORLW W
CALL DISPLAY_SEND
MOVLW b'00010000'
CALL DISPLAY_SEND ; Clear display
MOVLW b'00000000'
;XORWF W
CALL DISPLAY_SEND
MOVLW b'11110000'
CALL DISPLAY_SEND ; Display on, curs on, blink on