Mit Hilfe PIC18F

K

kotsam

Guest
Hi All,

Ich habe worte Code unten gezeigt, ist dieser Code comapring zwischen den zu den Registern, RAM0 und ADC1 wie in den Code unten, das Problem ist in diesem Code, wenn
ich schreiben Wert dieser Register, ohne mit RCREG, nur bewegen varibales zu sie vergleichen die Funktion funktioniert gut, aber wenn
ich versuche, RS232 zu Wirte in den RAM-Standort (RAM0 zum Beispiel) die comapring ist nicht wie erwartet funktioniert, bedeutet dies,
dass das Problem der RAM0 hat den eingegebenen Wert, dh, was ich habe ich übertragen Sie den Wert auf die TXREG, um zu sehen, wenn
ich richtig schreiben, und was ich feststellen, dass ich merkwürdige Signale (zum Beispiel, wenn
ich zu schreiben ram0 5 i wieder (!@#$%), sondern auf der andere hatte, wenn ich die Schleife Transfer Betrieb bekomme ich den korrekten Wert,
kann jemand bitte helfen Sie mir ich habe mehr als eine Woche versucht, um herauszufinden, wo ist das Problem, und ich konnte es;Code:

# include <p18F4550.inc>CONFIG WDT = OFF; deaktivieren Watchdog-Timer

CONFIG MCLRE = ON; keine MCLR

CONFIG DEBUG = ON; Debug-Modus deaktivieren

CONFIG LVP = OFF; Low-Voltage Programmierung deaktiviert (notwendig für die Fehlersuche)

CONFIG FOSC = HS; für 20MHzDelay1 res 1; Reserve 1 Byte für die Variable Delay1

Delay2 res 1; Reserve 1 Byte für die Variable Delay2

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

; Start der ausführbaren Codeorg 0x000; Reset Vektor

nop

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

, Interrupt-Vektororg 0x008; Interrupt-Vektor

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

; HauptprogrammHauptsächlich

Erste Aufforderung; Initialisieren allesMainLoop

goto MainLoop; Endlosschleife;************************************************* *********

; Erste RoutineErste

CLRF RAM0

Movl W 0x0F

MOVWF ADCON1; alle digitalen I / O

MOVLW 0x07

MOVWF CMCON; alle digitalen I / OCLRF LATB

CLRF TRISB; alle PORTB Ausgang 0

CLRF LATD

CLRF TRISD; alle PORTB Ausgang 0movlw ,129;

movwf SPBRGBSF BAUDCON, BRG16

bcf TXSTA, SYNCBSF TXSTA, TXEN; Aktivieren Sie übermitteln

bcf TXSTA, BRGH; Wählen Sie hohe BaudrateBSF RCSTA, SPEN; Enable Serial Port

BSF RCSTA, CREN; Aktivieren kontinuierlichen Empfangbcf PIR1, RCIF; Frei RCIF Interrupt Flag

BSF PIE1, RCIE; Set RCIE Interrupt Enable

BSF INTCON, PEIE; Aktivieren peripheren Interrupts

BSF INTCON, GIE; Aktivieren globalen Interrupts; BSF TRISC, 7; Set RC7/RX als Eingangspin

movlw b'10101111 "

movwf TRISC

CALL CompareFuncionLOOP

zurück;************************************************* *********

, Interrupt Service Routine

; Diese Routine wird aufgerufen, wenn wir einen Interrupt.IntService

btfsc PIR1, RCIF; Check für eine serielle Schnittstelle Empfang Interrupt

Anruf empfangen

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

; Empfangen Routine

; Diese Routine wird whenver wir eine serielle Schnittstelle Empfang unterbrechen.

Erhalten:

; diese indirekte Adressierung

; Prozess Daten wollte RAM Lage, durch Schreiben an die Daten und die Adresse

movf RCREG, W;

movwf FSR0L, hier ist die Auswahl der Adresse,, Ich weiß, es sollte aber seine FSR0H nicht erforderlich, für diesen Test

movf RCREG, W;

movwf INDF0; Schreiben in der ausgewählten Adresse

RETURNCompareFuncion:CALL SAVEINTORAM; die Ram-Wert ist hier das Problem, dass die RAM-Wert der recvied hier nicht als der eingegebene Wert

MOVLW D'51 ', aber in der anderen Hand, wenn ich nicht zu schreiben RAM0 wie ich für ADC1 es funktioniert gut, nur wenn ich den Wert durch RCREG macht Probleme

MOVWF ADC1; setzen d'51 'in adc1

; MOVF ADC1, W;

SUBWF RAM0; ADC1-RAM0 = 0

BTFSC STATUS, Z

GOTO CompareFuncion; ja wiederholen

GOTO CHECKNEG, keineCHECKNEG

CLRF ADC1

MOVF ADC1, W

SUBWF RAM0; ADC1-RAM0 = negative

BTFSC Status, N

GOTO PoTDownAN0

GOTO PotUPAN0PoTDownAN0:; MOVE POT Festlegung

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 bis

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, ich bin Lesen Sie den Wert, um sicherzustellen, dass die ich geschrieben habe, in die sie correclty aber, bekomme ich komische Signal (wenn ich schreibe, zum Beispiel 5,

, i get (! @ haohuege (Geräusche)), aber ich loop; GOTO SAVEINTORAM wie ich den korrekten Wert, aber die Endlosschleife;RETURN

Ende

 
Do oferty firmy Palit trafiły dwie karty graficzne z serii GeForce GTX 750 oraz GeForce GTX 750 Ti, z pasywnym systemem chłodzenia pasywnie. Karty należą do serii o nazwie KalmX i są wyposażone w 28-nanometrowy układ graficzny GM107 z serii Maxwell oraz 2 GB pamięci GDDR5 ze 128-bitową magistralą. Pierwsza z nich ma 512 procesorów strumieniowych i ...

Read more...
 
Nun DEBUG = ON Schalten Sie den Debug-Funktion ...

Möchten Sie etwas einfach, versuchen Schwertfisch BASIC SE (kostenlos) für die 18F

Code:

(

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

* Name: * ReadySteadyGO.BAS

* Autor: William Richardson *

* Hinweis: Copyright (c) 2008 blueroomelectronics *

*: Alle Rechte vorbehalten *

* Datum: 3.3.2008 *

* Version: 0.9beta für die Maikäfer 18F Labor *

* Hinweise: LEDs 3,2,1 Countdown, drücken Sie die Taste # 1 so bald wie LED 1 leuchtet

*: DIP-Schalter # 4 müssen sich auf, um zu sehen, die Ergebnisse mit PICkit2 UART-Tool *

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

)

Device = 18F1320

Clock = 8 / / 8MHz UhrInclude "junebug.bas"

Include "convert.bas"

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

Dim Zeit As String 'Gesamtzeit in unsInterrupt ButtonPress ()

T0CON.7 = 0 'Stoppt den Timer

Wenn Qualify = 0

Dann

Write ( "Too Soon! Sie müssen warten, bis LED # 1 leuchtet.", 13,10)

LED (6)

Sonst

Temp = TMR0L "lädt TMR0H

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

Write ( "Ihre Zeit war 0.", Die Zeit, "Sekunden.", 13,10)

LED (4)

Endif

INTCON.4 = 0 '

Während wahr

Wend

Ende Interrupt

OSCCON = $ 72 / / 8 MHz Takt

SetBaudrate (br9600)

INTCON2.7 = 0 "schwache pullups auf

INTCON.1 = 0 'INT0IF

INTCON.4 = 1 'INT0IE

INTCON2.6 = 0 'INTEDG0 fallenden Flanke Trigger

ADCON1 =% 11110101

Write ( "Wenn LED 1 leuchtet drücken Sie die Taste # 1"., 13,10)

Anspruch = 0

T0CON = $ 04 '1 / 32 Timer Vorteiler auf 0, 16-Bit-Modus

TMR0L = 0 "klar den Timer

TMR0H = 0

LED (3) "Ready

DelayMS (1000)

INTCON.1 = 0 "klar den Interrupt Flag

Aktivieren (ButtonPress)

LED (2) "Steady

DelayMS (500)

Qualify = 1 'nicht disqualifizieren sich selbst, indem Sie zu früh

T0CON.7 = 1 "starten Sie den Timer

LED (1) "GO

DelayMS (1000) "1 Sekunde Timeout

INTCON.4 = 0 "zu langsam deaktivieren Interrupt

LED (5)

Write ( "zu langsam ist, drücken Sie RESET um es erneut zu versuchen.", 13,10)

Während wahr

Wend

Ende
 
Eine gute Planung beraten: immer initialisieren den Registern Sie verwenden.
Auch wenn das Datenblatt sagt, dass ein Wert eines Registers ist oder 0x00 auf 0xFF zurückgesetzt, es besser zu initialisieren, es direkt in die Initialisierung Abschnitt Ihres Codes.

Also, Sie haben eine robuste Code initialisiert, wenn Sie FSR0H

Mit besten Grüßen
Kabanga

 

Welcome to EDABoard.com

Sponsor

Back
Top