Forum: Mikrocontroller und Digitale Elektronik Projekt für den NXP 8051 "Mischanlage" in Planung


von Daniel G. (Firma: angehender Techniker) (oldnitro)


Angehängte Dateien:

Lesenswert?

Hallo Forummitglieder

Ich bin Daniel 24 Jahre aus dem Norden und besuche die Technikerschule 
in Lübeck. Da im 2 Jahr der Ausbildung ein Mikrocontroller Projekt 
ansteht bin ich schon am überlegen und Planen.

Der Controller ist vorgegeben "NXP 8051" und bestellt.
Datenblatt ist hier zu finden : 
http://www.c51.de/c51.de/Dateien/Humerboards/NLB_LPC935.pdf

Nun zum Projekt, ich plane eine Mischanlage für Getränke zu bauen. Die 
Gefahren und das beachten von Lebensmitteln usw is mir klar und werd ich 
beachten.

Auf den Bildern habe ich die einzelheiten genauer gezeigt.

Das ganze soll in einen alten Server Big Tower eingebaut werden und 
bekommt einen TFT und ein PII PC System für die Software " Windows " Der 
Stick soll per USB angeschlossen werden und die externen Spannungen 
wollte ich aus dem PC Netzteil hohlen. Controller wird ja über USB 
betrieben.

Die Software C++ für den Controller werd ich mit Ride 7 schreiben die 
Software für Windows mit Borland Builder. Die Software soll auf dem LCD 
Angezeigt werden und die Bedienung soll per Taster " Controller "oder 
Maus "PC" erfolgen.

Die Mechanische Seite sollen 2 Behälter über Kopf stehen so das keine 
Pumpe benötigt wird. Dosiert werden soll per Magnetventil "Timer". Es 
soll je nach gewählten Mischungsverhältniss das  Glas gefüllt werden.

Das Mischungsverältniss bestimmt man per Poti " Controller " oder per 
Software " PC " .

Ich hoffe man kann sich nun vorstellen wie ich mir das so gedacht habe, 
sonst einfach fragen. Mich würde interessieren ob jemand ein Problem in 
dem plan sehen kann oder wie schwer das paralell arbeiten von PC und 
Mikrocontroller zum bedienen der Software ist. Ich werde sicher noch 
einige fragen haben aber will erstmal selber bischen schauen was man 
machen kann. Sicher is im Forum einiges zu finden ;-)

MFG Daniel

von Peter D. (peda)


Lesenswert?

Daniel Grzesik schrieb:
> wie schwer das paralell arbeiten von PC und
> Mikrocontroller zum bedienen der Software ist.

Ich würd mal sagen, der PC ist vollkommen überflüssig.

Niemand will erstmal ewig warten, bis der PC gebootet hat, um sich nen 
Drink zu mixen.


Peter

von Daniel G. (Firma: angehender Techniker) (oldnitro)


Lesenswert?

> Ich würd mal sagen, der PC ist vollkommen überflüssig.

Das kann ich mir gut vorstellen aber habe keine ahnung wie schwer es ist 
ein kleines Display zu programmieren  und das kann man später noch 
machen. Der PC ist aber auch ein muss bei dem Schulprojekt. Wir sollen 
den PC und den Controller zusammen betreiben.

Später würd ich eventuell mal überlegen wie ich ein kleines Display 
einbinden kann und den PC halt nur Optional zu machen. Aber ich muss 
erstmal das hinbekommen was ich oben geschrieben habe, dann kann man ja 
noch anderes zubauen wie Display, Eisspender oder Förderband.

von bbernhard1 (Gast)


Lesenswert?

Inwieweit bist du auf den LPC935 festgelegt?
Ich würd mir am Anfang gut überlegen welche Peripherie (UART, SPI, 
I2C..etc) du brauchst bzw was du konkret auf dem uC implementieren 
möchtest.
Am besten ist, wenn du dir auch gleich überlegst welche Dinge du 
eventuell später noch ergänzen möchtest (Display, 
Matrix-Keyboard,Temperatursensor...etc) und wie du das mit den zur 
Verfügung stehenden IO-Ports lösen könntest. Es gibt nichts blöderes, 
als wenn du im Laufe der Realisierung draufkommst, dass die Wahl des uC 
vielleicht doch nicht ideal war. Da handelst dir dann mehr Probleme ein, 
als nötig wären.

von Daniel G. (Firma: angehender Techniker) (oldnitro)


Lesenswert?

Wir habe den Klassenintern ausgewählt mit dem Lehrer damit wir bei 
problemen uns etwas selber helfen können und nicht jeder eine andere 
grundlage hat. Der Lehrer hat gesagt das der Controller schon viel zu 
gut ist und genug möglichkeiten nach oben frei hat. Es ist wichtiger das 
dass Projekt nachher läuft als das es riesen groß ist.

XXXXXXXXXXXXXXXXXXXXXXXXXDATENXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Die Firma NXP bietet eine Vielzahl von leistungstarken µControllern auf 
Basis eines verbesserten 8051-Cores.
!!! Hinweis: Der Board wird über die USB-Schnittstelle mit 5V versorgt. 
!!!
Technische Daten fuer das Entwicklungsmodul NLB LPC935

7.38 MHz SystemClock
256 IRAM + 512 Byte XRAM
4* 8bit ADC und DAC
I2C-Controller, SPI-Controller
PWM und CCU
Reset über Taster möglich
Alle Anschlüsse des LPC935 sind auf Steckverbinder herausgeführt.
Spannungsversorgung: 5V.
TMP 100 Temperatursensor (via I²C-Schnittstelle)
Licht-Frequenz-Umsetzer TSL235R
Poti für ADC-Beispiele
Jumper zur Aktivierung des Bootstrap-Loaders
LED-Anzeigen Auf Port2, RxD, TxD, SDA und SCL (I²C-Schnittstelle)
1 Taste mit Interrupt
USB <-> RS232 Converter (FT232R)

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Für mich sind ja normale Ein / Ausgänge wichtig und ein Analog eingang 
für den Poti. Wenn Display oder so nicht möglich ist kann ich mir später 
nen anderen Controller kaufen aber zu dem reinen Schulischen Projekt 
sollt er reichen. Hoff ich ;-1)

von R. W. (quakeman)


Lesenswert?

Also der LPC935 ist mehr als ausreichend für dein Vorhaben.
Du solltest den PC und Controller in Master und Slave unterteilen, womit 
das parallel arbeiten dann recht einfach wird. Welcher der beiden der 
Master wird ist dabei dir überlassen. Du musst das dann natürlich nur in 
deiner Software berücksichtigen.
Kommunikation zwischen den beiden am einfachsten per RS232 im klartext 
Protokoll (vereinfacht das spätere Debuggen).
Der Controller könnte später auch z.B. per SPI ein eigenes Grafik 
Display ansteuern, womit der PC hinfällig werden würde. Aber das ist 
momentan ja nicht gefordert bei dir.
Insgesamt sollte dein Vorhaben recht gut zu realisieren sein. 
Vorraussetzung ist natürlich, dass du dich in PC/8051er Programmierung 
und der Hardware des LPC935 auskennst.

Ciao,
     Rainer

von Daniel G. (Firma: angehender Techniker) (oldnitro)


Lesenswert?

>Insgesamt sollte dein Vorhaben recht gut zu realisieren sein.
>Vorraussetzung ist natürlich, dass du dich in PC/8051er Programmierung
>und der Hardware des LPC935 auskennst.


Das hört sich gut an, ich kenne mich noch nicht gut aus aber das ist ja 
der sinn der sache. Das Projekt ist sozusagen ein lernobjekt. In der 
schule haben wir kleine sachen wie Motor starten / regeln usw gemacht 
aber nächstes Jahr ist dies Projekt ein großer bereich dar mit 8 Stunden 
in der Woche.

>Du solltest den PC und Controller in Master und Slave unterteilen, womit
>das parallel arbeiten dann recht einfach wird.

Danke für den Tip , ich werd mich mal informieren wie man das macht und 
was zu beachten ist.

von Peter D. (peda)


Lesenswert?

Daniel Grzesik schrieb:
> Das hört sich gut an, ich kenne mich noch nicht gut aus aber das ist ja
> der sinn der sache.

Dann fürchte ich, daß Du Dich um einiges übernimmst.
Eine Mehr-Prozessor-Applikation ist definitiv nichts für Anfänger!

Ein Großteil der Entwicklungsarbeit ist dann das Datenprotokoll mit 
Fehlererkennung und Resynchronisation bei Störungen. Und zu allem 
Überfluß hast Du immer 2 Programme, in denen der Fehler liegen kann.


Mache alles nur auf dem MC, das ist für nen Anfänger überschaubar und 
trotzdem nicht leicht.
Für die Anzeige nimm ein Standard-Text-Display, d.h. was HD4780 
kompatibles:

http://de.wikipedia.org/wiki/HD44780

Das braucht dann nochmal 6 Leitungen zu Deinem MC.

Ein Text-LCD hat auch den großen Vorteil, Du kannst Dich voll auf das 
Programm konzentrieren und vergeudest nicht nutzlos Zeit mit 
irgendwelchem Grafik-Schnullifax.

Es soll schon Leute gegeben haben, die hatten zum Projektende nur ne 
blöde Startanimation zu bieten und garnichts am Programm gemacht. Das 
ist dann natürlich ne glatte "6".
Zu einem Projekt gehört nämlich auch, die Aufgaben nach Wichtigkeit zu 
priorisieren.


Peter

von avr (Gast)


Lesenswert?

Hallo Daniel,

das Projekt ist eigentlich recht einfach zu realisieren.
Die o.a. Bedienung und Hardware lassen einen einfachen Aufbau zu.

Ihr sollt einen PC einsetzen und einen µC. Also ist die
einfachste Aufteilung: der µC macht nur das, was der PC will
und nicht selber kann.

Also de µC als eine Steuereinheit mit Befehlsprotokoll.

z.B. Befehle wie : Melde Potiwert
                   LEDx ein
                   Ventil1 120ms
                   etc...
Bei Ventil habe ich extra die Zeit reingesetzt, da genaues
Timing mit den PC und serieller Übertragung (fast) nicht geht.

Also einfach die Hardwarefunktionen nacheinander realisieren,
die Befehle definieren und diese anschließend im PC-Programm
sinnvoll nacheinander ausgeben.

Evtl. sollte noch eine "Glas voll" Erkennung eingebaut werden.

avr

von Daniel G. (Firma: angehender Techniker) (oldnitro)


Lesenswert?

>Bei Ventil habe ich extra die Zeit reingesetzt, da genaues
>Timing mit den PC und serieller Übertragung (fast) nicht geht.

Ich hatte mir auch sowas gedacht. Also Timer im Controller und dann 
diesen per PC starten und setzen. Die mischungsverhältnisse ändern dann 
nur die Zeiten der Timer 1 und 2 .

Füllstandsanzeige währ klasse aber wie bewerkstelligen ?
 Waage ?

Auch wollten wir bei den Kanistern sowas einbauen das die anlage nicht 
leer läuft. Aber wie kann man das machen KAnister werden 2L 
Wasserkanister
http://cgi.ebay.de/Kanister-2-Liter-2-Stuck-1-60-Euro-/270590454609?cmd=ViewItem&pt=DE_Sport_Camping_Outdoor_Camping_Zubeh%C3%B6r&hash=item3f0072ab51

Keine ahnung wie man da den füllstand abfragen kann.

Ich habe auch derzeit ein problem bei der auswahl der MAgnetventile, 
Vorgesteuert Direktgestuert zwangsgesteuert

http://cgi.ebay.de/2-fach-Elektro-Magnetventil-3-4-AG-NC-10mm-12V-DC-/200482403740?cmd=ViewItem&pt=Waschmaschinen_Zubeh%C3%B6r&hash=item2eadaeb59c

Sowas wollten wir nehmen , kleiner schlauch zu den kanistern -> wenieger 
durchfluss = besser regelbar mit Timer
der große sollt nach außen geführt werden zum glas.

Aber reicht ein Vorgesteuertes Ventil ? wenn der Kanister fast leer ist 
muss das ja trozdem noch sicher abschalten.

ich wollte demnächst nach HH zu conrad fahren und Material kaufen. 
Wollte eine lochraster Platine nehmen und dann muss ich ja sicher 
Transistoren nehmen zum schützen der ausgänge des Controllers. Gibt es 
da eventuell einen Tip was man nehmen kann. ruhig besser da die eh nur 
nen par cent kosten. Oder gibt es fertige platienen mit 10 stück für 
solche anlässe ?

Potenzimeter hab ich das CIP162/220KLIN ( 220k Linear ) gedacht, kostet 
1,66€. Das muss ich doch dann ohne zusatzwiderstände anklemmen und 
nutzen können. Oder bedarf das einer besonderen schaltung ?


Danke für die Tips und Hilfe

von Thomas B. (escamoteur)


Lesenswert?

Hi,

Display von einen µC anzusteuern ist ziemlich einfach, ich mach das grad 
mit dem STM32 und einem DOGXL on Electronic Assembly via SPI vom µC aus. 
Da gibts direkt noch einen Touchscreen-Aufsatz den man über die 
Analogports einlesen kann.

Ich würde auch alles mit dem µC machen, da tatsächlich die Kommunikation 
mit dem PC nicht zu unterschätzen ist.

Kauf bloß nicht bei Conrad, da wirst Du arm. bestell Deine Sachen bei 
Reichelt.

Füllstandanzeige könnest Du durch einen kleinen Magnetschwimmer und 
einen Reedschalter realisieren.

Gruß
Tom

von Daniel G. (Firma: angehender Techniker) (oldnitro)


Lesenswert?

Also nun ist es soweit ich fange an zu Programmieren mit C. Ich habe 
schon 6  Taster mit Softwareentprellung, Potentiometer mit werteausgabe 
sowie alle LEDs des Boards in betrieb. Nun bin ich dabei ein paar kleine 
abläuft zu entwickeln. Leider haben wir in derschule sowas noch nie 
gemacht und werden ins kalte wasser geschmissen.

meine Idee:

Abfrage der eingänge

Taster 1
Wenn Geschlossen weiter
Sonst Meldung -> zb printf("T1 offen\n");
Taster 2
Wenn Geschlossen weiter
Sonst Meldung

Meldung-> Poti einstellen mit T3 bestätigen
T3 Geschlossen -> AD Wandlung ausführen und Wert speichern

Kann man so ein programm planen ? ich habe immer das die meldungen immer 
wieder kommen oder auch immer die AD wandlung abgefragt wird.

Kann man eigentlich den Controller auf eine eingabe warten lassen ?
Ist es möglich eine switch case funktion mit Tastern anzusteuern ?
Hat jemand ein programm zur hand an dem ich sehen kann wie überhaupt ein 
ablauf geplant und vorallen umgesetzt werden soll ?

Hoffe jemand kann mir helfen ein bischen licht ins dunkel zu bringen

Vielen Dank im vorraus
Daniel

von Daniel G. (Firma: angehender Techniker) (oldnitro)


Lesenswert?

Ach wenn ich keine antworten hier bekomme frage ich einfach mal weiter, 
die alten probleme sind nun beseitigt.

Wie kann ich sekundengenau das schalten eines ausganges ?

Ich habe derzeit


static void delay (long x) // Zeitverzögerung Einbauen
{
unsigned long i,j;
for (j=0;j<x;j++)
for (i=0;i<50000;i++);

}

aufruf dann mit delay(zeit);

Aber zum schalten der ausgänge muss ich das genauer haben und auch 
länger. denk mal zwischen 3 und 30 sekunden. Wird ja das magnetvential 
angesteuert und bis ein glas befüllt ist dauert das nunmal etwas.

würde mich über eine hilfe sehr freuen

von R. W. (quakeman)


Lesenswert?

Der LPC935 hat einen eingebauten RTC Timer, welcher gerade für längere 
Zeiten brauchbar ist. Mit diesem kannst du eine sehr genaue 1s Zeitbasis 
realisieren. Um dann auf deine 3-30s zu kommen brauchst du diesen dann 
nur die nötige Anzahl durchlaufen zu lassen.

Hier etwas Code wie der RTC anzusteuern ist:

Einmal beim Start initialisieren
1
  // RTC konfigurieren bei internem RC Oszillator mit 7,3728 MHz
2
  RTCCON = 0x60;

Dann in einer Funktion z.B.:
1
// Anzahl "sekunden" warten
2
void sleep(unsigned char sekunden) {
3
  unsigned char zaehler;
4
  
5
  for (zaehler = 0; zaehler < sekunden; zaehler++ {
6
    // Reloadwert für 1s
7
    RTCL = 0x00;
8
    RTCH = 0xE1;
9
    
10
    // RTC starten
11
    RTCCON = RTCCON | 1;
12
  
13
    // Unterlauf Flag abfragen
14
    while (!(RTCCON & 0x80));
15
  
16
    // Timeout Zähler stoppen und Unterlauf Flag löschen
17
    RTCCON = RTCCON & 0x7E;
18
  }
19
}

Falls du die Zeit nicht in der Funktion warten willst/kannst, dann musst 
du das Ganze natürlich per Interrupt und nicht Polling machen. ;)

Ciao,
     Rainer

von Daniel G. (Firma: angehender Techniker) (oldnitro)


Lesenswert?

Danke ich habe aber noch nen fehler mit der funktion, 2 hab ich weg 
bekommen aber nun bleibt noch was.

//********************************************************************** 
**********

void zapfen (void)
{

B1=0;
sleep(zeit1);        // int Wert
B1=1;
R1=0;
sleep(zeit2);        // int Wert
R1=1;

}
//********************************************************************** 
************

// Anzahl "sekunden" warten
void sleep (unsigned char sekunden)
{
  unsigned char zaehler;

  for (zaehler = 0; zaehler < sekunden; zaehler++)
    {
    // Reloadwert für 1s
    RTCL = 0x00;
    RTCH = 0xE1;

    // RTC starten
    RTCCON = RTCCON | 1;

    // Unterlauf Flag abfragen
    while (!(RTCCON & 0x80));

    // Timeout Zähler stoppen und Unterlauf Flag löschen
    RTCCON = RTCCON & 0x7E;
  }
}

//********************************************************************** 
*****************

 *** WARNING C090 IN LINE 156 OF C:\Basteln  unsortiert\Ride\C File1.c : 
Call to function 'sleep' without prototype
 *** WARNING C183 IN LINE 156 OF C:\Basteln  unsortiert\Ride\C File1.c : 
'sleep': function definition requires ANSI style parameter list
 *** ERROR C007 IN LINE 166 OF C:\Basteln  unsortiert\Ride\C File1.c : 
Invalid type in 'sleep' definition
 *** WARNING C096 IN LINE 185 OF C:\Basteln  unsortiert\Ride\C File1.c : 
Function 'sleep' should return a value
 RC51 COMPILATION COMPLETE. 3 WARNINGS, 1 ERROR

Habe Zahlen bei Sleep() eingegeben aber endert sich nix. Einmal beim 
Start initialisieren habe ich gemacht.

von R. W. (quakeman)


Lesenswert?

Daniel Grzesik schrieb:
>  *** WARNING C090 IN LINE 156 OF C:\Basteln  unsortiert\Ride\C File1.c :
> Call to function 'sleep' without prototype
>  *** WARNING C183 IN LINE 156 OF C:\Basteln  unsortiert\Ride\C File1.c :
> 'sleep': function definition requires ANSI style parameter list

Du hast die Funktion "sleep" erst nach der Methode "zapfen" definiert, 
weshalb der Compiler diese nicht findet. Also entweder verschiebst du 
die Funktion "sleep" vor deine Funktion "zapfen" oder du musst sie 
vorher explizit bekanntgeben.

Daniel Grzesik schrieb:
>  *** ERROR C007 IN LINE 166 OF C:\Basteln  unsortiert\Ride\C File1.c :
> Invalid type in 'sleep' definition
>  *** WARNING C096 IN LINE 185 OF C:\Basteln  unsortiert\Ride\C File1.c :
> Function 'sleep' should return a value
>  RC51 COMPILATION COMPLETE. 3 WARNINGS, 1 ERROR

Dies bezieht sich vermutlich auf eine etwas andere Syntax für deinen 
Compiler. Du musst mal schauen, ob deine Definition von Variablen evtl 
anderst aussieht. Ich benutze nämlich einen anderen Compiler als du.

Ciao,
     Rainer

von Bernhard S. (b_spitzer)


Lesenswert?

Daniel Grzesik schrieb:
> *** ERROR C007 IN LINE 166 OF C:\Basteln  unsortiert\Ride\C File1.c :
> Invalid type in 'sleep' definition

Die Meldung kommt bei RIDE, wenn der Funktionsprototyp fehlt. Dann geht 
der Compiler ziemlich Stur vom Übergabetyp void aus und meckert, wenn 
die Funktion doch was anderes will. Einfach ganz oben im Programm die 
Zeilen
void zapfen (void);
und
void sleep (unsigned char sekunden);
(mit Semikolon am Ende!) einfügen. Für alle weiteren Funktionen sollte 
man das ebenfalls machen.

tschuessle
Bernhard

von Olli583 (Gast)


Lesenswert?

Hallo zusammen,

ich habe eine Frage zu dem eingestellten Wert:
Wie kommt es dass die Zahl 0xE100 eine Zeit von 1sek gibt.

 // Reloadwert für 1s
    RTCL = 0x00;
    RTCH = 0xE1;

Ich verstehe wie du auf den Wert 60 kommst. Aber sind dies nicht noch 
Millisekunden und dann wäre doch 100 der richtige Wert um auf 1 Sekunde 
zu kommen?

lg
oliver

von R. W. (quakeman)


Lesenswert?

Mit RTCCON = 0x60 werden RTCS1=RTCS2=1 gesetzt. Diese beiden Bits 
bestimmen die Geschwindigkeit und Quelle, mit welcher der RTC getaktet 
wird. In Verbindung mit RCCLK=1 und FOSC[2:0]=011 (interner RC 
Oszillator) ergibt sich, dass der RTC vom RC Oszillator den Takt bekommt 
(7,3728 MHz). Dieser wird nun durch den 7Bit Vorteiler des RTC 
geschickt, wodurch der neue Takt 57600 Hz beträgt. Bei einem Reloadwert 
von 0xE100=57600 zählt der RTC genau 1s bis zum Überlauf.
Ich hoffe, das war verständlich. :)

Ciao,
     Rainer

von Olli583 (Gast)


Lesenswert?

Ja das macht jetzt sinn. :-)
Ich habe fälschlicher weise immer die Frequenz durch eins geteilt. Aber 
frequenz sind ja Perioden pro Sekunde...
Manchmal steht man etwas auf dem Schlauch.
Danke schön.(auch für die schnelle Antwort)
Gruß
Oliver

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.