Forum: Mikrocontroller und Digitale Elektronik PIC printf funktioniert nicht.


von rubbish (Gast)


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!!

von Master S. (snowman)


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?)

von Star K. (starkeeper)


Lesenswert?

Ich rate dir mal die Anleitung deines Kompilers zu lesen. Dort wird 
sicherlich stehen, dass du neben einem Heap auch diverse Funktionen 
implementieren musst, um die C-Lib verwenden zu können.

von rubbish (Gast)


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
}

von Lui S. (lute)


Lesenswert?

Hi,

ich hatte mal ein ähnliches Problem, es war allerdings ein PIC 18F4525 
und MPLAB IDE 7.51.

Der PIC hat keine Zeichen gesendet und ich musste die Zeile

stdout = _H_USART;

nach der Initialisierung des USART einfügen, dann konnte ich printf 
verwenden.

Gruß, Lui

von rubbish (Gast)


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

von rubbish (Gast)


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?!

von tom (Gast)


Lesenswert?

setz für BRGVAL=767 ein.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.