Hulp bij PIC18F

K

kotsam

Guest
Hi All,

Ik heb Worte code hieronder aangegeven, is deze code tussen comapring op registers, RAM0 en ADC1 zoals weergegeven in onderstaande code, het probleem is in deze code, als ik writting waarde van deze registers, zonder gebruik RCREG, net verhuizen naar varibales hen, de vergelijk-functie werkt prima, maar als ik probeer te RS232 te gebruiken om wirte in de ram locatie (RAM0 bijvoorbeeld) de comapring niet werkt zoals verwacht, betekent dit dat de RAM0 heeft probleem van de ingevoerde waarde, dat wil zeggen wat ik heb ik de overgedragen waarde aan de TXREG om te zien of ik schriftelijke instructies goed, en wat ik te weten dat ik vreemde signalen (bijvoorbeeld als ik schriftelijke instructies te ram0 5 i weer (!@#$%) maar op de andere had als ik loop de Tranfer transactie i de juiste waarde te krijgen,
kan iemand please help me out Ik heb meer dan een week bezig geweest om uit te vinden waar is het probleem en ik kon vinden;Code:

# include <p18F4550.inc>CONFIG WDT = OFF; uitschakelen watchdog timer

CONFIG MCLRE = ON; geen MCLR

CONFIG DEBUG = ON; uitschakelen Debug Mode

CONFIG LVP = OFF; Low-Voltage programmering gehandicapten (nodig voor debugging)

CONFIG FOSC = HS; voor 20MHZDelay1 res 1; reserve 1 byte voor de variabele Delay1

Delay2 res 1; reserve 1 byte voor de variabele Delay2

;************************************************* *********

; Begin van uitvoerbare codeorg 0x000; Reset vector

NOP

goto Main;************************************************* *********

; Interrupt vectororg 0x008; interruptvector

goto IntService;************************************************* *********

; HoofdprogrammaBelangrijkste

Eerste oproep; Initialize allesMainLoop

goto MainLoop; Oneindige lus;************************************************* *********

; Initial RoutineInitial

Clrf RAM0

Movl W 0x0F

Movwf ADCON1; alle digitale I / O

MOVLW 0x07

Movwf CMCON; alle digitale I / OClrf LATB

Clrf TRISB; PORTB alle uitgang 0

Clrf LATD

Clrf TRISD; PORTB alle uitgang 0movlw ,129;

movwf SPBRGbsf BAUDCON, BRG16

BCF TXSTA, SYNCbsf TXSTA, txeN; inschakelen zenden

BCF TXSTA, BRGH; Selecteer hoog baudratebsf RCSTA, Spen; Enable Serial Port

bsf RCSTA, Cren; inschakelen continu bemandBCF PIR1, RCIF; Clear RCIF Interrupt Flag

bsf PIE1, RCIE; Set RCIE Interrupt Enable

bsf INTCON, PEIE; perifere Enable interrupts

bsf INTCON, GIE; Enable global interrupts; bsf TRISC, 7; Set RC7/RX als input pin

MOVLW b'10101111 '

movwf TRISC

CALL CompareFuncionLOOP

terug;************************************************* *********

; Interrupt Service Routine

; Deze routine wordt aangeroepen wanneer krijgen we een interrupt.IntService

btfsc PIR1, RCIF; Controleer voor een seriële poort Ontvangst onderbreken

gesprek ontvangt

retfie;************************************************* *********

; Ontvang Routine

; Deze routine wordt genoemd whenver krijgen we een seriële poort Ontvangst onderbreken.

Ontvangen:

; deze indirecte adressering

; proces gegevens wilde ram locatie; door schriftelijke instructies van de gegevens en het adres

movf RCREG, W;

movwf FSR0L; is hier het selecteren van het adres,, Ik weet dat het moet FSR0H maar zijn niet vereist voor deze test zijn

movf RCREG, W;

movwf INDF0; schriftelijke instructies in het geselecteerde adres

RETURNCompareFuncion:CALL SAVEINTORAM; nemen de Ram waarde hier is het probleem dat de ram de waarde van de recvied hier niet als de ingevoerde waarde

MOVLW D'51 ', maar in de andere kant, als ik niet schrijven naar RAM0 zoals ik heb gedaan voor ADC1 het werkt prima, alleen wanneer ik de waarde via RCREG het maakt problemen

Movwf ADC1; gebracht d'51 'in ADC1

; MOVF ADC1, W;

SUBWF RAM0; ADC1-RAM0 = 0

BTFSC STATUS, Z

GOTO CompareFuncion, ja herhalen

GOTO CHECKNEG; NOCHECKNEG

Clrf ADC1

MOVF ADC1, W

SUBWF RAM0; ADC1-RAM0 = negatief

BTFSC STATUS, N

GOTO PoTDownAN0

GOTO PotUPAN0PoTDownAN0:; MOVE POT omlaag

bsf PORTB, 5; / CS

NOP

bsf PORTB, 4; / UD

NOP

BCF PORTB, 5; / CS

NOP

BCF PORTB, 4; / UD

NOP

bsf PORTB, 4; / UD

bsf PORTB, 5; / CS

GOTO CompareFuncion

PotUPAN0:; MOVE POT-up

bsf PORTB, 5; / CS

NOP

BCF PORTB, 4; / UD

NOP

BCF PORTB, 5; / CS

NOP

bsf PORTB, 4; / UD

NOP

BCF PORTB, 4; / UD

bsf PORTB, 5; / CS

GOTO CompareFuncion

SAVEINTORAM:

MOVF RAM0, W

Movwf TXREG, ik ben het lezen van de waarde te zorgen dat de schreef ik in het correclty maar ik krijg vreemd signaal (als ik schrijf bijvoorbeeld 5,

, i get (! @ haohuege (geluiden)), maar ik loop; zoals GOTO SAVEINTORAM ik de juiste waarde, maar de oneindige lus;RETURN

eindigen

 
Nou DEBUG = ON zal schakelen de debug feature ...

Wil je iets eenvoudigs, probeer Zwaardvis BASIC SE (gratis) voor de 18F

Code:

(

************************************************** ***************************

* Naam: ReadySteadyGO.BAS *

* Auteur: William Richardson *

* Notice: Copyright (c) 2008 blueroomelectronics *

*: Alle rechten voorbehouden *

* Datum: 3/3/2008 *

* Version: 0.9beta voor de Junebug 18F Laboratorium *

* Opmerkingen: LED 3,2,1 aftellen, druk op knop # 1 zodra LED 1 brandt

*: DIP-switch # 4 moet worden om te zien met behulp van de resultaten PICkit2 UART Tool *

************************************************** ***************************

)

Device = 18F1320

Klok = 8 / / 8MHz klokInclude "junebug.bas"

Include "convert.bas"

Include "usart.bas"Dim Kwalificeer, Temp As Byte

Dim Tijd Aangezien de totale tijd String 'in onsInterrupt buttonPress ()

T0CON.7 = 0 'stop de timer

Als Kwalificeer = 0

Dan

Write ( "Too Soon! Je moet wachten tot # 1 LED brandt.", 13,10)

LED (6)

Anders

Temp = TMR0L 'ladingen TMR0H

Tijd = DecToStr (((TMR0H * 256) Temp) * 16,6)

Write ( "Uw tijd is 0.", Time, "Seconden.", 13,10)

LED (4)

EndIf

INTCON.4 = 0 '

Terwijl juist

Wend

Einde Interrupt

OSCCON = $ 72 / / 8 MHz clock

SetBaudrate (br9600)

INTCON2.7 = 0 'zwak pullups op

INTCON.1 = 0 'INT0IF

INTCON.4 = 1 'INT0IE

INTEDG0 INTCON2.6 = 0 'dalende flank trigger

ADCON1 =% 11110101

Write ( "Wanneer LED verlichting 1 Druk op de toets # 1.", 13,10)

Kwalificeer = 0

T0CON = $ 04 '1 / 32 prescaler timer op 0, 16 bit modus

TMR0L = 0 'duidelijk de timer

TMR0H = 0

LED (3) 'Ready

DelayMS (1000)

INTCON.1 = 0 'duidelijk de interrupt vlag

Enable (buttonPress)

LED (2) 'Steady

DelayMS (500)

Kwalificeer = 1 'doen diskwalificeren jezelf niet door te drukken te vroeg

T0CON.7 = 1 'start de timer

LED (1) 'GO

DelayMS (1000) '1 seconden timeout

INTCON.4 = 0 'te traag schakelen onderbreken

LED (5)

Write ( "Too Slow, drukt u op RESET nogmaals te proberen.", 13,10)

Terwijl juist

Wend

Eindigen
 
Een goede programmering adviseren: altijd initialiseren van de registers die u gebruikt.
Zelfs als de datasheet zegt dat een waarde van een register wordt 0xFF of 0x00 op reset, is het beter om het goed te initialiseren binnen de initialisatie gedeelte van je code.

Dus, zou je een meer robuuste code als u FSR0H initialiseren

Met vriendelijke groet
Kabanga

 

Welcome to EDABoard.com

Sponsor

Back
Top