www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem mit PIC und Bluetoothmodul


Autor: Manusi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!!

Seit Wochen versuch ich mich an einer eigenen Schaltung.
Ich arbeite mit einem PIC18F45K20 und einem BlueMod  Modul von Stollman.
(Das ganze programmier ich mit MPLAB und dem C18.Compiler)
Ziel ist es dass ich über den PIC eine Zeichenkette abschicke und die 
dann über Bluetooth empfangen werden kann (das ganze kann ich über ein 
Terminal beobachten)
Leider funktioniert GAR NICHTS.
Der BlueMod nimmt nichteinmal meine Befehle auf. Zwar kann ich den 
BlueMod auf dem PC sehen und mich mit ihm verbinden, doch funktioniert 
das rein zufällig. Alle Befehle den ich an ihn schicke werden gar nicht 
aufgenommen.
Ich hab schon mir alles erdenkliche ausprobiert.
Anbei schick ich meinen Code.

Als erstes hab ich es über I2C versucht:
/** C O N F I G U R A T I O N   B I T S ******************************/

#pragma config FOSC = INTIO67, FCMEN = OFF, IESO = OFF                      // CONFIG1H
#pragma config PWRT = OFF, BOREN = SBORDIS, BORV = 30                       // CONFIG2L
#pragma config WDTEN = OFF, WDTPS = 32768                                   // CONFIG2H
#pragma config MCLRE = OFF, LPT1OSC = OFF, PBADEN = ON, CCP2MX = PORTC      // CONFIG3H
#pragma config STVREN = ON, LVP = OFF, XINST = OFF                          // CONFIG4L
#pragma config CP0 = OFF, CP1 = OFF, CP2 = OFF, CP3 = OFF                   // CONFIG5L
#pragma config CPB = OFF, CPD = OFF                                         // CONFIG5H#pragma config EBTRB = OFF                                                  // CONFIG7H


#include <p18f45k20.h>
#include <sw_i2c.h>
#include <delays.h>
#include <stdio.h>
#include <sw_uart.h>
#include <usart.h>

#define  DATA_LOW   TRISCbits.TRISC4 = 0; // define macro for data pin output
#define  DATA_HI    TRISCbits.TRISC4 = 1; // define macro for data pin input
#define  DATA_LAT   LATCbits.LATC4        // define macro for data pin latch
#define  DATA_PIN   PORTCbits.RC4         // define macro for data pin

#define  CLOCK_LOW  TRISCbits.TRISC3 = 0; // define macro for clock pin output
#define  CLOCK_HI   TRISCbits.TRISC3 = 1; // define macro for clock pin input
#define  SCLK_LAT   LATCbits.LATC3        // define macro for clock pin latch
#define  SCLK_PIN   PORTCbits.RC3         // define macro for clock pin0


unsigned char result;


#pragma code
void main(void)
{

//get current address
SWStartI2C();
SWPutcI2C( 0xA1 );
SWAckI2C();
printf("" + SWAckI2C());
SWGetcI2C();
SWStopI2C();

  //make BlueMod visible + settings
SWStartI2C();
SWPutcI2C("ATS301=BlueMod+B20");  //Anzeigenahme = BlueMod+B20
SWRestartI2C();
SWPutcI2C("ATS350=SPP");      //Local Service Name for SPP: SPP
SWRestartI2C();
SWPutcI2C("ATS323=9600");      //Set baud rate to 9600 bps
SWRestartI2C();
SWPutcI2C("ATS324=8");        //Use 8 data bits
SWRestartI2C();
SWPutcI2C("ATS325=1");        //One stop bit
SWRestartI2C();
SWPutcI2C("ATS326=0");        //No parity
SWRestartI2C();
SWPutcI2C("ATS316=3");        //Page scan and inquiry scan are enabled; the BlueMod+B2x is connectable and discoverable
SWStopI2C();


  //Connection-Profil
  SWStartI2C();
  SWPutcI2C("ATA");        //Accept incomming call
  SWRestartI2C();
  SWPutcI2C("AT&C0");        //DCD always on
  SWRestartI2C();
  SWPutcI2C("ATS319=1");      //Authentication for Incoming Connections
  SWStopI2C();

  //send string "Hallo"
  SWStartI2C();
SWPutcI2C("Hallo");
  SWStopI2C();

} 






Und dann auch über UART:

/** C O N F I G U R A T I O N   B I T S ******************************/

#pragma config FOSC = INTIO67, FCMEN = OFF, IESO = OFF                      // CONFIG1H
#pragma config PWRT = OFF, BOREN = SBORDIS, BORV = 30                       // CONFIG2L
#pragma config WDTEN = OFF, WDTPS = 32768                                   // CONFIG2H
#pragma config MCLRE = OFF, LPT1OSC = OFF, PBADEN = ON, CCP2MX = PORTC      // CONFIG3H
#pragma config STVREN = ON, LVP = OFF, XINST = OFF                          // CONFIG4L
#pragma config CP0 = OFF, CP1 = OFF, CP2 = OFF, CP3 = OFF                   // CONFIG5L
#pragma config CPB = OFF, CPD = OFF                                         // CONFIG5H#pragma config EBTRB = OFF                                                  // CONFIG7H


#include <p18f45k20.h>
#include <sw_i2c.h>
#include <delays.h>
#include <stdio.h>
#include <sw_uart.h>
#include <usart.h>


#define SWTXD PORTC
#define SWTXDpin 6
#define TRIS_SWTXD TRISC

#define SWRXD PORTC
#define SWRXDpin 7
#define TRIS_SWRXD TRISC

#pragma code
void main(void)
{

OpenUART();

  //make BlueMod visible + settings
putcUART("ATS301=BlueMod+++");    //Local Device Name = BlueMod+B20
putcUART("ATS350=SPP_1");        //Local Service Name for SPP: SPP
putcUART("ATS323=9600");      //Set baud rate to 9600 bps
putcUART("ATS324=8");        //Use 8 data bits
putcUART("ATS325=1");        //One stop bit
putcUART("ATS326=0");        //No parity
putcUART("ATS316=3");        //Page scan and inquiry scan are enabled; the BlueMod+B2x is connectable and discoverable

  //Connection-Profil
  putcUART("ATA");        //Accept incomming call
  putcUART("AT&C0");        //DCD always on
  putcUART("ATS319=1");      //Authentication for Incoming Connections


putsUART("Test");


}



// The following delays are for use by the software UART routines
void DelayTXBitUART()
{
// delay for: ((((2*FOSC/(4*baud))+1) / 2) - 12 cycles
// = ((((2*16000000 / (4*4800)) + 1) / 2) - 12
// = 821 cycles @ 16mhz, 4800 baud
Delay10TCYx(82);
}

void DelayRXHalfBitUART()
{
// delay for: ((((2*FOSC/(8*baud))+1) / 2) - 9 cycles
// = ((((2*16000000 / (8*4800)) + 1) / 2) - 9
// = 408 cycles @ 16mhz, 4800 baud
Delay10TCYx(40);
}

void DelayRXBitUART()
{
// delay for: ((((2*FOSC/(4*baud))+1) / 2) - 14 cycles
// = ((((2*16000000 / (4*4800)) + 1) / 2) - 14
// = 819 cycles @ 16mhz, 4800 baud
Delay10TCYx(82);
} 


Ich weiss wirklich nicht mehr weiter, das ganze ist für ein Praktikum 
und mein Betreuer kann mir leider auch nicht mehr weiter helfen.
Hoffe hier sieht jemand den Fehler =/
Vielen Dank schonmal im Voraus!!

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Um den Fehler einzugrenzen würde ich dir raten das BT-Modul erst einmal 
via RS232 über einen PC (z.B. via Hyperterminal) anzusteuern, 
Pegelwandler natürlich nicht vergessen. Damit kannst du überprüfen, ob 
die einzelnen Kommandosequenzen vom Modul überhaupt akzeptiert werden. 
Übrigens, müssten die einzelnen Kommandos nicht jeweils mit <CR> beendet 
werden?

Autor: Harald (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das sehe ich auch so. Das fehlende Enter (und evtl. auch Linefeed, siehe 
Datenblatt) pro Kommando dürfte das Hauptproblem sein.

Autor: Manusi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Super, danke für die schnellen Antworten!!
das <CR> hatte ich am Anfang auch drinnen, habs zum Test auch mal 
rausgenommen und dann so gelassen da es keine Änderungen gab... daran 
liegt es leider also nicht :(

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bitte richte dich unbedingt nach dem Datenblatt des Moduls. Wenn dort 
ein <CR> verlangt wird, dann musst du es auch mitschicken. Bei solchen 
komplexeren Projekten ist es völlig normal, daß man am Anfang mehrere 
Fehler gleichzeitig eingebaut hat. Du kannst dann einen Fehler beheben 
und es geht immer noch nichts, daraus zu schliessen das die Änderung 
deswegen aber keinen Einfluß hat ist dann aber auch verkehrt. Ein 
planloses rumprobieren führt garantiert nicht zum Ziel.

Autor: Andreas G. (beastyk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin Leute,

ich kenn mich jetzt nicht mit dem Modul usw. aus aber sollte nicht der 
ATA Befehl der letzte in der Befehlsfolge sein?
Im Handbuch steht dazu folgender Absatz:

AT syntax: ATA
This command accepts an incoming call if automatic call acceptance is 
not set
(Register S0=0). An incoming call is always signaled with the 
unsolicited response
“RING“ or code “2“, even if automatic call acceptance is selected.

Note: Must be the last command in an AT command line.

Es gibt auch mehrere Module bei Stollman, welches ist es denn genau?

Kann man die Delay-Zeiten etwas großzügiger gestalten (ich weiß nicht ob 
man das einfach so darf, hier sind erfahrene Leute gefragt!)

Gruß
Andi

Autor: Mutlos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich denke mal es handelt sich um das BlueMod B20.
Habe ähnliche Erfahrungen mit dem Modul gemacht..

Autor: Mutlos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
übrigens:

"Note: Must be the last command in an AT command line."

bezieht sich nicht auf das ATA Kommando sondern auf das ATZ Kommando

Autor: Mutlos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hier mein bisheriger Erfolg, der bei mir funktioniert:
delay_ms(1300, clocks.cpu_f); // ~1,3s warten bis Gerät nach einschalten reagiert (Datenblatt)

usart_write_line(BLUETOOTH, "ATS301=Bluemodder\r");  // Gerätename setzen
usart_write_line(BLUETOOTH, "AT&W\r");  // Speichern
usart_write_line(BLUETOOTH, "ATZ\r");   // Konfiguration laden
delay_ms(400, clocks.cpu_f);         // warten
usart_write_line(BLUETOOTH, "ATS318=1250\r");  // Neue Pin setzen
usart_write_line(BLUETOOTH, "AT&W\r");
usart_write_line(BLUETOOTH, "ATZ\r");
delay_ms(400, clocks.cpu_f);
usart_write_line(BLUETOOTH, "ATS350=Serialport\r");  // Serialportname setzen
usart_write_line(BLUETOOTH, "AT&W\r");
usart_write_line(BLUETOOTH, "ATZ\r");

Autor: Manusi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Genau, es handelt sich um den BlueMod B20.

@Mutlos:
Was für einen Compiler benutzt du?? Bei mir sind die Befehle 
"usart_write_line...." gar nicht aufgeführt :S
Ich versuchs dann mal mit so einem ähnlichen Aufbau bei meinem Programm!

Autor: Mutlos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ist normal gcc

usart_write_line macht bei mir nichts anderes als ein putchar

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.