[MPASM] 32 Bytes ontvangen

Pagina: 1
Acties:
  • 136 views sinds 30-01-2008
  • Reageer

  • StapelPanda
  • Registratie: Februari 2005
  • Laatst online: 22:11
Ik weet niet hoe ik de titel moet uitleggen, ik wil namenlijk een 8 segment klok met een DCF55 C51! eraan op een PIC (16f690) .

de DCF stuurt elke seconde de Meinberg Timestring 32 bytes.
Mijn idee is om de data in een interrupt te ontvangen, en in het EEPROM neer te zetten, en dan in de hoofdroutine de EEPROM uitlezen en op het display laten zien.
nu heb ik het al geprobeerd met verschillende snelheden (600,1200,2400,4800,9600)
bij 9600 staat er 1 van de 3 bytes in de EEPROM dus D 1 0 . ipv D:31.05.07 (zowel op 4 als op 16 mhz!)
en bij de tragere snelheden knippert het display tijdens het ontvangen.

wie heeft er suggesties voor mij hoe ik dit kan oplossen, ook snap ik dit niet (einde van het interrupt):
;swapf w_temp,f
;swapf w_temp,w ; restore pre-isr W register contents
waarom kan dat niet zijn MOVF w_temp,w


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
        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          ; move pclath register into W register
        movwf   pclath_temp       ; save off contents of PCLATH register


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;find corrosponding  interrupt ;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
BANKSEL PIR1
    BTFSC PIR1,RCIF
      GOTO Received
    GOTO EOI
;;;;;;;;;;;;;;;;;;;;;;;;;
;; Interrupt Functions ;;
;;;;;;;;;;;;;;;;;;;;;;;;;

Received
    BTFSC FLAGS,RCFlag; Al aan het ontvangen ? ga dan naar RtoE
             goto RtoE
    MOVFW RCREG
    BCF STATUS,Z
    XORLW 0x02
    BTFSS STATUS,Z 
     GOTO EOI ; Ontvangst is geen H'02', Flag is ook niet hoog, dus verlaat de interrupt
    BSF FLAGS,RCFlag
    CLRF Eaddr
        GOTO EOI

RtoE
    MOVFW RCREG
    BCF STATUS,Z
    XORLW 0x03      ; Ontvangst = eindbyte =>  ga naar EndOfReceiving
    BTFSC STATUS,Z 
        GOTO EOR    ; END OF RECEIVING

    MOVFW Eaddr
   BANKSEL EEADR
    MOVWF EEADR
   BANKSEL RCREG
    MOVFW RCREG
   BANKSEL EEDAT
    MOVWF EEDAT
   BANKSEL EECON1
    BCF EECON1,EEPGD
    BSF EECON1, WREN
    
    ;;; REQUIRED!!!!!!!!!
    MOVLW 0x55
    MOVWF EECON2
    MOVLW 0xAA
    MOVWF EECON2
    BSF EECON1,WR
    ;;; END!!!!!
  BCF EECON1,WREN
BANKSEL Eaddr
  INCF Eaddr,F

;   MOVFW RCREG ; dit is een alternatieve manier, hierbij blijft hij in de interrupt tot hij een 03h tegenkomt
;   BCF STATUS,Z
;   XORLW 0x03
;   BTFSC STATUS,Z 
;       GOTO EOR    ; END OF RECEIVING
 ;   BCF PIR1,RCIF
;   BTFSS PIR1,RCIF
;       GOTO $-1
;   GOTO RtoE



  GOTO EOI
;;;;;;;;;;;;;;;;;;;;
EOR
   BCF FLAGS,RCFlag
EOI
   BCF PIR1,RCIF
        movf    pclath_temp,w     ; retrieve copy of PCLATH register
        movwf   PCLATH            ; restore pre-isr PCLATH register contents
        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
        MOVWF w_temp
        retfie                    ; return from interrupt


BVD

Offtopic: Weet er iemand een alternatieve omgeving voor MPLAB, waar je we de MPASM compiler in kan zetten ? (liefst opensource)

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 30-11 00:17
- EEPROM is langzaam ( misschien te langzaam )
- Langzaam in een interrupt routine is nie goe
- interrupts aan + eeprom schrijven is vaak ook nie goe want de processor is er vrij druk mee iha

Oplossing:
- Lees string naar RAM
- Schrijf string in main naar eeprom


Waarom wil je de tijd eigenlijk in eeprom zetten? EEPROM gebruik je normaal als je iets wil bewaren als je geen voeding hebt en een tijd bewaren heeft geen enkele zin aangezien je ervan uit kunt gaan dat die tijd achterhaald is als je weer voeding hebt.
waarom kan dat niet zijn MOVF w_temp,w
timing? banking? ignorance? who knows ... :P

[ Voor 19% gewijzigd door farlane op 01-06-2007 14:24 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • voodooless
  • Registratie: Januari 2002
  • Laatst online: 30-11 11:20

voodooless

Sound is no voodoo!

Toevoeging: reken maar eens uit hoe snel je eeprom defect is als je er zo vaak iets naar toe schrijft. We hebben hier wel eens een stukje code van een ander bedrijf gehad dat dat in 10 minuten voor elkaar kreeg :P

Do diamonds shine on the dark side of the moon :?


  • StapelPanda
  • Registratie: Februari 2005
  • Laatst online: 22:11
farlane schreef op vrijdag 01 juni 2007 @ 14:17:
- EEPROM is langzaam ( misschien te langzaam )
- Langzaam in een interrupt routine is nie goe
- interrupts aan + eeprom schrijven is vaak ook nie goe want de processor is er vrij druk mee iha

Oplossing:
- Lees string naar RAM
- Schrijf string in main naar eeprom


Waarom wil je de tijd eigenlijk in eeprom zetten? EEPROM gebruik je normaal als je iets wil bewaren als je geen voeding hebt en een tijd bewaren heeft geen enkele zin aangezien je ervan uit kunt gaan dat die tijd achterhaald is als je weer voeding hebt.


[...]


timing? banking? ignorance? who knows ... :P
ik schrijf het simpelweg naar het EEPROM, omdat ik daar een adres kan toewijzen, en dus gewoon een variabele kan ophogen om de volgende byte naar het volgende adres te schrijven enz.
En ik weet dus niet hoe je dat met RAM doet.

En ik heb net even een hexstring via de pc gestuurd, en dan krijg ik hem ook in zijn geheel terug :S terwijl maar de helft in het eeprom staat. dus idd het eeprom is te traag :(

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 30-11 00:17
Gieltjev schreef op vrijdag 01 juni 2007 @ 14:40:
ik schrijf het simpelweg naar het EEPROM, omdat ik daar een adres kan toewijzen, en dus gewoon een variabele kan ophogen om de volgende byte naar het volgende adres te schrijven enz.
En ik weet dus niet hoe je dat met RAM doet.
Indirect adresseren?

(pseudo)
code:
1
2
3
4
REGA = 0
MOVE [ REGA ] , 'O'
REGA = 1
MOVE [ REGA ] , 'h'


Vaak heb je ook een instructie die automatisch het indexregister ophoogt voordat/nadat de move gedaan is.

code:
1
2
3
REGA = 0
MOVEINC [ REGA ] , 'O'
MOVEINC [ REGA ] , 'h'

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • StapelPanda
  • Registratie: Februari 2005
  • Laatst online: 22:11
farlane schreef op vrijdag 01 juni 2007 @ 15:35:
[...]


Indirect adresseren?

(pseudo)
code:
1
2
3
4
REGA = 0
MOVE [ REGA ] , 'O'
REGA = 1
MOVE [ REGA ] , 'h'


Vaak heb je ook een instructie die automatisch het indexregister ophoogt voordat/nadat de move gedaan is.

code:
1
2
3
REGA = 0
MOVEINC [ REGA ] , 'O'
MOVEINC [ REGA ] , 'h'
BEDANKD !!!!!!!!!!!!!!!!!!!!!! _/-\o_
ik wist niet dat je dat indirect adressing noemt 8)7
na het boekwerk( datasheet) open te hebben geslagen zag ik het staan:
je gebruikt 2 registers, INDF en FSR
FSR is het register adres
INDF is de data.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 30-11 00:17
Als het interessant vindt zou ik je willen aanraden om er een boek op na te slaan, dit is een beetje programming by infinite recompile :P

( En als je dan ongeveer weet hoe assembly in elkaar zit ( je weet dan ook automatisch ongeveer hoe een processor werkt ) snel wegdoen en een c compiler erbij pakken. :) )

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • StapelPanda
  • Registratie: Februari 2005
  • Laatst online: 22:11
farlane schreef op vrijdag 01 juni 2007 @ 17:01:
Als het interessant vindt zou ik je willen aanraden om er een boek op na te slaan, dit is een beetje programming by infinite recompile :P

( En als je dan ongeveer weet hoe assembly in elkaar zit ( je weet dan ook automatisch ongeveer hoe een processor werkt ) snel wegdoen en een c compiler erbij pakken. :) )
Ik ben niet zo'n boekenwurm, ik heb wel een asm tutorial gelezen, en het meeste snap ik wel, ik krijg usart, ad conversies en pwm aan de gang. maar als je niet weet waarnaar je zoekt is het moeilijk. geld hetzelfde voor een alternatief voor MPLAB, heb in google al vanalles geprobeerd, maar ik krijg er niet het goede uit.

  • JeromeB
  • Registratie: September 2003
  • Laatst online: 15-11 14:27

JeromeB

woei

Gieltjev schreef op zaterdag 02 juni 2007 @ 11:11:
[...]

Ik ben niet zo'n boekenwurm, ik heb wel een asm tutorial gelezen, en het meeste snap ik wel, ik krijg usart, ad conversies en pwm aan de gang. maar als je niet weet waarnaar je zoekt is het moeilijk. geld hetzelfde voor een alternatief voor MPLAB, heb in google al vanalles geprobeerd, maar ik krijg er niet het goede uit.
Je zou de CC5X C Compiler kunnen gebruiken icm MPLAB.

PC load letter? What the fuck does that mean?


  • StapelPanda
  • Registratie: Februari 2005
  • Laatst online: 22:11
JeromeB schreef op zaterdag 02 juni 2007 @ 11:39:
[...]


Je zou de CC5X C Compiler kunnen gebruiken icm MPLAB.
Hmm, dat zou een alternatief zijn op MPASM, maar ik bedoel meer de ontwikkelomgeving.

  • titan_pi8
  • Registratie: Januari 2004
  • Laatst online: 11-11 23:10
Gieltjev schreef op vrijdag 01 juni 2007 @ 12:35:
...
ook snap ik dit niet (einde van het interrupt):
;swapf w_temp,f
;swapf w_temp,w ; restore pre-isr W register contents
waarom kan dat niet zijn MOVF w_temp,w

...
Dat kan niet omdat 'MOVF w_temp, w' het STATUS register weer zou aanpassen (het zou namelijk de Z bit kunnen zetten/clearen). Door de swapf instructies te gebruiken wordt het STATUS register niet beïnvloed.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 30-11 00:17
Gieltjev schreef op zaterdag 02 juni 2007 @ 11:11:
Ik ben niet zo'n boekenwurm, ik heb wel een asm tutorial gelezen, en het meeste snap ik wel, ik krijg usart, ad conversies en pwm aan de gang. maar als je niet weet waarnaar je zoekt is het moeilijk. geld hetzelfde voor een alternatief voor MPLAB, heb in google al vanalles geprobeerd, maar ik krijg er niet het goede uit.
Programmeren aan de hand van tutorials is goed (snel resultaat ), maar je komt er niet onderuit ( zeker in dit soort embedded omgevingen ) om de werking van de CPU echt te kennen om een niet triviaal programma te schrijven. Indirect addresseren is toch wel een wezenlijk deel is van het programmeren. ( Of dat nu is ASM is of in een andere taal, vergelijk het met bv pointers in C )

Ik zou je echt willen aanraden om ( indien mogelijk natuurlijk ) een C compiler te pakken en over te stappen naar C. ASM vergt een onevenredige hoeveelheid energie om gestructureerd/overzichtelijk te houden en in normale omstandigheden ( uitzondering : interrupt routines ) krijg je je code weinig to niet sneller dan de compiler.

[ Voor 16% gewijzigd door farlane op 04-06-2007 08:53 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.

Pagina: 1