PIC printf funktioniert nicht.

Gast #1456749
Lesenswert?

Hallo,

ich wollte nur zum Debuggen einen kleinen Text über den UART ausgeben. 
Ich benutze MPLAB 8.40 mit ICD2 LE um auf einem "16-Bit 28-Pin Starter" 
Bord einen dspic30f4012 zu programmieren.

Da dies nicht funktioniert hat, hab ich ein neues Projekt angelegt und 
versuche seit dem über den UART mit printf etwas auszugeben (Siehe 
Code). Ausschließen kann ich:
Der für printf nötige Heap ist vorhanden.
Programmieren funktioniert und das Programm läuft auf dem pic.
Treiber für den RS232 to USB funktioniert.

Eingrenzung:
Mit dem Osci messe ich am Ausgang keine Signaländerung.
Compilieren geht ohne Probleme.
1
#include "p30fxxxx.h"
2
#include <stdio.h>
3
#include <uart.h>
4

5

6

7
_FOSC(CSW_FSCM_OFF & XT_PLL8);  //Run this project using an external crystal
8
                                //routed via the PLL in 16x multiplier mode
9
                                //For the 7.3728 MHz crystal we will derive a
10
                                //throughput of 7.3728e+6*16/4 = 29.4 MIPS(Fcy)
11
                                //,~33.9 nanoseconds instruction cycle time(Tcy).
12
_FWDT(WDT_OFF);                 //Turn off the Watch-Dog Timer.
13
_FBORPOR(MCLR_EN & PWRT_OFF);   //Enable MCLR reset pin and turn off the
14
                                //power-up timers.
15
_FGS(CODE_PROT_OFF);            //Disable Code Protection
16

17

18

19
int main (void)
20
{
21
  //U1BRG = 0x00BE; // 9600 baud
22
  //U1MODEbits.PDSEL = 0;
23
  //U1MODEbits.STSEL = 1;
24
      
25
  while (1)              
26
        {          
27
  printf("test");      
28
        }
29
  return 0;
30
}

wäre echt cool, wenn mir jemand helfen könnte!!
#1456801
Lesenswert?

ich habe noch nie printf gebraucht, jedoch enthälst du uns vor, was du 
mit "heap" meinst (ggf. source-code von diesem auch veröffentlichen, 
denn nicht alle haben einen glaswürfel :-P ). falls dein heap nichts mit 
der uart-inizialisierung zu tun hat, müsstest du natürlich dein uart 
richtig inizialisieren (schau dazu ein demo-file von Microchip an).
andere frage: was hat das "treiber für RS232 zu USB" mit diesem code 
hier resp. deinem problem zu tun? (welcher zusammenhang?)
Gast #1457002
Lesenswert?

Habe nun das ganze ohne printf probiert. Dazu verwende ich nun auch 
keinen Heap.

Fehlereingrenzung:
Nehme ich den PIC raus, brücke Tx und Rx, so kann ich das was ich sende 
empfangen.
Der PIC läuft, da meine LEDs durch den Interrupt blinken.
Manchmal gibt er mir sogar was aus, jedoch nicht "Ha". Wenn er dann was 
ausgibt, dann so wie es sein soll d.h. hintereinander ohne 
unterbrechung. Ist allerdings nicht reproduzierbar. Hab es zweimal 
hinbekommen, das er mir mein Terminal zuballert.

Als erstes hatte ich ja versucht printf zu benutzten. Kam ja allerdings 
wie ihr oben lest, nichts raus. Leider ...

Der interne Loopback (//U1MODE = 0x8040; // Loopback test) funktioniert 
auch nicht. D.h. ich empfange nichts, wenn ich sende.

Ich hoffe, ihr könnt mir helfen!!!

Mein gesamter Code:
1
#include "p30F4012.h"
2
#include <stdio.h>
3
#include <uart.h>
4

5
#define XTFREQ          7372800             //On-board Crystal frequency
6
#define PLLMODE         16                   //On-chip PLL setting
7
#define FCY             XTFREQ*PLLMODE/4        //Instruction Cycle Frequency
8

9
#define BAUDRATE         9600       
10
#define BRGVAL          ((FCY/BAUDRATE)/16)-1 
11

12

13
int main(void)
14
{
15

16
  ADPCFG = 0xFF;      //Make analog pins digital 
17

18
  LATE = 0x0;
19
  TRISE = 0x0;      //Configure LED pins as output
20

21
  TMR1 = 0;        // clear timer 1
22
  PR1 = 0x7270;      // interrupt every 250ms
23
  IFS0bits.T1IF = 0;    // clr interrupt flag
24
  IEC0bits.T1IE = 1;    // set interrupt enable bit
25
  T1CON = 0x8030;      // Fosc/4, 1:256 prescale, start TMR1
26

27

28
  TRISF = 0xC;
29
  U1BRG  = BRGVAL;
30
  U1MODE = 0x8000;     // Reset UART to 8-n-1, alt pins, and enable 
31
        //U1MODE = 0x8040;              // Loopback test
32
  U1STA  = 0x0440;     // Reset status register and enable TX & RX
33

34

35
  _U1RXIF=0;          // Clear UART RX Interrupt Flag
36

37

38
  while(1)
39
  {
40

41
               //printf("TEST");
42

43
    while(!U1STAbits.TRMT);    
44
    U1TXREG = 'H';
45
  
46
    while(!U1STAbits.TRMT);
47
    U1TXREG = 'a';
48
        }
49
}
50
return 0;
51
}
52

53

54
void __attribute__((interrupt, no_auto_psv)) _T1Interrupt(void)
55
{
56
  IFS0bits.T1IF = 0;    // clear interrupt flag
57
  
58
  LATE ^= 0xF;      //Toggle LED's
59
}
Gast #1457560
Lesenswert?

Hallo Lui,
Danke für die Antwort, aber leider funktioniert es damit nicht. 
Standartdmäßig ist stdout schon auf uart1 zugewiesen.

Habe echt keine ahnung, woran das liegt .....

Hat jemand noch eine idee!?

Greez rubbish
Gast #1458249
Lesenswert?

Ich habe mitlerweile festgestellt, das die Daten in beiden Programmen 
doch ausgegeben werden, jedoch nicht ankommen. Nun liegt die Vermutung 
nahe, das die Baudrate nicht stimmt.
Allerdings habe ich schon längst alle durchprobiert...

Was für ein Fehler kann es sein, wenn der Controller daten sendet (mit 
Oszi gemessen), der Loop mit einer Brücke von Tx und Rx im Sockel 
funktioniert aber im Terminal kommt mit dem Controller nichts an?!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren