2016-08-04 25 views
0

Ich versuche, einige Daten an meinen PC als ersten Schritt eines größeren Projekts zu senden, ich arbeite mit dem Pic16f723.Pic16f723 versagt beim Senden von Daten TX über RS ​​232, printf bekommt das Bild stecken

Ich versuche, die gleichen Methoden zu verwenden, die ich zuvor mit pic16f876 oder pic16f818 usw. verwendet habe, aber es funktioniert nicht.

Kann nicht finden, wo das Problem ist, ich will nur ein Byte übertragen, ich überprüfe und prüfe die PIC16F723 datasheet, aber ich bin unfähig, nichts zu lösen.

Soweit ich weiß, bleibt es in der Schleife oben stecken, die das TXEN-Bit aus dem TXSTA-Register prüft, und es ist immer in = so wird es immer überprüft. Sehen Sie die ganze asm und ccs oben

003F: MOVLW 05 
0040: BTFSS 0C.4 
0041: GOTO 040 

Ich frage mich, warum ccs die TXEN ermöglichen tut, ich habe tatsächlich versucht, es auf diese Weise funktioniert:

.................... #asm 
    BSF 0x0C,4 
    .................... #endasm 

Aber nichts gelöst wurde ..

Kann mir jemand dabei helfen? Irgendeine Idee? Tanks und fragen, ob Zweifel!

Hier ist mein CCS Code

#include <16F723.h> 


#FUSES INTRC_IO 
#FUSES NOPROTECT 
#FUSES NOMCLR 

#fuses NOWDT,NODEBUG,NOPUT,NOBROWNOUT 
#use delay(clock=4000000) 
#use rs232(baud=9600, xmit=PIN_C6,rcv=PIN_C7) 

#byte PORTA=0x05 
#byte PORTB=0x06 
#byte PORTC=0x07 
#byte TRISA=0x85 
#byte TRISB=0x86 
#byte TRISC=0x87 
void main() { 
TRISA=0x00; 
TRISB=0x00; 
PORTA=0xFF; 

    while(1){ 
PORTB=0xF0; //<- This line gets the PIC stuck 

printf("5"); // Trying to send data 
delay_ms(500);// Those lines are just a bit sequence for tests 
PORTB=0x0F; 
delay_ms(500); 
     } 
    } 

Und hier können Sie die asm/lst nach oben als auch überprüfen:

CCS PCM C Compiler, Version 4.106, 10478    07-ago-16 20:03 

       Filename: C:\Users\agf\Desktop\icom\swx_PIC16F723\PIC16f723b.lst 

       ROM used: 85 words (2%) 
         Largest free fragment is 2048 
       RAM used: 6 (3%) at main() level 
         7 (4%) worst case 
       Stack: 1 locations 

* 
0000: MOVLW 00 
0001: MOVWF 0A 
0002: GOTO 019 
0003: NOP 
.................... 
.................... #include <16F723.h> 
.................... //////// Standard Header file for the PIC16F723 device //////////////// 
.................... #device PIC16F723 
.................... #list 
.................... 
.................... 
.................... 
.................... #FUSES XT      //High speed Osc (> 4mhz) 
.................... #FUSES NOPROTECT 
.................... #FUSES NOMCLR 
.................... 
.................... #fuses NOWDT,NODEBUG,NOPUT,NOBROWNOUT 
.................... #use delay(clock=4000000) 
0004: MOVLW 22 
0005: MOVWF 04 
0006: BCF 03.7 
0007: MOVF 00,W 
0008: BTFSC 03.2 
0009: GOTO 018 
000A: MOVLW 01 
000B: MOVWF 78 
000C: CLRF 77 
000D: DECFSZ 77,F 
000E: GOTO 00D 
000F: DECFSZ 78,F 
0010: GOTO 00C 
0011: MOVLW 4A 
0012: MOVWF 77 
0013: DECFSZ 77,F 
0014: GOTO 013 
0015: GOTO 016 
0016: DECFSZ 00,F 
0017: GOTO 00A 
0018: RETURN 
.................... #use rs232(baud=9600, xmit=PIN_C6,rcv=PIN_C7) 
.................... //#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8) 
.................... 
....................  
.................... #byte PORTA=0x05 
.................... #byte PORTB=0x06 
.................... #byte PORTC=0x07 
.................... #byte TRISA=0x85 
.................... #byte TRISB=0x86 
.................... #byte TRISC=0x87 
.................... void main() { 
0019: CLRF 04 
001A: BCF 03.7 
001B: MOVLW 1F 
001C: ANDWF 03,F 
001D: MOVLW 19 
001E: BSF 03.5 
001F: MOVWF 19 
0020: MOVLW A6 
0021: MOVWF 18 
0022: MOVLW 90 
0023: BCF 03.5 
0024: MOVWF 18 
0025: BSF 03.5 
0026: BSF 03.6 
0027: BCF 05.0 
0028: BCF 05.1 
0029: BCF 05.2 
002A: MOVF 06,W 
002B: ANDLW C0 
002C: MOVWF 06 
002D: BCF 03.6 
002E: BCF 1F.0 
002F: BCF 1F.1 
0030: BSF 03.6 
0031: MOVF 05,W 
0032: ANDLW C0 
0033: MOVWF 05 
.................... TRISA=0x00; 
0034: BCF 03.6 
0035: CLRF 05 
.................... TRISB=0x00; 
0036: CLRF 06 
.................... 
.................... PORTA=0xFF; 
0037: MOVLW FF 
0038: BCF 03.5 
0039: MOVWF 05 
....................    //Inicialización del display 
.................... 
.................... // set_tris_a(0x1f); //A ateak sarrerak 
.................... // set_tris_b(0x00); 
.................... 
.................... setup_uart(TRUE); 
003A: BSF 18.7 
003B: BSF 18.4 
.................... while(1){ 
.................... PORTB=0xF0; 
003C: MOVLW F0 
003D: MOVWF 06 
.................... putc(0x05); 
003F: MOVLW 05 
0040: BTFSS 0C.4 
0041: GOTO 040 
0042: MOVWF 19 
.................... 
.................... delay_ms(500); 
0043: MOVLW 02 
0044: MOVWF 21 
0045: MOVLW FA 
0046: MOVWF 22 
0047: CALL 004 
0048: DECFSZ 21,F 
0049: GOTO 045 
.................... PORTB=0x0F; 
004A: MOVLW 0F 
004B: MOVWF 06 
.................... delay_ms(500); 
004C: MOVLW 02 
004D: MOVWF 21 
004E: MOVLW FA 
004F: MOVWF 22 
0050: CALL 004 
0051: DECFSZ 21,F 
0052: GOTO 04E 
....................   } 
0053: GOTO 03C 
.................... } 
.................... 
0054: SLEEP 

Configuration Fuses: 
    Word 1: 3CD1 XT NOWDT NOPUT NOMCLR NOPROTECT NOBROWNOUT BORV19 PLLEN NODEBUG 
    Word 2: 3FFF NOVCAP 
+1

Was soll 'printf (0x05);' tun? Welche Zeichenfolge hat Adresse 5? –

+0

senden Sie alle Daten über Tx Printf ("5"), oder Putc (0x05) bereits bearbeitet, sorry ich machte viele Tests –

+0

Sie haben neuere PICs verwendet. Sie können Dinge vorziehen, die die 723 nicht hat. Vergleichen Sie alle Datenblätter auf Unterschiede. Möglicherweise müssen Sie eine Uhr für den UART und/oder einen anderen zusätzlichen Schritt aktivieren, der in den neueren Modellen nicht benötigt wird. Sind die Pins anders (z. B. müssen Sie den Chip anders verdrahten)? Überprüfen Sie auf 723 Errata, die ein separates Dokument sein kann. Verzögerungswerte müssen möglicherweise für einen gegebenen Chip größer/kleiner sein. Überprüfen Sie die '.h' Dateien für alle Chips. '16F723.h' könnte einen _bug_ enthalten. Betrachten Sie die Init-Sequenzierung Doing Y vor X kann für neuere OK sein, aber 723 _needs_ X vor Y –

Antwort

1

Ich sehe keine Bank-Select-Anweisungen in Ihrem Inline-Assembler-Code .

Die PIC16F-Serie verwendet Bänke mit 128 Byte Speicher (0-7F, 80-FF, 100-17F usw.). Die oberen Bits grßerer Adressen werden in dem Statusregister gespeichert, das eines von wenigen Registern ist, die über alle Bänke sichtbar sind, und müssen korrekt für die Register eingestellt sein, die in nur einer Bank existieren.

vom C-Compiler generierten Code,

.................... TRISA=0x00; 
0034: BCF 03.6 <- this line is modifying the necessary bank selection before accessing memory 
0035: CLRF 05 

PIR1 ist nicht in der gleichen Speicherbank-Datei als PORTB, die die letzte Lage durch den C-Compiler generierte Code zugegriffen wird.

Ihr C-Compiler entfernt unnötige Bankauswahloperationen. Dies ist der Grund, warum Sie nur einige wenige im Code verstreut sehen. Wenn Sie jedoch Assemblercode inline einfügen, sind Sie für die Bankauswahl in diesem Code verantwortlich Der integrierte Assembler des C-Compilers wird nicht wissen, was Sie zu tun versuchen. Normalerweise stellt der Assembler ein Makro zur Verfügung, um die Bank mit einer benannten Variablen abzugleichen (dies ist der Grund, dass TRISB beispielsweise den Wert 0x86 hat, aber mit der Byte-Adresse 06 im obigen Ausschnitt zugegriffen wird). So würde zum Beispiel

bank TRISB 

würde die oberen Bits überprüfen und bestimmen, wie zu wählen. Sie müssen jedoch das spezifische Makro für Ihren Compiler nachschlagen. Ich benutze normalerweise PIC-Assembler, daher kenne ich verschiedene C-Compiler für den PIC nicht sehr gut.

0
  1. Mit Debuggern arbeiten, um zu überprüfen, wo der Code hängt - stellen Sie sicher, dass die Optimierung ausgeschaltet ist.
  2. Überprüfen Sie den Code erneut, TXEN ist NICHT das Bit, das Sie zum Poolpool verwenden müssen, um zu überprüfen, ob das Byte übertragen wurde.
  3. Keine ISR verwenden? Stellen Sie sicher, dass alle Interrupts durch leere GIE GIEL-Bits geschlossen sind.
  4. printf("5"); - versuchen Sie stattdessen mit putc('5').
  5. Was macht PORTB=0xF0;? Wenn Sie einen Debugger verwenden, verwendet PORTB diesen Port für die Kommunikation. Seien Sie vorsichtig beim Ändern PORTB Pins während des Debuggens.
0
  1. Überprüfen der Takt die gleiche Frequenz wie Verzögerungstakt sein.
  2. Suchen Sie in Microchip-Dokumente für TRISB-Einstellung, weil Sie es falsch machen und Sie den Chip sperren. Verwenden Sie die CCS-definierten Funktionen #use_standard_io (Port) oder #use_fast_io (Port) plus die Funktion set_tris_X(), um mit Ports zu arbeiten.
  3. Die Anweisung #use rs232 pre-processor muss angegeben werden, bevor Sie mit dem Senden von Daten über die serielle Schnittstelle beginnen. Jede Änderung in Port C (Tris C, usw.) wird mit dem RS232-Ding versauen und dein Setup ruinieren. Fügen Sie auch ERRORS zu Ihrer #use RS232 hinzu, damit der Chip von blockierten Zeichen wiederherstellen kann.
  4. Verwenden Sie putc(), puts() anstelle von printf(). Sehen Sie sich die von CCS bereitgestellten Beispiele an. Sie arbeiten.