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


von Jens (Gast)


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

von Stefan F. (Gast)


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
           1,5k
2
5V Tx o---[===]----+------o Rx ESP
3
                   |
4
                  |~|
5
                  |_| 2,2k
6
                   |
7
GND o--------------+------o GND
8
9
 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.

von Volker S. (vloki)


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
von Stefan F. (Gast)


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.

von Jens (Gast)


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ß

von Stefan F. (Gast)


Lesenswert?

> Den PIC betreibe ich aktuell mit 3,3V.

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

von Jens (Gast)


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.

von Jens (Gast)


Lesenswert?

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

von Thomas (Gast)


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-mit-dem-esp8266/
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.

von Thomas (Gast)


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?

von Jens (Gast)


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.

von peter (Gast)


Lesenswert?

http://www.ebay.de/itm/172346314000?_trk...EBIDX%3AIT
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

von Jens (Gast)


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.

von Frank M. (ukw) (Moderator) Benutzerseite


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
von Stefan F. (Gast)


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.

von peter (Gast)


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....

von Thomas (Gast)


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.

von Stefan F. (Gast)


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.

von Jens (Gast)


Lesenswert?

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

von Stefan F. (Gast)


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-Converter-Meter/dp/B008AGDTA4/ref=sr_1_1?ie=UTF8&qid=1474464464&sr=8-1&keywords=usb+uart+cable

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_id=225&pcid=41) 
findest du einen entsprechenden Hinweis.

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

von Jens (Gast)


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?

von Volker S. (vloki)


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/Mikrocontroller/uCQ/_downloads/uCquick-X.pdf 
10.1 RS232 / COM-Port (auch virtuell über USB oder BT )

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

von Jens (Gast)


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?

von Volker S. (vloki)


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

von Wolfgang (Gast)


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.

von Dieter W. (dds5)


Lesenswert?

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

von Jens (Gast)


Lesenswert?

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

Intern

von Jens (Gast)


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
1
 Serial.begin(9600);
2
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.
1
void init_uart(void) 
2
{
3
    unsigned char config = 0;
4
    unsigned int spbrg = 51; // 51 laut DBlatt bei 8Mhz
5
    
6
    TRISCbits.RC6 = 0; //UART transmitter pin is set as output
7
    TRISCbits.RC7 = 1; //UART receiver pin is set as input
8
 
9
    
10
    config = USART_TX_INT_OFF  & // Transmit Interrupt OFF
11
             USART_RX_INT_ON   & // Receive Interrupt ON
12
             USART_ASYNCH_MODE & // Asynchronous Mode
13
             USART_EIGHT_BIT   & // 8-bit Transmit/Receive
14
             // USART_CONT_RX    &   // Continuous Reception
15
             USART_BRGH_HIGH;    // High Baud Rate
16
    //(64E6 / 9600 / 16 - 1));  // Baud Rate 9600 // wird über spbrg bestimmt
17
    
18
    //Call the uart constructor from usart.h
19
    OpenUSART(config, spbrg);
20
  
21
    INTCONbits.GIE = 1;  //Global Interrupt Enable Bit
22
    INTCONbits.PEIE = 1; //Peripheral Interrupt Enable Bit
23
24
    //IPR1: Peripheral interrupt priority register
25
    IPR1bits.RCIP = 0; //Receive interrupt priority bit is low
26
    IPR1bits.TXIP = 0; //Transmit interrupt priority bit is low
27
28
    //PIE1: Peripheral interrupt enable register
29
    PIE1bits.RCIE = 1; //Enable the UART receive interrupt
30
    PIE1bits.TXIE = 1;
31
    
32
    //TXSTAbits.TXEN = 1; //Enable the Transmit Enable Bit
33
    RCSTAbits.CREN = 1; //Enable the Receive Enable Bit
34
35
    //Pin hardware high
36
    //TRISDbits.TRISD0 = 0; //Activate hardware pin as output pin
37
    //LATDbits.LATD0 = 1; //Set hardware pin as output
38
    
39
    //Pin software high
40
    //TRISDbits.TRISD1 = 0; //Activate software pin as output pin
41
    //LATDbits.LATD1 = 1; //Set software pin as output
42
}

Meine Main
1
void main(void)
2
{
3
    OSCCONbits.IRCF = 0b11111111; //fuer pic18f4550 mit 8MHz laut DB
4
    TRISB = 0x00; //PORTB als Ausgang
5
    init_uart();
6
    PIR1bits.RCIF =0;
7
    char input;
8
    while (1)
9
    {
10
         if (PIR1bits.RCIF == 1)// Prüft ob etwas ins register geschrieben wurde
11
         {
12
             input = RCREG;
13
         }
14
    for(int i = 0 ; i<50; i++)
15
    {
16
        __delay_ms(20);
17
    }        
18
}

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

von Volker S. (vloki)


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/Mikrocontroller/uCQ/_downloads/uCquick-X.pdf 
(Kapitel 10.1)

: Bearbeitet durch User
von Jens (Gast)


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
1
RCSTAbits.FERR 
2
RCSTAbits.OERR
aber auch hier kein wirklicher erfolg zu verzeichnen :/

von Volker S. (vloki)


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?

...

von Jens (Gast)


Lesenswert?

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

OpenUSART nutz ich doch
1
 OpenUSART(config, spbrg);

oder nutze ich diese falsch?

von Volker S. (vloki)


Lesenswert?

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

von Jens (Gast)


Lesenswert?

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

von Volker S. (vloki)


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)
1
/* Configuration bit masks to be 'anded' together and passed as the 'config'
2
 * parameter to the 'open' routine. */
3
//-----------AND OR MASK-------------------------------------------------
4
#ifndef USE_OR_MASKS
5
6
#define USART_TX_INT_ON   0b11111111  // Transmit interrupt on
7
#define USART_TX_INT_OFF  0b01111111  // Transmit interrupt off
8
...
9
10
//------------AND MASK------------------------------------------------
11
#else
12
#define USART_TX_INT_ON       0b10000000  // Transmit interrupt on
13
#define USART_TX_INT_OFF      0b00000000  // Transmit interrupt off
14
...

: Bearbeitet durch User
von Jens (Gast)


Lesenswert?

welchen interrupt meins du?

von Volker S. (vloki)


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:
1
INTCONbits.GIE = 1;  //Global Interrupt Enable Bit
2
    INTCONbits.PEIE = 1; //Peripheral Interrupt Enable Bit
3
4
    //IPR1: Peripheral interrupt priority register
5
    IPR1bits.RCIP = 0; //Receive interrupt priority bit is low
6
    IPR1bits.TXIP = 0; //Transmit interrupt priority bit is low
7
8
    //PIE1: Peripheral interrupt enable register
9
    PIE1bits.RCIE = 1; //Enable the UART receive interrupt
10
    PIE1bits.TXIE = 1;

von Jens (Gast)


Lesenswert?

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

von Volker S. (vloki)


Lesenswert?

Und, läuft' s?

von Jens (Gast)


Lesenswert?

1
void main(void)
2
{
3
    init_uart();
4
    unsigned char input;
5
    int a;
6
    while (1)
7
    {
8
         if (DataRdyUSART()) 
9
         {
10
            a = 1;
11
            input = RCREG;
12
         }  
13
    }    
14
}
15
16
17
void init_uart(void) 
18
{
19
    unsigned char config = 0;
20
    unsigned int spbrg = 51; // 51 laut DBlatt bei 8Mhz    
21
    RCSTA1bits.SPEN = 1;
22
    TRISCbits.RC6 = 1; //UART transmitter pin is set as output
23
    TRISCbits.RC7 = 1; //UART receiver pin is set as input
24
    config = USART_TX_INT_OFF  & USART_RX_INT_ON   & USART_ASYNCH_MODE & USART_EIGHT_BIT   &  USART_BRGH_HIGH;   
25
    OpenUSART(config, spbrg);
26
}

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 :/

von Volker S. (vloki)


Lesenswert?

Hast du das mal überprüft mit AND/OR-MASK?
1
#ifdef USE_OR_MASKS
2
    #ERRROR "Sch..."
3
#endif

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

Was ist mit USART_ADDEN_OFF?

von Jens (Gast)


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
1
#define BufferRXSize 20
2
unsigned char UartRXBuffer[BufferRXSize];
3
int PositionRX = 0;
4
5
if (DataRdyUSART()) 
6
{
7
    UartRXBuffer[PositionRX++]=RCREG;
8
}

gib es hier viellicht eine bessere lösung?

von Volker S. (vloki)


Lesenswert?

Wie die ersten beiden Zeichen?
Was ist mit dem Rest von deinem Code?

von Jens (Gast)


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
1
#define _XTAL_FREQ 8000000 // FOSC 8MHz
2
#define BufferRXSize 3//Maximum of one uart receive message
3
4
unsigned char UartRXBuffer[BufferRXSize];
5
int PositionRX = 0;
6
7
8
/*
9
 * Die Main
10
 */
11
//int main(int argc, char** argv) 
12
void main(void)
13
{
14
    OSCCON = 0xFF;
15
    unsigned char input;
16
    init_uart();
17
    LATB = 0x00;  // 0 in PortB schreiben
18
    TRISB = 0x00; // PORTB as Output
19
    int i,j;
20
    while (1)
21
    {   
22
        if(DataRdyUSART())
23
        {
24
            if(PositionRX < BufferRXSize)
25
            
26
            {
27
                UartRXBuffer[PositionRX++] = RCREG; // schreib zeicheen für zeichen ins array
28
    
29
                PIR1bits.RCIF = 0; 
30
                RCREG=0; // fall im RCREG noch was vorhanden, dann leeren
31
     
32
                if(UartRXBuffer[0]=='2' && UartRXBuffer[2]=='N')
33
                {
34
                    LATB=1; // led an
35
                    __delay_ms(20);
36
                    // Buffer wieder leeren
37
                    UartRXBuffer[0]='\0';
38
                    UartRXBuffer[1]='\0';
39
                    UartRXBuffer[2]='\0';
40
                    PositionRX=0;
41
                    RCREG = 0; // soll das register für neues freigeben
42
                   
43
                }
44
                if(UartRXBuffer[0]=='2' && UartRXBuffer[2]=='F')
45
                {
46
                    LATB=0; //led aus
47
                    __delay_ms(20);
48
                    // Buffer wieder leeren
49
                    UartRXBuffer[0]='\0';
50
                    UartRXBuffer[1]='\0';
51
                    UartRXBuffer[2]='\0';
52
                    PositionRX=0;
53
                    RCREG = 0; // soll das register für neues freigeben
54
                }
55
                 
56
            }    
57
        }

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.