mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Microchip PIC18F und ESP8266 Verbinden/einrichten


Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich bin grad dabei einen PIC18F µC von Microchip über MPLAB X zu 
programmieren. Soweit so gut, dies klappt mit dem pickit3 alles 
wunderbar bisher.

Nun möchte ich mein kleines Projekt mit einem WLAN Modul erweitern. Hier 
wollte ich eigentlich auch auf microchip zurück greifen, allerdings 
bestanden überall lieferschwierigkeiten.
Weshalb ich bei dem kleinen und günstigen ESP8266 gelandet bin. Nun habe 
ich diesen und dieser soll über UART mit dem PIC kommunizieren.

Jetzt stehe ich allerdings vor dem Problem das ich nicht so recht weiß 
wie ich den ESP8266 mit dem pickit3 ansprechen soll bzw. diesen 
einrichte.

Kann mir hier jemand einen Tipp geben wie ich nun am besten vorgehe?

Gruß und Danke schon einmal

Autor: Stefanus F. (stefanus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Weshalb ich bei dem kleinen und günstigen ESP8266 gelandet bin.

Sicher hast du nicht nur einen ESP822Chip vorliegen, sondern ein ganzes 
Modul dass auch einen Namen hat.

Zum den ESP8266 basierten Modulen findest du im Internet reichlich 
Bastelanleitungen.

Für das ESP-01 Modul brauchts du ein Netzteil und einen 3,3V 
Spannungsregler, die für mindestens 500mA ausgelegt sind. Denn so viel 
braucht das Ding zeitweise. Es hat sich bewährt, dem ESP Modul einen 
eigenen Spannungsregler vom Typ LF33CV zu spendieren und ganz nahe zum 
Modul einen zusätzlichen 100µF (oder 220µF) Elko an VCC und GND.

Die seriellen Leitungen RxD und TxD verbindest du mit dem PIC, der 
idealerweise auch mit 3,3V betrieben wird.

Wenn er PIC mit 3,3V betrieben wird, dann müssen alle Leitungen, die vom 
PIC zum ESP Chip gehen, einen Pegelwandler enthalten. Die umgekehrte 
Richtung (vom ESP zum OIC) kann direkt verbunden sein.

Bis zu 115200 eigent sich ein simpler Spannungsteiler als Pegelwandler:
           1,5k
5V Tx o---[===]----+------o Rx ESP
                   |
                  |~|
                  |_| 2,2k
                   |
GND o--------------+------o GND

 Rx o---------------------o Tx

Auf der Webseite von Espressiv findest du ein PDF mit dem 
AT-Befehlssatz. Du solltest das Modul erstmal über einen USB-UART 
Adapter mit dem PC verbinden und dich mit dem AT-Befehlssatz und den 
Eigenarten des Moduls vertraut machen.

: Bearbeitet durch User
Autor: Volker SK (vloki)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan U. schrieb:
> Wenn der PIC [NICHT] mit 3,3V betrieben wird, dann müssen alle Leitungen,
> die vom PIC zum ESP Chip gehen, einen Pegelwandler enthalten. Die
> umgekehrte Richtung (vom ESP zum OIC) kann direkt verbunden sein.

Sicher, dass das mit dem direkt verbinden funktioniert? Bei mir gab das 
immer Probleme wenn der PIC 5 Volt Versorgung hat und die Signale mit 
3,..V ankommen. Der PIC18 RX Pin hat Schmidt-Trigger Logik und der Pegel 
soll laut Datenblatt >= 0.8*Vdd also mindestens 4V haben...

Jens schrieb:
> Jetzt stehe ich allerdings vor dem Problem das ich nicht so recht weiß
> wie ich den ESP8266 mit dem pickit3 ansprechen soll bzw. diesen
> einrichte.
Stefan hat es nicht explizit erwähnt, aber der ESP hat mit dem PICkit 
gar nichts zu tun. (nur mit dem PIC, bzw. dessen Firmware)

: Bearbeitet durch User
Autor: Stefanus F. (stefanus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh ja, ich habe das Wort NICHT vergessen.

Die Signale vom PIC müssen durch den Spannungsteiler auf 3,3V 
herabgesetzt werden.

Anders herum:
> Der PIC18 RX Pin hat Schmitt-Trigger Logik ...
> laut Datenblatt >= 0.8*Vdd

Hmm, das habe ich übersehen.

Dann muss man da wohl doch einen "richtigen" Pegelwandler einfügen. Das 
ist ja blöd.

: Bearbeitet durch User
Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm, danke erstmal für die Aufklärung und ja es ist nen ESP-01 Modul :D

Den PIC betreibe ich aktuell mit 3,3V.

Die Lösung mit dem Pegelwandler gefällt mir nicht so recht, nun bin ich 
am überlegen evtl. doch auf ein Wifi-modul von Microchip (wie auch der 
PIC) zu kaufen und es damit umzusetzen, da ich vermute das ich mir 
hiermit dann evtl. auch ein wenig arbeit erspare.

Was meint ihr?

Gruß

Autor: Stefanus F. (stefanus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Den PIC betreibe ich aktuell mit 3,3V.

Ja dann ist doch alles in Butter, dann brauchst du keinen Pegelwandler.

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja gut, dennoch weis ich noch nicht wie ich nun das ESP-01 Modul 
anspreche bzw einrichte, da ich ja nach wie vr nur den pickit3 als 
programmer habe :/ . Ich find im Netz irgendwie nur Beispiele mit nem 
Arduino/Atmel µC.

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was mit nun auch aufgefallen ist, das mein PIC18F26K22 kein TX/RX hat :(

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auf deinem esp8266 modul ist mehr als nur ein wlan-chip vorhanden, da 
ist ein ganzer mikrocontroller oben und noch viel mehr.
Wie du das handlest hängt davon ab wie komplex deine Anwendung ist, 
erklär das mal ein bisschen dann helf ich dir im Detail weiter.
 Mit der Standardfirmware kannst du dem modul über uart solche 
AT-Befehle senden, die das Modul konfigurieren.
Wenn du diese AT-Befehle nicht verwenden willst bzw. etwas komplexeres 
vor hast, ist im Moment die beste Vorgehensweise, dass du dir die 
Arduino IDE mit esp-Erweiterung runterlädst, siehe z.b hier:
https://arduino-hannover.de/2015/04/08/arduino-ide...
Dann kannst du über usb auf rs232/uart den mikrocontroller am modul ganz 
normal in c programmieren.
Wenn du eine Standardanwendung hast brauchst du gar keinen externen PIC, 
das modul ist mit glaub 80 MHz getaktet dass ist eigtl. recht schnell.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jens schrieb:
> Was mit nun auch aufgefallen ist, das mein PIC18F26K22 kein TX/RX hat :(

Nein du hast nicht 1x Tx/Rx sondern sogar 2 EUSART-Module auf dem Chip. 
Schon mal ins Datenblatt geschaut?

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also kurz zu dem worauf es eigentlich hinauslaufen soll am ende.

Über eine Weboberfläche soll mittels eines Button etwas geschaltet 
werden, für den reinen Anfang nehm ich hier eine LED.
Diese LED kann ich aktuell über einen Taster an und aus Schalten. Das 
ganze hab ich mit MPLAB X über den Pickit3 auf den µC geschoben und der 
pickit3 versorgt den µC auch komplett mit spannung zur Zeit.

Nun soll an meinen PIC18F26K22 das ESP Modul gehangen (erste Überlegung 
war kommunikation via UART), dieses habe ich vor dann einzurichten und 
ins WLAN zu hängen und dann vom PC aus zu steuern.

Bin im moment wirklich über jede Hilfe dankbar.

Autor: peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ebay-Artikel Nr. 172346314000
Kauf dir das Ding und du bist deine Sorgen los.

Steuere meinen Roboter damit.

Brauchst nur noch RX und TX zum Micro.
Für  RX ESP brauchts du den simplen Spannungsteiler und TX läuft bei dir 
auch mit 3,3 Volt.

Gruss

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
peter schrieb:
> Ebay-Artikel Nr. 172346314000
> Kauf dir das Ding und du bist deine Sorgen los.


Das Hilft mir leider wenig.
Hintergrund, es existiert ein PIC welcher zur Zeit mittels Bluetooth 
ansteuert wird um etwas zu schalten. Nun hab ich die Aufgabe das 
vorhandene eben mit WLAN zu erweitern.

Autor: Frank M. (ukw) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jens schrieb:
> Über eine Weboberfläche soll mittels eines Button etwas geschaltet
> werden, für den reinen Anfang nehm ich hier eine LED.

Also erstmal zum ESP8266 ESP-01: Die darauf enthaltene Firmware kannst 
Du mit AT-Befehlen steuern. Dokumentation dazu gibts im Internet zuhauf. 
Dabei arbeiten bzw. reagieren diese Module je nach Firmware-Version 
anders, da mit jeder Version bestimmte Befehle geändert, erneuert, 
ersetzt, gestrichen wurden. Auf deutsch: Die Firmware ist einfach 
scheiße und Du kannst Dich auf das Verhalten mit dem Modul X nicht 
verlassen. Willst Du in einem halben Jahr Dein "Gerät" nochmal bauen und 
Du kaufst Dir wieder einen ESP8266 ESP-01, ist da eine ganz andere 
Software drauf und Du wunderst Dich, dass dieses Ding nicht mehr so 
arbeitet wie beim ersten Mal.

Fazit:

Es muss eine eigene Firmware für den ESP8266 her. Da die ESP8266-Module 
sehr üppig mit Ressourcen wie Flash und RAM ausgestattet ist, kommt 
natürlich der Gedanke: "Wenn ich den ESP8266 schon mit eigener SW 
ausstatten muss, warum brauche ich dann noch den PIC?!?". Genau! Also 
weg damit.

Die eine LED kannst Du locker mit dem ESP8266 ESP-01 direkt bedienen. 
Wenn Du mehr I/Os brauchst, nimmst Du halt den ESP-12F. Den gibts bei 
Watterott für eine Handvoll Euro und Du hast ihn nach 2 Tagen.

Wenn Du nun aber meinst: "Ich will aber einen PIC!", dann schreibe ein 
eine Firmware für den ESP und ein eigenes Kommunikationsprotoll, damit 
Du mit dem PIC Befehle an den ESP-01 schicken kannst. Vielleicht hast Du 
dann Deine LED in einem halben Jahr am Leuchten.

: Bearbeitet durch Moderator
Autor: Stefanus F. (stefanus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Möglicherweise kann er aber auch damit leben, dass in Zukunft verkaufte 
ESP-01 Module einen anderen Befehlssatz haben.

Für ein einzelnes Produkt in Handarbeit würde ich mir einfach eins 
Ersatzteil auf Vorrat legen und gut ist.

: Bearbeitet durch User
Autor: peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
--------------------
Das Hilft mir leider wenig.
--------------------

Der ist doch für WLAN.
Du hast kein Ärger mehr mit dem Flashen , geht einfach über MIni-USB , 
hast  kein Spannungszusammenbruch , kannst da 7-20 Volt anschliessen....

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
für so eine Anwendung eines Webservers mit dem man eine Led toggeln kann 
gibt es sogar von arduino ein fertiges demoprogramm für das esp-modul. 
Schau dir das was ich vorher gepostet habe einfach mal an, mit dem geht 
das wirklich am einfachsten da brauchst da um vieles keine Gedanken 
machen.

Autor: Stefanus F. (stefanus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erste Schritte für den AT-Befehlssatz des ESP-01 oder ESP-12 Moduls:

Verbinde das Modul mit einem PC und starte dort ein Terminalprogramm 
(z.B. Hammer Terminal).

Finde mit dem "AT" Befehl heraus, welche Baudrate das Modul hat. Im 
Erfolgsfall antwortet es mit "OK".

Versuche 115200, 57600 und 9600 Baud, 8 Datenbits, ein Stopbit, keine 
Parität, keine Flußkontrolle. Bei den meisten Firmware Versionen müssen 
Zeilen mit CR+LF abgeschlossen werden. Es gibt aber auch ein paar uralte 
Module im Umlauf, wo es nur ein CR sein darf.

Falls die baudrate 9600 ist, versuche sie zu erhöhen. Je nach Firmware 
Version sollte das mit einem der folgenden Befehle gehen:

AT+UART_DEF=115200,8,1,0,0
AT+UART=115200,8,1,0,0
AT+CIOBAUD=115200
AT+IPR=115200

Konfiguriere die WLAN Verbindung:

AT+CWMODE=1
AT+RST
AT+CWJAP="MyWlanSSID","password"
AT+CIFSR

Der letzte Befehl sollte die IP-Adresse melden, die das Modul vom DHCP 
Service deines WLAN Routers erhalten hat. Die WLAN Einstellungen werden 
sofort dauerhaft gespeichert und gelten automatisch beim nächsten 
Neustart.

Starte den IP-Server auf dem WLAN Modul:

AT+CIPMUX=1
AT+CIPSERVER=1,23   (23 ist eine beliebige Portnummer)

Diese beiden Befehle musst du nach jedem Neustart erneut absetzen.

Baue eine Netzwerk-Verbindung zum Modul auf (zum Testen empfehle ich das 
Programm Netcat). Dazu brauchst du dessen IP Adresse und die gerade 
eingestellte Portnummer. Befehl: nc 192.168.2.123 23

Das Modul meldet dann im seriellen Terminal, dass es eine neue 
Verbindung angenommen hat. Wenn du nun über Netzwerk (mit Netcat) etwas 
an das WLAN Modul sendest, wirst du am seriellen Port (in Hammer 
Terminal) eine entsprechende Meldung sehen. Für jedes empfangene Paket 
wird eine Verbindungnummer, die Anzahl der Bytes und die Empfangenen 
Bytes erscheinen.

Wenn du Daten vom seriellen Port (Mikrocontroller) an eine 
Netzwerkverbindung senden willst, gib das ein:

AT+CIPSEND=<Verbindungsnummer>,<Anzahl-Bytes>
Datenbytes

Also zum Beispiel:

AT+CIPSEND=1,5
Hallo

Hier musst du die Nummer der Verbindung eingeben, die das Modul gemeldet 
hat, als es die Netzwerk-Verbindung angenommen hat. Nach der Anzahl der 
Bytes kommt ein Zeilenumbruch, dann die Nutzdaten (ohne abschließenden 
Zeilenumbruch).

Alle ESP Firmware Versionen können 1024 Bytes am Stück senden, manche 
können auch etwas mehr. Mit 1024 Bytes bist du jedoch auf der sicheren 
Seite.

Diese Befehle funktionieren soweit ich weiß mit allen Versionen der 
AT-Firmware, die bisher im Umlauf waren.

Zum Firmware-Upgrade: Beachte dass halbwegs aktuelle Firmware Versionen 
einen Programmspeicher-Chip mit 8Mbit oder mehr voraussetzen. Es werden 
aber immer noch ESP-01 Module mit nur 4Mbit verkauft (erkennt man am 
Aufdruck mit Ziffer 4 oder 8).

Wenn du mit der vorhandenen Firmware klar kommst, dann bleibe dabei. 
Firmware Upgrades sind ein bisschen riskant.

: Bearbeitet durch User
Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dazu bräuchte ich dann erstmal einen usb --> FTDI Converter, richtig?

Autor: Stefanus F. (stefanus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja richtig. Sollte man ohnehin immer in der Bastelkiste liegen haben.

Das ist billiger, als FTDI und tut's auch.
https://www.amazon.de/PL2303HX-RS232-Kabel-Modul-C...

Wenn du Windows 8 oder 10 verwendest, musst du bei den PL2303 Chips 
aufpassen. Einige Hardware-Versionen dieses Chips werden von dem Treiber 
nicht unterstützt. Auf der Download-Seite des Treibers 
(http://www.prolific.com.tw/US/ShowProduct.aspx?p_i...) 
findest du einen entsprechenden Hinweis.

Bei Windows XP, Windows 7, Mac OS und Linux spielt die Chip-Version 
keine Rolle.

: Bearbeitet durch User
Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So
Kommunikation mit den AT befehlen hat super geklappt.

Hab mir nun noch einen FT232 besorgt und damit einiges hinbekommen.

Jetzt kann ich über eine Website eine LED an bzw. aus Schalten, noch 
dazu kann ich seriell mit ner baudrate von 9600 die signale an bzw aus 
empfangen.

Soweit so gut, nun aber will ich den PIC wieder ins spiel bringen, 
dieser hat mehrere LEDs (rein zum test) und diese möchte ich nun über 
UART ansprechen. Zumbeispiel mit den Zeichenkette LED1AN bzw. LED1AUS

Nun tuhe ich mich wieder schwer diesen einzubringen. In der Theorie 
brauch ich nur die TX (am ESP) und die RX (am PIC) Leitung anschließen 
da der PIC keine Rücksignale sendet.
Hat jemand eine gute Quelle wo gut erklärt wird, wie ich die UART 
Kommunikation am PIC aktiviere?

Autor: Volker SK (vloki)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jens schrieb:
> Hat jemand eine gute Quelle wo gut erklärt wird, wie ich die UART
> Kommunikation am PIC aktiviere?

http://www.hs-ulm.de/users/vschilli/Mikrocontrolle... 
10.1 RS232 / COM-Port (auch virtuell über USB oder BT )

Ob gut erklärt muss der jeweilige Leser entscheiden. Vielleicht hilft 
es.

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat auf jeden fall schon mal ein paar erkenntnisse gebracht.


nun hab ich ein Problem was ich mir nicht erklären kann bei dem pic

Also er hat gearbeitet wie er soll und von jetzt auf gleich ohne das ich 
was gemacht hat er seine arbeit eingestellt.
Ich kann neue files drauf laden aber er macht einfach garnichts mehr

Ich hab es auch mit nen ganz simplen programm was nur eine LED blinken 
lassen soll versucht, macht einfach nicht mehr :(

Hat der nun aufgegeben? kann ich das irgendwie prüfen?

Autor: Volker SK (vloki)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jens schrieb:
> Hat der nun aufgegeben? kann ich das irgendwie prüfen?

Benutzt du das PICkit3 als Debugger oder nur als Programmiergerät?
(Wenn bisher nur als Programmiergerät, dann würde ich empfehlen den 
Blindflug zu beenden...)

Autor: Wolfgang (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jens schrieb:
> Das Hilft mir leider wenig.
> Hintergrund, es existiert ein PIC welcher zur Zeit mittels Bluetooth
> ansteuert wird um etwas zu schalten.

Dann nimm einen IO-Pin von deinem PIC, verbinde den mit einem IO-Pin vom 
ESP8266 und du hast die Vorgabe "Steuerung über PIC" erfüllt ;-)

Da muss man mal flexibel sein.

Autor: Dieter Werner (dds5)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie wird denn der Takt für den PIC erzeugt? Vielleicht da schon der 
Fehler.

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dieter W. schrieb:
> Wie wird denn der Takt für den PIC erzeugt? Vielleicht da schon
> der
> Fehler.

Intern

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nach ner kleinen pause habe ich nun weiter gemacht.

Nachdem es mit dem PIC18F26K22 mit der UART initialisierung überhaupt 
nicht klappen wollte, hab ich mit einen PIC18F4550 geliehen.

Nun zum bisherigen Stand. Ich habe den ESP8266 (ESP-01) mit der Arduino 
IDE programmiert.

Hier sende ich mit einer Baut von 9600 die signale mit dem ESP
 Serial.begin(9600);
Serial.println("Test");
Diese kann ich auch schon mit dem FTDI und HTerm schon mitlesen.

Nun bekomm ich es auf dem PIC aber nicht so recht gebacken.
Hier der Code dazu.
void init_uart(void) 
{
    unsigned char config = 0;
    unsigned int spbrg = 51; // 51 laut DBlatt bei 8Mhz
    
    TRISCbits.RC6 = 0; //UART transmitter pin is set as output
    TRISCbits.RC7 = 1; //UART receiver pin is set as input
 
    
    config = USART_TX_INT_OFF  & // Transmit Interrupt OFF
             USART_RX_INT_ON   & // Receive Interrupt ON
             USART_ASYNCH_MODE & // Asynchronous Mode
             USART_EIGHT_BIT   & // 8-bit Transmit/Receive
             // USART_CONT_RX    &   // Continuous Reception
             USART_BRGH_HIGH;    // High Baud Rate
    //(64E6 / 9600 / 16 - 1));  // Baud Rate 9600 // wird über spbrg bestimmt
    
    //Call the uart constructor from usart.h
    OpenUSART(config, spbrg);
  
    INTCONbits.GIE = 1;  //Global Interrupt Enable Bit
    INTCONbits.PEIE = 1; //Peripheral Interrupt Enable Bit

    //IPR1: Peripheral interrupt priority register
    IPR1bits.RCIP = 0; //Receive interrupt priority bit is low
    IPR1bits.TXIP = 0; //Transmit interrupt priority bit is low

    //PIE1: Peripheral interrupt enable register
    PIE1bits.RCIE = 1; //Enable the UART receive interrupt
    PIE1bits.TXIE = 1;
    
    //TXSTAbits.TXEN = 1; //Enable the Transmit Enable Bit
    RCSTAbits.CREN = 1; //Enable the Receive Enable Bit

    //Pin hardware high
    //TRISDbits.TRISD0 = 0; //Activate hardware pin as output pin
    //LATDbits.LATD0 = 1; //Set hardware pin as output
    
    //Pin software high
    //TRISDbits.TRISD1 = 0; //Activate software pin as output pin
    //LATDbits.LATD1 = 1; //Set software pin as output
}


Meine Main
void main(void)
{
    OSCCONbits.IRCF = 0b11111111; //fuer pic18f4550 mit 8MHz laut DB
    TRISB = 0x00; //PORTB als Ausgang
    init_uart();
    PIR1bits.RCIF =0;
    char input;
    while (1)
    {
         if (PIR1bits.RCIF == 1)// Prüft ob etwas ins register geschrieben wurde
         {
             input = RCREG;
         }
    for(int i = 0 ; i<50; i++)
    {
        __delay_ms(20);
    }        
}

Nun die Frage, mach ich grundlegend etwas falsch auf dem PIC?
Ich will in erster Linie erstmal wissen was am PIC überhaupt ankommt und 
mein gedanke war deshalb, dass ich das was empfangen wird in die 
variable input schreibe und dann mit das empfangene ansehe (im debug 
modus).
Leider springt er nicht mal in die if da scheinbar nichts ankommt?!?

Autor: Volker SK (vloki)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lass den TX IR besser mal weg für den Anfang! (oder für immer)
Der ist ja IMMER aktiv, wenn gesendet werden könnte.

Solange noch keine IR Behandlungs-Routine vorhanden ist,
darf man auch ÜBERHAUPT KEINE IR aktivieren!

<edit> Sicher, dass man den TX Pin als Ausgang konfigurieren sollte?
Das USART Modul vom 25K22 sollte sich eigentlich nicht vom 2550er 
unterscheiden. </edit>

<edit2>
Jens schrieb:
> Leider springt er nicht mal in die if da scheinbar nichts ankommt?!?
Du hast doch ein PICkit. Warum benutzt du das nicht um nach zu schauen 
was das Programm gerade so treibt?

<edit3>
Da sind einige primitive USART Code-Beispiele -> 
http://picforum.ric323.com/viewtopic.php?p=449#p449
Und da, noch mal mit Erläuterungen 
http://www.hs-ulm.de/users/vschilli/Mikrocontrolle... 
(Kapitel 10.1)

: Bearbeitet durch User
Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die PDF ist gut, diese wurde mir oben schon verlinkt. Hab mir dies auch 
durchgelesen.
Die von dem picforum kannte ich noch nicht, allerdings sehe ich auch 
hier keinen wirklichen unterschied zu meiner config

Prüfe nun noch auf
RCSTAbits.FERR 
RCSTAbits.OERR
aber auch hier kein wirklicher erfolg zu verzeichnen :/

Autor: Volker SK (vloki)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jens schrieb:
> allerdings sehe ich auch hier keinen wirklichen
> unterschied zu meiner config

Es werden keine IR aktiviert, die nicht behandelt werden?

Der TX Pin wird nicht als Ausgang konfiguriert?

Es wird nicht die OpenUSART() Funktion verwendet
und dann nochmals CREN gesetzt?

...

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Den TX hab ich nun ganz raus genommen, da ich nur lesen will und somit 
nur RX benötige

OpenUSART nutz ich doch
 OpenUSART(config, spbrg);

oder nutze ich diese falsch?

Autor: Volker SK (vloki)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wozu dann noch
RCSTAbits.CREN = 1; //Enable the Receive Enable Bit
? (Das ist doch in OpenUSART() enthalten)

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK, aber auch wenn ich das nun raus nehme ändert sich da nichts.
Ich find es irgendwie recht seltsam.

Autor: Volker SK (vloki)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ganze Interrupt Zeug auch raus genommen?

Was passiert, wenn du komplett mein Beispiel verwendest?
Am besten das, welches nicht OpenUSART() verwendet, sondern die Register 
direkt setzt.
(Bei der Verwendung der Funktionen muss man eigentlich wissen, ob das 
Macro USE_OR_MASK gesetzt ist. Dann muss man die Konfigurationsmasken 
ver-odern)
/* Configuration bit masks to be 'anded' together and passed as the 'config'
 * parameter to the 'open' routine. */
//-----------AND OR MASK-------------------------------------------------
#ifndef USE_OR_MASKS

#define USART_TX_INT_ON   0b11111111  // Transmit interrupt on
#define USART_TX_INT_OFF  0b01111111  // Transmit interrupt off
...

//------------AND MASK------------------------------------------------
#else
#define USART_TX_INT_ON       0b10000000  // Transmit interrupt on
#define USART_TX_INT_OFF      0b00000000  // Transmit interrupt off
...

: Bearbeitet durch User
Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
welchen interrupt meins du?

Autor: Volker SK (vloki)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alle ;-)

Also das Beispiel eins weiter oben war nur zur Verdeutlichung von 
OR_MASK vs. AND_MASK.

Das Folgende must du löschen/aukommentieren bis du einen IR-Handler 
geschrieben hast:
INTCONbits.GIE = 1;  //Global Interrupt Enable Bit
    INTCONbits.PEIE = 1; //Peripheral Interrupt Enable Bit

    //IPR1: Peripheral interrupt priority register
    IPR1bits.RCIP = 0; //Receive interrupt priority bit is low
    IPR1bits.TXIP = 0; //Transmit interrupt priority bit is low

    //PIE1: Peripheral interrupt enable register
    PIE1bits.RCIE = 1; //Enable the UART receive interrupt
    PIE1bits.TXIE = 1;

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nur damit ich das jetzt richtig verstehe, so schauts nun aus
#define _XTAL_FREQ 8000000 // FOSC 8MHz
#pragma config FOSC = INTOSC_HS   
void main(void)
{
    OSCCONbits.IRCF = 0b01110000; //fuer pic18f4550
    TRISB = 0x00; //PORTB als Ausgang
    init_uart();
    unsigned char input;
    while (1)
    {
        
         if (PIR1bits.RCIF) 
         {
            int a = 1;
            input = RCREG;
         }
         if (RCSTAbits.FERR) 
         {  // check framing error
            input = 2; // clear the receiver fifo
         }
         if (RCSTAbits.OERR) 
         {  // 
            input = 3; // 
         }
         for(int i = 0 ; i<50; i++)
            {
                __delay_ms(20);
            }
     }    
}
void init_uart(void) 
{
    unsigned char config = 0;
    unsigned int spbrg = 51; // 51 laut DBlatt bei 8Mhz    
    RCSTA1bits.SPEN = 1;
    TRISCbits.RC6 = 1; //UART transmitter pin is set as output
    TRISCbits.RC7 = 1; //UART receiver pin is set as input
 
    
    config = USART_TX_INT_OFF  & // Transmit Interrupt OFF
             USART_RX_INT_ON   & // Receive Interrupt ON
             USART_ASYNCH_MODE & // Asynchronous Mode
             USART_EIGHT_BIT   & // 8-bit Transmit/Receive
             // USART_CONT_RX    &   // Continuous Reception
             USART_BRGH_HIGH;    // High Baud Rate
    //(64E6 / 9600 / 16 - 1));  // Baud Rate 9600 // wird über spbrg bestimmt
    //Call the uart constructor from usart.h
    
    OpenUSART(config, spbrg);
}

Autor: Volker SK (vloki)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und, läuft' s?

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
void main(void)
{
    init_uart();
    unsigned char input;
    int a;
    while (1)
    {
         if (DataRdyUSART()) 
         {
            a = 1;
            input = RCREG;
         }  
    }    
}


void init_uart(void) 
{
    unsigned char config = 0;
    unsigned int spbrg = 51; // 51 laut DBlatt bei 8Mhz    
    RCSTA1bits.SPEN = 1;
    TRISCbits.RC6 = 1; //UART transmitter pin is set as output
    TRISCbits.RC7 = 1; //UART receiver pin is set as input
    config = USART_TX_INT_OFF  & USART_RX_INT_ON   & USART_ASYNCH_MODE & USART_EIGHT_BIT   &  USART_BRGH_HIGH;   
    OpenUSART(config, spbrg);
}

So funktioniert es nun, das er auf 'DataRdyUSART' reagiert und in die if 
bedingung geht
RCREG soll dann in den char input schreiben, hier steht bisher nur ['ÿ'; 
0xff]. HIer vermute ich nun das ich bei der Baurate etwas falsch gemacht 
habe :/

Autor: Volker SK (vloki)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du das mal überprüft mit AND/OR-MASK?
#ifdef USE_OR_MASKS
    #ERRROR "Sch..."
#endif

Was steht nach der Initialisierung in den Registern TXSTA, RCSTA, 
BAUDCON?
(anhalten und nachschauen)

Was ist mit USART_ADDEN_OFF?

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nun bin ich soweit das ich endlich auch die zeichen empfange die ich 
sende, problem hierbei ist nun das ich nur die ersten beiden Zeichen 
bekomme, ich verstehe aber nicht weshalb.

einlesen tu ich so
#define BufferRXSize 20
unsigned char UartRXBuffer[BufferRXSize];
int PositionRX = 0;

if (DataRdyUSART()) 
{
    UartRXBuffer[PositionRX++]=RCREG;
}

gib es hier viellicht eine bessere lösung?

Autor: Volker SK (vloki)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie die ersten beiden Zeichen?
Was ist mit dem Rest von deinem Code?

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nun bekomme ich all das was ich empfangen will und bin soweit zufrieden. 
Allerdings hängt ich nun an einem weiteren Problem.

Die erste Auswertung klappt, anschließend nichts mehr :/
Es wird jeweils 2ON bzw 2OF gesendet (wird später erweitert)
Wenn ich starte dann wird zB 2ON wird dieses ausgewertet und die LED 
angeschaltet, im buffer steht trotz null setzen "\r\0\0" danach drin (im 
debug modus gesehen)
wenn ich im debug reset mache dann wird auch der buffer(array) komplett 
"\0\0\0" gesetzt
dann geht wieder genau das gleiche von vorne los :(

den buffer größer wählen, damit dieser das \r noch aufnimmt hat mir auch 
nichts gebracht

mir fehlt nun der richtige ansatz, wie ich weiter vorgehen soll...




hier mein code aktuell
#define _XTAL_FREQ 8000000 // FOSC 8MHz
#define BufferRXSize 3//Maximum of one uart receive message

unsigned char UartRXBuffer[BufferRXSize];
int PositionRX = 0;


/*
 * Die Main
 */
//int main(int argc, char** argv) 
void main(void)
{
    OSCCON = 0xFF;
    unsigned char input;
    init_uart();
    LATB = 0x00;  // 0 in PortB schreiben
    TRISB = 0x00; // PORTB as Output
    int i,j;
    while (1)
    {   
        if(DataRdyUSART())
        {
            if(PositionRX < BufferRXSize)
            
            {
                UartRXBuffer[PositionRX++] = RCREG; // schreib zeicheen für zeichen ins array
    
                PIR1bits.RCIF = 0; 
                RCREG=0; // fall im RCREG noch was vorhanden, dann leeren
     
                if(UartRXBuffer[0]=='2' && UartRXBuffer[2]=='N')
                {
                    LATB=1; // led an
                    __delay_ms(20);
                    // Buffer wieder leeren
                    UartRXBuffer[0]='\0';
                    UartRXBuffer[1]='\0';
                    UartRXBuffer[2]='\0';
                    PositionRX=0;
                    RCREG = 0; // soll das register für neues freigeben
                   
                }
                if(UartRXBuffer[0]=='2' && UartRXBuffer[2]=='F')
                {
                    LATB=0; //led aus
                    __delay_ms(20);
                    // Buffer wieder leeren
                    UartRXBuffer[0]='\0';
                    UartRXBuffer[1]='\0';
                    UartRXBuffer[2]='\0';
                    PositionRX=0;
                    RCREG = 0; // soll das register für neues freigeben
                }
                 
            }    
        }

 

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.