Autor |
PIC RS232 geht nicht Suche nach: pic (2056) |
|
|
|
|
BID = 437171
stalky13 Neu hier
Beiträge: 33 Wohnort: Wangerland
|
|
Hi,
Ich würde gerne Daten von meinem Rechner zu einem 18f1320 senden aber irgendwie klappt das noch nicht so richtig ich hab ein Aplictionboard von ner C-control genomen und von dort wo normalerweise die C-Control reingestekt wird gehe ich von RXD auf RXD von meinem PIC mit einem draht. und von TXD auf TXD von meinem PIC das hab ich gemacht weil da schon ein MAX 232 drauf sitzt. diese seite ist in ordnung weil wenn ich ne C-Control anschliese dann empfängt die Daten vom Rechner aber wenn ich meinen PIC anstatt der C-Control anschliese dann passiert nichts.
Der PIC soll später mal eine RGB LED matrix ansteuern mit 100 RGB LEDs
mein Progamm Code in C (ich verwende den C18 Compiler):
/** I N C L U D E S **********************************************************/
#include <p18cxxx.h>
#include "delays.h" // für die Warteschleife
#include "usart.h" // für RS232
/** Configuration ********************************************************/
#pragma config OSC = HSPLL //CPU= 10MHz x 4 = 40MHz
#pragma config PWRT = OFF //Power UP Timer
#pragma config BOR = OFF //Brown Out Reset
#pragma config WDT = OFF //Watchdog Timer
#pragma config LVP = OFF //Low Voltage ICSP
/** D E C L A R A T I O N S **************************************************/
void update(void);
char sortbits(char);
#pragma udata gpr0
unsigned char LED[100]; //Momentaner Status der LEDs
unsigned char LEDbuff[100]; //Ausgabe buffer (für später)
unsigned char lzeiger; //Lese Zeiger
unsigned char szeiger; //Schreib zeiger
unsigned char data; //Daten buffer für RS232 char
/** M A I N **************************************************/
#pragma code
void main(void)
{
LATA = 0x00; //0 in Register A schreiben
LATB = 0x00; //0 in Register B schreiben
TRISA = 0b11111100; //Ausgänge von Register A setzen 0=Matrix Reset 1=Matrix Takt
TRISB = 0b00010000; //Ausgänge von Register B setzen Zustand einer RGB LED 3Farben x 3Zustände (Aus/Hell/Dunkel)
OpenUSART( USART_TX_INT_OFF & //USART Initialisieren
USART_RX_INT_OFF &
USART_ASYNCH_MODE &
USART_EIGHT_BIT &
USART_CONT_RX &
USART_BRGH_HIGH,260 ); //9600 Baud
szeiger = 1; //Zeiger setzen
lzeiger = 1; //Zeiger setzen
while(lzeiger <= 100) //Anfangs muster definieren jede zweite LED ein
{
LED[lzeiger] = 0b11101101;
lzeiger = lzeiger + 2;
}
while(1) //Matrix Zyklus
{
LATAbits.LATA0 = 1; //Matrix reset bit auf 1
lzeiger = 1; //Lese zeiger auf 1
Delay10TCYx(1); //Warten für die Langsamen C-MOS Schieberegister
LATAbits.LATA0 = 0; //Matrix reset bit auf 0
while(lzeiger <= 100) //LED Zyklus
{
LATAbits.LATA1 = 1; //Matrix Takt bit auf 1
LATB = LED[lzeiger]; //LED Zustand setzen
update(); //RS232 Update und warten damit die LED zeit hat zum leuchten
LATAbits.LATA1 = 0; //Matrix Takt bit auf 0
lzeiger = lzeiger + 1; //Lese Zeiger + 1
LATB = 0; //LED Zustand Löschen
} //end LED Zyklus
} //end Matrix Zyklus
} //end main
void update(void) //RS232 Update
{
if DataRdyUSART() //Sind daten im speicher?
{
data = getcUSART(); //ein Byte in den Buffer schreiben (später müssen noch steuerbyts ausgewertet werden)
LED[szeiger] = sortbits(data); //Bits sortieren weil ich zwei ports mitendrin für RS232 brauche
szeiger = szeiger + 1; //Schreib Zeiger + 1
if (szeiger > 100) //Ist Schreibzeiger > 100
szeiger = 1; //Schreibzeiger = 1
}
else //Sind keine Daten im Speicher
Delay100TCYx(12); //Warten 100x12 Zyklen
} //end RS232 Update
char sortbits(char in) //Bits sortieren
{
char out;
if (in&0x01) //Bit 0 nach 0
((out) |= 1);
if ((in>>1)&0x01) //Bit 1 nach 2
((out) |= 1 << (2));
if ((in>>2)&0x01) //Bit 2 nach 3
((out) |= 1 << (3));
if ((in>>3)&0x01) //Bit 3 nach 5
((out) |= 1 << (5));
if ((in>>4)&0x01) //Bit 4 nach 6
((out) |= 1 << (6));
if ((in>>5)&0x01) //Bit 5 nach 7
{
((out) |= 1 << (7));
}
return out; //ergebnis zurück
} //end Bits sortieren
Der PIC befindet sich zum testen auf einer Lochraster platiene da ich für meine PIC und das Aplictionboard zwei verschiedene spannungsversorgungen hab hab ich beide massen verbunden. wenn ich jetz ein byte mit meinem rechner sende dann passiert nichts die funktion DataRdyUSART() gibt immer 0 aus. Die zeilen wo ich den Status meiner LED ins Register schreibe LATB = LED[lzeiger]; und LATB = 0; hab ich auch schon probiert rauszunehmen falls ich die daten an den ports RB1(TXD) und RB4(RXD) überschreibe. bringt aber nix. Was mach ich falsch? ich würde gerne wissen ob mein Programm in ordnung ist oder ob ich was vergessen hab. ich arbeite nämlich erst seit ein paar Tagen mit PICs. Achja ich hab auch noch das Linkerskript geändert weil ich sonst zu wenig RAM für variablen hab könnte das vieleicht daran liegen?
_________________
Und denkt immer daran...
Aus großer Kraft folgt große Verantwortung! |
|
BID = 437260
Racingsascha Schreibmaschine
Beiträge: 2247 Wohnort: Gundelsheim
|
|
Soweit ich weiß kann man in C auch Abschnitte imn Assembler schreiben. Versuch mal damit die RSS232-Abwicklung zu schreiben, so schwer ist Assembler auch nicht. Mir ist es lieber etwas mehr zu schreiben als mir hunderte von Befehlen zu merken. Zusätzliche Variablen sollten auch kein Problem sein, es könnte aber sein das welche nicht Teil des GPR sind sondern in Adressen definiert sind, die eigentlich für etwas anderes gedacht sind, sieh also mal im Headerfile nach ob du deine zusätzlichen Variablen in freien Bytes definiert hast. Wenn ja, definier sie in einer anderen Bank (wenn es sowas bei den 18F.... noch gibt)
_________________
Fnord ist die Quelle aller Nullbits in deinem Computer.
Fnord ist die Angst, die Erleichterung, und ist die Angst.
Fnord schläft nie.
[ Diese Nachricht wurde geändert von: Racingsascha am 17 Jun 2007 19:31 ] |
|
BID = 437512
stalky13 Neu hier
Beiträge: 33 Wohnort: Wangerland
|
Ich hab mir heute mal von reichelt nen max 232 besorgt den werd ich mal mit auf die lochraster platiene löten so das auch wirklich alles auf einem potential ist. und ich werd auch mal das orginal linkerskript wieder verwenden und dann mal sehn obs klappt, komm aber warscheinlich ned heute dazu. Stimmt meine Configuration für USART " USART_BRGH_HIGH,260 );" bei 40MHz für 9600 baud? wie genau mus die zahl sein oder kommt es da auf einen mehr oder weniger nicht an?
_________________
Und denkt immer daran...
Aus großer Kraft folgt große Verantwortung!
|
BID = 437513
Racingsascha Schreibmaschine
Beiträge: 2247 Wohnort: Gundelsheim
|
Die baud-rate muss ziemlich genau sein, da ja kein Takt mit übertragen wird. Toleranz ist glaube ich 5%. Ich kann dir in C leider nicht helfen, da ich nur Assembler kann. Schreib aber testweise vlt ein kleines "Wegwerfprogramm" das alle paar Sekunden oder so ein Zeichen sendet und kuck obs am PC ankommt.
Zitat :
| den werd ich mal mit auf die lochraster platiene löten so das auch wirklich alles auf einem potential ist. |
Daran könnte es tatsächlich gelegen haben, wenn die 2 Drähte nur TxD und eine Statusleitung waren.
_________________
Fnord ist die Quelle aller Nullbits in deinem Computer.
Fnord ist die Angst, die Erleichterung, und ist die Angst.
Fnord schläft nie.
|
BID = 437799
stalky13 Neu hier
Beiträge: 33 Wohnort: Wangerland
|
Also ich hab jetzt die Teile von Reichelt jetzt funktioniert es schonmal zur hälfte. wenn ich ein byte mit meinem pic sende dann kommt das beim rechner an wenn ich aber ein byte mit meinem Rechner sende dann kommt es aber nicht beim pic an. ich binn mir sicher das mein signal richtig am pin vom pic ankommt weil ich da nämlich ne led rangelötet hab und die fleissig blinkt wenn ich daten mit meinem rechner sende. Aber wiso empfängt der nix? selbst wenn ich RXD TXD von meinem pic direkt mit einem draht verbinde funktioniert es nicht. meiner meinung nach kann da ja nurnoch n softwarefehler sein. gibts ned irgendwo n code (am besten in c) der funktioniert?
_________________
Und denkt immer daran...
Aus großer Kraft folgt große Verantwortung!
|
BID = 437811
Racingsascha Schreibmaschine
Beiträge: 2247 Wohnort: Gundelsheim
|
Also bei sprut steht folgendes:
Code : |
RS232in
btfss PIR1,RCIF ; sind Daten da ?
goto RS232in ; nein, noch keine Daten da
movfw RCREG ; RS232-Register auslesen
movwf Zeichen ; und in den Speicher nach 'Zeichen' schreiben |
|
Die Schleife macht folgendes: sie pollt RCIF im PIR1-Register. Wenn das Bit auf 1 liegt, liest sie das Register RCREG aus (das Register in dem die empfangenen Daten liegen) und kopiert den Inhalt in das Register 'Zeichen'. Müsste sich eigentlich recht einfach nach C konvertieren lassen, soweit ich das erkennen kann hast du sowas in der Art auch gemacht. Prüf aber nochmal die Einstellungen im Register RCSTA, könntest ja die Bits manuell setzen durch Bitsetz-Befehle oder durch einschreiben eines Wertes in das entsprechende Register. vlt hast du da einen Fehler gemacht.
_________________
Fnord ist die Quelle aller Nullbits in deinem Computer.
Fnord ist die Angst, die Erleichterung, und ist die Angst.
Fnord schläft nie.
[ Diese Nachricht wurde geändert von: Racingsascha am 19 Jun 2007 22:38 ]
|
BID = 437953
stalky13 Neu hier
Beiträge: 33 Wohnort: Wangerland
|
Der befehl DataRdyUSART() macht ja nix anderes als das bit im register PIR1 auszugeben. Ich hab aber auch irgendwie probleme damit meine ports eizulesen. Ich definiere (im TRISB register) RB1 als ausgang und RB4 als eingang und lasse RB1 togglen, RB1 und RB4 habe ich gebrückt, und lese das register LATB aus und setze RA0 (natürlich vorher auch als ausgang definiert) den zustand von RB4 ... RB4 is irgendwie immer null. oder muss ich die zustände der eingänge irgendwie anders auslesen?
ps ich versuch morgen mal die bits der beiden register für USART von habd zu setzten hab heute keine zeit mehr.
_________________
Und denkt immer daran...
Aus großer Kraft folgt große Verantwortung!
[ Diese Nachricht wurde geändert von: stalky13 am 20 Jun 2007 20:19 ]
|
BID = 437962
Racingsascha Schreibmaschine
Beiträge: 2247 Wohnort: Gundelsheim
|
die TRISx register sind für die Einstellung ob ein Pin Eingang oder Ausgang ist, sinnvollerweise beschreibt man die nur. Die PORTx Register sind die Zustände der Pins. Durch schreiben auf diesen Port kannst du den Zustand der als Ausgang definierten Pins bestimmen, durch auslesen nimmst du die Pegel der Eingänge auf. Wie das mit LATx ist weiß ich nicht, Sprut liefert die Antwort: Bei der Entwicklung der PIC18Fxxxx-Typen hat man dem Problem Rechnung getragen. Wenn man das Port auslesen will, so kann man das jetzt auf zwei verschiedene Weisen machen. Ein Lesen von PORTX (z.B. PORTA oder PORTB) liest den Pegel der Port-Pins, wie es auch bisher üblich war. Man kann aber nun auch von LATX (z.B. LATA oder LATB) lesen. Ein Zugriff auf LATX ist ein Zugriff auf das Portregister, und nicht auf die Pins.
Fazit: probiers mal mit den PORTx Registern. Wenns klappt gut, wenn nicht bin ich am Ende meines Lateins
_________________
Fnord ist die Quelle aller Nullbits in deinem Computer.
Fnord ist die Angst, die Erleichterung, und ist die Angst.
Fnord schläft nie.
|
BID = 438172
stalky13 Neu hier
Beiträge: 33 Wohnort: Wangerland
|
also mit PORTB gehts trotzdem läuft mein BUS noch ned
verdamt nochmal ich kann doch ja ned zu löd sein son popeligen Seriellen BUS aufzubaun ... ich werd mal nen anderen compiler ausprobieren vileicht von CCS dazu gibts zumindes n tutorial.
_________________
Und denkt immer daran...
Aus großer Kraft folgt große Verantwortung!
|
BID = 438185
stalky13 Neu hier
Beiträge: 33 Wohnort: Wangerland
|
es funzt *freu*
Ich hab mir mal das datenblatt von meinem pic n bissl genauer angesehn und auf seite 133 steht:
Zitat :
| The RB1/AN5/TX/CK/INT1 and RB4/AN6/RX/DT/KBI0
pins must be configured as follows for use with the
Universal Synchronous Asynchronous Receiver
Transmitter:
• SPEN (RCSTA<7>) bit must be set ( = 1),
• PCFG6:PCFG5 (ADCON1<5:6>) must be set ( = 1),
• TRISB<4> bit must be set ( = 1) and
• TRISB<1> bit must be set ( = 1). |
ADCON1 bit 5 und 6 auf 1 gesetzt und schon gehts
oh mann und ich hab mir tagelang den kopf zerbrochen... hätt ich da mal ehr reingesehn. Ich weis blos ned was dies REgister macht ist mir aber ehrlichgesagt zimlich egal haupsache meine komunikation funzt
_________________
Und denkt immer daran...
Aus großer Kraft folgt große Verantwortung!
|
BID = 438341
Racingsascha Schreibmaschine
Beiträge: 2247 Wohnort: Gundelsheim
|
Mit dem Register müsstest du die Pins als Eingänge des AD-Wandlers konfigurieren bzw diesen deaktivieren können.
freut mich dasses klappt dann leg mal los.
_________________
Fnord ist die Quelle aller Nullbits in deinem Computer.
Fnord ist die Angst, die Erleichterung, und ist die Angst.
Fnord schläft nie.
|
BID = 438363
stalky13 Neu hier
Beiträge: 33 Wohnort: Wangerland
|
jepp finds auch voll toll das es endlich klappt ich werd mich nochmal melden wenn mein projekt solangsam form angenommen hat.
_________________
Und denkt immer daran...
Aus großer Kraft folgt große Verantwortung!
|