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