Sida 24 av 26
Postat: 12 oktober 2008, 18:45:52
av sodjan
Jag skulle, i ditt läge, skicka ett liten mail till Sure och beskriva problemen.
Fasen, jag måste försöka få tid att testa den modul jag
har liggandes här, den är ju i princip kopplad på samma sätt,
fast med 4 displayer på samma kort.
(Stack till kontoret för att stöka under lite på eftermiddagen, men
blev sittande med en maskin fullsmackad av mail därför att en server
i Kina hade fått spatt vid lunchtid och skickade 10-20 mail per sekund.
Skit-trist men bra betalt...

)
Postat: 12 oktober 2008, 19:02:36
av Stewal
Jag får nog ta och göra det, men som sagt det funkar ju så här med.
När du har testat din modul, kan jag köpa den av dig. Känns som det är enklare att labba med något mindre än dessa stora som tar upp hela bordet.
Jag har jobbat som konsult förut, så jag vet hur trist det kan vara. Men som sagt det genererar ju pengar och det är bra.

Postat: 12 oktober 2008, 20:47:01
av Icecap
Stewal: hur många moduler har du? Och vad skulle priset vara på dom om det är så att du vill av med dom?
Anledningen är att frugan är blind som en mullvad utan glasögon (har -7 eller så) och hon vill gärna se vad klockan är på natten utan att fumla med glasögonen.
Postat: 12 oktober 2008, 21:07:50
av Stewal
Har nu gått vidare med programmeringen och gjort en avkodare, som omvandlar ascii koden för 0-9 till hex-koden för respektive siffra. Så om man lägger in ascii kod i varje displays minnes plats, så avkodas det och skickas till displayen och vissas där.
Om jag lägger till koden för att ta emot data via rs-232 porten och skickar data, så händer inget. Det kommer inte in något på minnes platserna.
För er som inte kommer ihåg eller inte läst allt, så kommer datat in via ISR-rutin.
Någon som har en idé vad det kan vara.
Kan posta del avkod om ni vill, inte allt blir så mycket då.

Postat: 12 oktober 2008, 21:19:02
av Stewal
Icecap skrev:Stewal: hur många moduler har du? Och vad skulle priset vara på dom om det är så att du vill av med dom?
Anledningen är att frugan är blind som en mullvad utan glasögon (har -7 eller så) och hon vill gärna se vad klockan är på natten utan att fumla med glasögonen.
Jag har 6 st. och kommer att behöva de, för detta projekt.
Enklast är nog att köpa de på nätet, vet inte om Sodjan hade de här 7" stora. Men jag köpte mina direkt från Sure Electronics
http://www.sureelectronics.net/goods.php?id=721 Tror det landade på 250 kr per display, med tull och frakt.
Va lite bökigt med fraktbolaget TNT, då jag var tvungen och ringa tullen och få tull deklarations numret och ge till TNT. Men nu vet man det också.
Ja man lär nog garanterat se klockan utan brillor.

Postat: 12 oktober 2008, 22:19:01
av Marta
Då var det tydligen något annat, men nog tusan är det konstigt att ett 8-bit skiftregister uppför sig som om det var 7-bit.
Gör ett test till med ett motstånd i serie med datalinan, utan konding, t.ex. 4k7 eller 10k.
Det här måste gå att lösa, även om det förefaller vara magi inblandat så är där alltid en naturlig förklaring till slut.
100n är i mäktigaste laget, klockas den snabbt så kan det bli andra problem.
Postat: 12 oktober 2008, 22:28:48
av Stewal
Jag har inga motstånd, där jag befinner mig nu. Så det får isåfall vänta tills jag varit förbi lägenheten. Som det ser ut nu blir det först vecka 43.
Postat: 12 oktober 2008, 23:26:59
av sodjan
Bara sök på "information board led 7-segment" på eBay så kommer
alla modellerna upp...
Är dina RS232/USART rutiner felsökta separat ?
D.v.s har du fungerat separat utan LED-display prylarna ?
Postat: 13 oktober 2008, 06:04:24
av Stewal
Jag har inte ändrat något i RS232/USART rutinerna, så de borde funka.
Men jag får nog ta och testa det.
Tyvärr kommer jag ha fullt upp med annat jobb nu, så det får blir på kvällarna nu.

Postat: 13 oktober 2008, 22:46:08
av Stewal
Då har jag testat lite men tror att ISR rutinen inte anropas när data kommer in. Har bygglat in och ut på max232 cmos sida och då skickas datat tillbaka, så den fungerar.
koden i ISR rutinen har jag stegat igenom och den funkar och data sparas på minnesplatserna.
Är det någon som kan se något fel i koden?
Kod: Markera allt
;**********************************************************************
;TEST av display
;
;**********************************************************************
;
;
list p=16f886 ; list directive to define processor
#include <p16f886.inc> ; processor specific variable definitions
;
__CONFIG _CONFIG1, _DEBUG_OFF & _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
__CONFIG _CONFIG2, _WRT_OFF & _BOR21V
;
errorlevel -302
;
#define COUNTER PORTB, 0
#define DATAIN PORTA, 0
#define CLKIN PORTA, 1
#define DIMMIN PORTA, 2
#define ESC 0x1B
#define HOUR_TAG 0x30
#define CURRENT_TIME 0x21
#define MINUTE_TAG 0x32
#define SECOND_TAG 0x34
#define SEC100_TAG 0x36
#define SEC10K_TAG 0x38
;
;
;**********************************************************************
RESET_VECTOR CODE 0x000 ; processor reset vector
goto start ; go to beginning of program
;
;
INT_VECTOR CODE 0x004 ; interrupt vector location
retfie ; Ingen interrupt kod...
;
RS232_VAR UDATA_SHR
RX_DATA RES 1 ; Data som motagits från RS232 port.
TX_DATA RES 1 ; Data att skicka till RS232 port.
RX_BUFFER RES 2 ; Motagningsbuffer på 2 byte
Ind_check RES 1
buffer_full RES 1
w_temp RES 1 ; variable used for context saving
status_temp RES 1 ; variable used for context saving
pclath_temp RES 1
DLR_3416_var UDATA
digit_0 RES 1 ; variable used for context saving
digit_1 RES 1
digit_2 RES 1
digit_3 RES 1
digit_4 RES 1
digit_5 RES 1
digit_6 RES 1
digit_7 RES 1
digit_9 RES 1
SEND RES 1
chk_number RES 1
;**********************************************************************
;**********************************************************************
; Huvudkoden.
; Här hamnar vi vid reset eller power-on (från RESET_VECTOR)
;
;
MAIN CODE
start
;
;
GIE01
banksel INTCON
clrf INTCON
btfsc INTCON, GIE
goto GIE01
bsf INTCON, PEIE
banksel ANSEL ; Stäng av alla analoga funktioner
clrf ANSEL
clrf ANSELH
banksel TRISA ; Alla pinnar utgångar
clrf TRISA
banksel TRISB
clrf TRISB
banksel PORTC
clrf PORTC
banksel TRISC
movlw b'11000000'
movwf TRISC
banksel PIE1
clrf PIE1
bsf PIE1, RCIE
banksel PIR1
clrf PIR1
banksel PIR2
clrf PIR2
banksel PIE2
clrf PIE2
banksel TXSTA
bcf TXSTA, TX9 ;Sätt 8 bits sändning
bsf TXSTA, TXEN ;Sätt data sändning
bcf TXSTA, SYNC ;Async kommunikation
bcf TXSTA, BRGH ;Låg klock hastighet
banksel SPBRG
movlw d'25' ;Sätt Baudrate till 2400, SPBRG value=25
movwf SPBRG
banksel RCSTA
bsf RCSTA, SPEN ;Starta serial port
bcf RCSTA, RX9 ;Sätt 8 bits mottagning
bsf RCSTA, CREN ;Sätt konstant motaggning
bcf RCSTA, FERR
banksel INTCON
bsf INTCON, GIE
banksel portb
;
;
loop
goto loop ; Gör ingenting....
;
ISR_ROUTINE CODE
;
isr_routine
;
movwf w_temp ; save off current W register contents
movf STATUS,W ; move status register into W register
movwf status_temp ; save off contents of STATUS register
movf PCLATH,W
movwf pclath_temp
clrf PCLATH ; Be sure that wer'e home alone
datain1
btfsc RCSTA, OERR
goto overerror ;om 'overflow error'...
btfsc RCSTA, FERR
goto frameerror ;om 'framing error'...
goto esc_check
;
overerror
banksel RCSTA
bcf RCSTA, CREN ;Stäng av pulse cren
movf rcreg,w ;Rensa FIFO
movf rcreg,w ;är tre steg
movf rcreg,w
bsf RCSTA, CREN ;Sätt cren och oerr blir låg.¨
goto datain1 ;försök igen...
;
frameerror
movf rcreg,w ;Att läsa av RCREG gör att FERR blir låg.
goto datain1 ;Försök igen..
;
esc_check
movf RCREG, w
andlw h'7F' ; strip MSB
movwf RX_DATA
movf RX_DATA, w
sublw ESC
btfsc STATUS, Z ; D.v.s skippa nästa inst om Z = 0
goto clear ; Om ESC, återställ allt.
if_0x21
movf rx_data, w
sublw CURRENT_TIME ; Om inkommet tecken = 0x21, så blir Z nu = 0
btfss STATUS, Z ; D.v.s skippa nästa inst om Z = 1
goto index ; Gå till Index
movf rx_data,w ; Spara 21 i Rx_buffer+1
movwf INDF
incf FSR
goto done
index
movf rx_buffer,w
sublw CURRENT_TIME ; Om RX_BUFFER+1 = 0x21, så blir Z nu = 0
btfss STATUS, Z ; D.v.s skippa nästa inst om Z = 1
goto clear
btfsc Counter ; Om Counter =0, hoppa över nästa.
goto index_0 ; Om Counter =1, gå till Index_0
movf rx_data,w ; Spara Indexpekare i RX_buffer+2
movwf INDF
incf FSR
bsf Counter
goto done
Index_0
movf rx_buffer+1, w
movwf Ind_check
movlw h'30'
subwf ind_check
btfss STATUS, Z ; Index pekare =30 ?
goto index_1 ; Nej, gå till Index_1
movf rx_data, w
movwf digit_7
incf rx_buffer+1
goto done
;
index_1
decfsz Ind_check, f ; Index pekare =31 ?
goto index_2 ; Nej, gå till Index_2
movf rx_data, w
movwf digit_6
incf rx_buffer+1
goto done
index_2
decfsz Ind_check, f ; Index pekare =32 ?
goto index_3 ; Nej, gå till Index_3
movf rx_data, w
movwf digit_5
incf rx_buffer+1
goto done
index_3
decfsz Ind_check, f ; Index pekare =33 ?
goto index_4 ; Nej, gå till Index_4
movf rx_data, w
movwf digit_4
incf rx_buffer+1
goto done
index_4
decfsz Ind_check, f ; Index pekare =34 ?
goto index_5 ; Nej, gå till Index_5
movf rx_data, w
movwf digit_3
incf rx_buffer+1
goto done
index_5
decfsz Ind_check, f ; Index pekare =35 ?
goto index_6 ; Nej, gå till Index_5
movf rx_data, w
movwf digit_2
incf rx_buffer+1
goto done
index_6
decfsz Ind_check, f ; Index pekare =36 ?
goto index_7 ; Nej, gå till Index_5
movf rx_data, w
movwf digit_1
incf rx_buffer+1
goto done
index_7
decfsz Ind_check, f ; Index pekare =37 ?
goto done ; Nej, gå till Index_5
movf rx_data, w
movwf digit_0
clrf rx_buffer
goto done
;
;
clear ;Rensa buffern och gå ur ISR
nop
nop
nop
nop
clrf rx_buffer
clrf rx_buffer + 1
clrf rx_buffer + 2
movlw RX_Buffer
movwf FSR
bcf Counter
done
movf pclath_temp,W ; Read copy of PCLATH
movwf PCLATH ; Restore to pre-ISR content
movf status_temp,W ; Retrieve copy of STATUS register
movwf STATUS ; Restore pre-isr STATUS register contents
swapf w_temp,F
swapf w_temp,W ; Restore pre-isr W register contents
;
retfie
Postat: 13 oktober 2008, 23:26:43
av sodjan
Byt ut:
till:
Kod: Markera allt
goto isr_routine ; Hopp till interrupt koden...
Det är ju klart att inget händer när du gör RETFIE direkt...
Jag antar att detta är något du har sett eller läst om:
Kod: Markera allt
GIE01
banksel INTCON
clrf INTCON
btfsc INTCON, GIE
goto GIE01
Deet är en liten fix som jag inte vet om den
behövs längre, men tidigare så fanns det ett timing problem när man
stängde av GIE som gjorde att om det blev ett interrupt samtidigt som
GIE nollades, så kunde det hända att interruptet kördes direkt efter
instruktionen och sedan när man kommer tillbaka till nästa instruktion så
är GIE satt igen (via RETFIE). Workarounded var att texta GIE direkt och loopa
tills det är noll. i 999 fall av 1000 så blev den noll direkt...
Hur som helst, det gör ingen skada, men du behöver inte köra om BANKSEL
flera gånger, labeln kunde sitta en rad längre ner.
På flera ställen gör du :
Det ser inte rätt ut.
Du ska/bör avsluta ISR'en direkt, du får ett nytt interrupt när nästa tecken kommer.
Postat: 14 oktober 2008, 05:56:59
av Stewal
Då skall jag testa vidare ikväll och se om det hoppar igång. tack
Postat: 14 oktober 2008, 19:00:47
av Stewal
Då har jag testat lite mer, ändrade det du skrev men fortfarande händer inget. Har även testat att låta inkommet data skickas tillbaka till txreg, men inget data kommer tillbaka.
En fråga om ISR, har för mig att inkommet data skall trigga ISR och då sparas all pågånde hantering och ISR tar över och koden där körs till det är klart sedan laddas det den håll på med och körs vidare. Stämmer det?
Postat: 14 oktober 2008, 21:35:20
av Stewal
Då har jag konstaterat att ISR rutinen inte triggas. Har testat plocka koden ur ISR och la den innan loop och då fungerar det.
Ändrade så att datat som togs emot skickades tillbaks. Så vad kan ha hänt med den?
Postat: 15 oktober 2008, 01:02:10
av sodjan
Märkligt.
GIE, PEIE, RCIE ser OK ut. De är kanske lite onödigt utspridda i koden,
vilket gör det lite onödigt svårt att kolla, men i alla fall...
> och då sparas all pågånde hantering och ISR tar över
Det enda som sparas *automatisk* är PC (programräknaren) så
att den vet vart den ska returnera vid RETFIE. Allt annat är kodens
uppgift att ta hand om, vilket du ju gör med W, STATUS och PCLATH.
Annars är det i princip rätt.
Slutligen så ska det nog gå att simulera ISR'en i MPSIM (i MPLAB).