www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PIC printf funktioniert nicht.


Autor: rubbish (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
#include "p30fxxxx.h"
#include <stdio.h>
#include <uart.h>



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



int main (void)
{
  //U1BRG = 0x00BE; // 9600 baud
  //U1MODEbits.PDSEL = 0;
  //U1MODEbits.STSEL = 1;
      
  while (1)              
        {          
  printf("test");      
        }
  return 0;
}



wäre echt cool, wenn mir jemand helfen könnte!!

Autor: Master Snowman (snowman)
Datum:

Bewertung
0 lesenswert
nicht 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?)

Autor: Star Keeper (starkeeper)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: rubbish (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
#include "p30F4012.h"
#include <stdio.h>
#include <uart.h>

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

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


int main(void)
{

  ADPCFG = 0xFF;      //Make analog pins digital 

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

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


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


  _U1RXIF=0;          // Clear UART RX Interrupt Flag


  while(1)
  {

               //printf("TEST");

    while(!U1STAbits.TRMT);    
    U1TXREG = 'H';
  
    while(!U1STAbits.TRMT);
    U1TXREG = 'a';
        }
}
return 0;
}


void __attribute__((interrupt, no_auto_psv)) _T1Interrupt(void)
{
  IFS0bits.T1IF = 0;    // clear interrupt flag
  
  LATE ^= 0xF;      //Toggle LED's
}

Autor: Lui S. (lute)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: rubbish (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: rubbish (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?!

Autor: tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
setz für BRGVAL=767 ein.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.