Hallo, ich baue gerade einen Kicker, die Toranzeige soll über ein LCD
Display realisiert werden, Torzähler mit einer Lichtschranke! Es gibt
einen Reset-Button und 2 Tasten um die Namen um zu schalten.
Ich wollte mal fragen ob man das Programm so vielleicht realisieren
kann.
Habe noch nicht die Hardware, da müssen dann vielleicht einpaar kleine
Anpassungen gemacht werden. Aber es geht ja um das Grundgerüst.
Danke
Info:
- LCD- Modul hat einen HD44780 Controller
- PIC16F871 (20Mhz)
- Sprache: C
// PROGRAMM BEGIN
include <C:\cc5\16F871.H>
//Speihersutz121345=aus,Debug11=aus,ProgrammFlash9=an,EEpromRead8=an,
//NiendervoltProgr7=aus
//
NiederVoltReset6=an,EinschaltTimer3=an,WachDogTimer2=aus,Oszilator01=HC
#pragma config |= 0b.11.111101.11.00.10
#define LCD_RS 0b.00000001 //RS-Pin ist Bit0, LCD Register Select
#define LCD_CS 0b.00001000 //E-Pin ist Bit3, LCD Chip Select
#pragma char PORTQ @ PORTD //PORT auswählen, DB7-Bit7, DB6-Bit6,
DB5-Bit5, DB4-Bit4,
#include "delay20.c"
#include "lcd.c"
// Port D (0-7) - LCD
// Port A (0-4) - A0(TorSignal TR), A1(Torsignal TB), A2(NamensTaste
TR), A3(NamensTaste TB), A4(Reset)
void main(void) // Hauptprogramm
{
// Variablen
char TZR; //Torzähler Rot
char TZB; //Torzähler Blau
char NTR; //NamensTaste Rot
char NTB; //NamensTaste Blau
char NR; //Name von Rot
char NB; //Name von Blau
//----------------------------------------------------------------------
--
//Start des Kickers
//----------------------------------------------------------------------
--
TZR = 0;
TZB = 0;
NTR = 0;
NTB = 0;
NR = "Rot"
NB = "Blau"
PORTB=0x00;
TRISB=0b00000000; //Alles Ausgänge
lcdport=0;
Delay1ms(1000); // 1s warten
LCDInit(); // LSD Initialisieren
// LCD (x,y) X = LCD Zeile , y = LCD Position (bei 16 Stellen von 0-15)
LCDCls(); // Bildschirm löschen
LCDPos(1,3); // Position der ersten Zeichen 1
Zeile, Position 0
LCDString("KickDeluxe"); // String Anzeigen
LCDPos(2,6); // Position der ersten Zeichen 2
Zeile, Position 0
LCDString("V1.0"); // String Anzeigen
Delay1ms(3000); // Warte 3s zeit zum lesen.
LCDCls();
LCDPos(1,0);
LCDString("Rot - Blau");
LCDPos(2,3);
LCDString("0 - 0");
Goto Routine:
//----------------------------------------------------------------------
-
//Routine - Pinabfrage - Steuerung
//----------------------------------------------------------------------
--
Routine:
If (A0 = 1) // Lichtschranke gibt auf A0 eine 1, Tor für Rot
{
TZR=TZR+1;
LCDPos(2,3);
LCDString(TZR);
If (TZR = 6)
{
Goto Sieg;
}
}
If (A1 = 1) // Lichtschranke gibt auf A0 eine 1, Tor für Blau
{
TZB=TZB+1;
LCDPos(2,7);
LCDString(TZB);
If (TZB = 6)
{
Goto Sieg;
}
}
If (A2 = 1) //NamesTaste Rot, gedrückt
{
NTR=NTR+1;
If (NTR = 6)
{
NTR=0;
}
Switch (NTR)
{
Case 0 : LCDPos(1,0); LCDString("Rot"); NR="Rot"; break;
Case 1 : LCDPos(1,0); LCDString("DAN"); NR="DAN"; break;
Case 2 : LCDPos(1,0); LCDString("SEB"); NR="SEB"; break;
Case 3 : LCDPos(1,0); LCDString("SVE"); NR="SVE"; break;
Case 4 : LCDPos(1,0); LCDString("TIM"); NR="TIM"; break;
Case 5 : LCDPos(1,0); LCDString("LYN"); NR="LYN"; break;
}
}
If (A3 = 1) //NamesTaste Blau, gedrückt
{
NTB=NTB+1;
If (NTB = 6)
{
NTB=0;
}
Switch (NTB)
{
Case 0 : LCDPos(1,0); LCDString("Blau"); NB="Blau"; break;
Case 1 : LCDPos(1,0); LCDString("DAN "); NB="DAN"; break;
Case 2 : LCDPos(1,0); LCDString("SEB "); NB="SEB"; break;
Case 3 : LCDPos(1,0); LCDString("SVE "); NB="SVE"; break;
Case 4 : LCDPos(1,0); LCDString("TIM "); NB="TIM"; break;
Case 5 : LCDPos(1,0); LCDString("LYN "); NB="LYN"; break;
}
}
If (A4 = 1) // Reset-Taste, gedrückt
{
LCDPos(2,3);
LCDString("0 - 0");
TZR = 0;
TZB = 0;
}
Goto Routine;
Sieg:
LCDPos(1,0);
if (TZR = 6)
{
LCDString(NR & "Gewinnt!");
}
if (TZB = 6)
{
LCDString(NB & "Gewinnt!");
}
}
// PROGRAMM ENDE
Warum rufst Du um Hilfe (im Betreff), wenn Dein Programm vom Einsatz
noch weit entfernt ist ?
...aber mir fällt auf:
(1)
> if (TZR = 6)
Das ist eine Zuweisung und kein Vergleich ("==").
(2)
laß GOTO den Basic-Programmierern - bei C ist es meist nur schlechter
Stil (da gibt es Funktionen, die man aufrufen kann)
(3)
...das ganze Programm werde ich mir nicht durchlesen...
Weil ich wissen will ob es so machbar ist, ob die Befehle mehr oder
weniger stimmen. Damit das Programm schon so gut wie fertig ist.
Ich weiß das es Funktionen / Prozduren gibt. Doch da mein C schon was
veraltet ist, war ich mir nicht mehr sicher mit dem auf aufruf von
Funktion und der Deklaration.
aber trotzdem danke...
die idee finde ich echt witzig!
das koennten wir in der firma auch gut gebrauchen.
welche lichtschranken willst du da verwenden?
hat evtl. schon mal jemand hier im forum so was gebastelt?
gruss
a.
>char NB; //Name von Blau
Ist kein String, sondern nur ein einzelnes Zeichen.
Das ist ein interessantes Projekt. Da du aber scheinbar noch keine
Erfahrung mit Mikrocontrollern (und Programmierung) hast´, solltest du
erste mal klein anfangen.
An deinem Programm sind diverse Sachen, die einfach nicht funktionieren
(können).
Nimm dir einfach die Zeit, etwas C zu lernen und deinen Controller
kennenzulernen. Dann darfst du dich auch noch mit solchen Sachen wie
"Tastenentprellung", "Flankenauswertung" etc auseinandersetzen...
@Anton Keller
Lichschranken Bausatz bei Conrad ca. 15€ pro Bausatz
@Rahul, der Trollige
Doch doch ich habe schon ahnung von Mikrocontrollern, habe schon mehre
Projekte gemacht unteranderem ein Chipkarten gesteuertes Türschloss.
Ich habe ein groß Teil aus einem anderen Projekt übernommen.
Mit der Variablen muss ich dir recht geben. Aber das kam einfach daher
das ich den Quellcode übernommen hatte.
Wie gesagt es soll ja nur ein Grundgerüst sein. Was meinst du geht den
so nicht?!? Also mit meinem anderem Board(8051) wäre es so kein Problem,
abgesehen jetzt von Variablen oder so...
Mein "C" ist nur einwenig eingerostet da wir im Studium jetzt VB & Java
machen mußten.
Ich glaub ned das das mit den lichtschranken so extra funktioniert...
Die müssten schon irgendwo im Ballkanal angebracht sein... Wenn der Ball
einmal etwas höher ins tor fliegt dann merkt die LS nix...
>Natürlich im Ball rücklauf ^^ bin ja nicht von gestern!
Da ist man ja schneller, wenn man mit der Hand zählt...
Im Tor sollte doch am besten eine "Prallplatte" sein, die den Ball in
den Ballrücklauf lenkt (sonst ist der Ball wieder im Spiel...). Die
Platte könnte man an einen Taster o.dergl. koppeln, den man mit dem
Controller abfragt. Dadurch wäre die Torauswertung wesentlich schneller.
Übrigens zählt dein Programm solange Tore, wie der Ball zum passieren
der Lichtschranke braucht.
>NR="Rot"; break;
Dass NR bis jetzt nur ein einzelnes Zeichen ist, hatte ich ja schon
geschrieben. Das würde aber auch völlig reichen, wenn du die Ausgabe
sowieso so machst:
>LCDString("Rot");
Bis jetzt ist das Spiel ja sehr statisch: Es können nur 5 feste Leute
und 2 "Farben" spielen. Eine Erweiterung wäre, dass man Namen über
Tasten (auf, ab, links rechts, Eingabe) eingeben kann.
Eine Uhr wäre bestimmt auch noch toll.
Und der Kicker geht nur bis 6 Tore?
Also von der Platte bis zur lichtschranke sind ungefähr 0,5 sekunden
unterschied! Und es geht ja auch nicht darum was schneller ist! Und wie
der Kicker gebaut wird, weiß ich auch, aber danke.
Das die Licht schranke solang zählt kann sein, aber ist ja kein Problem!
Dann die Abfrage nach dem eine "1" anliegt beim nach dem ersten
hochzählen 1 sekunde aussetzen lassen! Danke für den Hinweis!
Das es nur bis 6 geht ist vorläufig, aber bei Kneipenspielen geht es
immer nur bis 6, da es nur 11 Bälle gibt. Und international geht ein
Satz bis 5! Nur soviel dazu!
Farben ? Rot und Blau bezieht sich auf die Spielfigurfarben, von daher
wären mehr farben etwas komisch! Rot und Blau ist auch nur für Leute die
keinen gespeicherten Namen haben gedacht!
Und die Namen sind auch erstmal Platz halter. Das Hinterher auszubauen
ist ja auch kein Problem, die Software kann man immer erweitern. Das ist
nur erstmal das Grundgerüst, habe auch schon an sachen... wie Spielzeit
usw. gedacht. aber das kommt im nachhinein.
>Und international geht ein Satz bis 5! Nur soviel dazu!
Ich kenne halt nur "Kinder- und Jugendhaus-Kicker"...
>Farben ? Rot und Blau bezieht sich auf die Spielfigurfarben
Das war mir schon klar.
Also was da oben steht, muß ja haufenweise Warnings und Errors
produzieren.
Sowas ist total unlesbar.
Beseitige erstmal diese Warnings und Errors und dann frag nochmal neu.
Und vor allem poste Code als Anhang, damit man sich nicht totscrollen
muß.
Peter
Mein Tipp
Schreib nicht zuviel auf einmal. Das hat keinen Sinn.
Hinterher stehst du mit einem Programm da, das nicht
funktioniert und du hast keinen blassen Dunst wo du
mit der Fehlersuche anfangen sollst.
Mach erst mal die Hardware soweit fertig, dass du den
µC programmieren kannst. Und da fängst du dann klein
an, das ganze hochzuziehen.
Nur so als Tipp:
Das NR ein char Array sein muss, wurde ja schon gesagt.
Aber das da
NR = "Rot";
geht gar nicht. Einem Array kann man als ganzes nichts
zuweisen.
char NR[20];
....
strcpy( NR, "Rot" );
ist das was du willst.
Wie gesagt: Fang klein an. Wenn du die Details der Syntax nicht
mehr kennst, dann besorg dir Literatur und lies dich erst mal
ein. Ein Projekt dieser Größenordnung ist ohne vernünftige
Funktionsaufteilung ein gescheitertes Projekt.
> Damit das Programm schon so gut wie fertig ist.
Dein Programm mag vielleicht so funktionieren, nachdem
die Syntax und sonstige Fehler beseitigt sind.
Aber fertig ist das noch lange nicht. Da gibt es viele
Dinge die man so nicht macht. zb das hier:
Switch (NTR)
{
Case 0 : LCDPos(1,0); LCDString("Rot"); NR="Rot"; break;
Case 1 : LCDPos(1,0); LCDString("DAN"); NR="DAN"; break;
Case 2 : LCDPos(1,0); LCDString("SEB"); NR="SEB"; break;
Case 3 : LCDPos(1,0); LCDString("SVE"); NR="SVE"; break;
Case 4 : LCDPos(1,0); LCDString("TIM"); NR="TIM"; break;
Case 5 : LCDPos(1,0); LCDString("LYN"); NR="LYN"; break;
}
Schon mal was von Arrays gehört?
> Mein "C" ist nur einwenig eingerostet da wir im Studium jetzt> VB & Java machen mußten.
Schwer zu glauben, dass du überhaupt schon mal was in C oder Java
gemacht hast.
Karl heinz Buchegger wrote:
> Aber fertig ist das noch lange nicht. Da gibt es viele> Dinge die man so nicht macht. zb das hier:>> Switch (NTR)> {> Case 0 : LCDPos(1,0); LCDString("Rot"); NR="Rot"; break;>> Case 1 : LCDPos(1,0); LCDString("DAN"); NR="DAN"; break;>> Case 2 : LCDPos(1,0); LCDString("SEB"); NR="SEB"; break;>> Case 3 : LCDPos(1,0); LCDString("SVE"); NR="SVE"; break;>> Case 4 : LCDPos(1,0); LCDString("TIM"); NR="TIM"; break;>> Case 5 : LCDPos(1,0); LCDString("LYN"); NR="LYN"; break;> }
Stimmt, das würde man so machen:
@Karl heinz Buchegger
Brauchst du ja auch nicht glauben! Nur wenn es nicht so wär würd ich es
auch nichts sagen, davon hab ich auch nichts. Aber glaub mal wenn du vor
2 Jahren das letzte mal c Programmiert hast und in der zwischen Zeit nur
VB programmieren mußtest, dann kommt man oft durcheinander.
Den Code habe ich mir mehr oder weniger zusammen geschnipselt.
Aber hast recht, vll sollte ich lieber auf die Hardware warten.
Und mich nochmal was einlesen. Trotzdem danke...
Danny wrote:
> so nicht?!? Also mit meinem anderem Board(8051) wäre es so kein Problem,> abgesehen jetzt von Variablen oder so...
Und warum dann der Wechsel zum PIC ?
Ich habs gerne, wenn ich immer gleich alles ausprobieren kann.
Und das geht ja mit den 8051-ern mit Bootloader ganz leicht (z.B.
AT89C51ED2).
Dann kann man sogar im Feld, wenn man ein Bug entdeckt, sofort updaten.
Auch im fertigen Gerät noch nen MAX202 und nen Sub-D 9pol. einzubauen,
kost ja nix.
Peter
P.S.:
Wenn ich an früher denke, wo man immer die Chips ins Programiergerät
stecken mußte, bis dann ein Beinchen abbrach, kommt mir heute noch das
Grausen.
Hi, das Board was ich habe, habe ich damals in der Schule gebaut.
(Keiner Normalen Schule ^^)
Leider ist das wie gesagt lang her und ich weiß kaum noch etwas über den
Controler. Haben damals auch keine großen Infos bekommen wie genau er
Funktioniert.
Habe mal hier 3 Bilder.
Bild1 (Das Board) :
http://img255.imageshack.us/my.php?image=p10102673bk.jpg
Bild2 (Stromplatine mit den Ports) :
http://img255.imageshack.us/my.php?image=p10102682lp.jpg
Bild3 (Ein anderes kl. Board) :
http://img372.imageshack.us/my.php?image=p10102692xi.jpg
Vielleicht kann mir ja jemand was dazu sagen oder helfen, ob und wie ich
damit noch etwas anfangen kann!
Haben dann im Internet, nach einem anderem Board geguckt... gibt dann ja
viel PIC, AVR usw...
Hatte dann die Seite von Sprut gefunden (www.sprut.de / Burner8) und
dort fand ich alles gut erklärt daher habe ich gedacht ich nehm den PIC.
Ansonsten ist es mir eigentlich egal...
>Hi, das Board was ich habe, habe ich damals in der Schule gebaut.>...>Vielleicht kann mir ja jemand was dazu sagen oder helfen, ob und wie ich>damit noch etwas anfangen kann!
hm...mir fehlen die Worte...
Warum fehlen dir die Worte? Find wenn du keinen hilfreichen Kommentar
hast kannst ihn auch gern für dich behalten!
Hab das Board zum laufen bekommen... Sagen wir mal so es antwortet ,
beim Tera term!
Danny wrote:
> Vielleicht kann mir ja jemand was dazu sagen oder helfen, ob und wie ich> damit noch etwas anfangen kann!> Haben dann im Internet, nach einem anderem Board geguckt... gibt dann ja> viel PIC, AVR usw...
Ja, so sahen die Boards früher mal aus.
Wie gesagt, heutzutage ist alles in einem Chip und geflasht wird direkt
über die UART vom PC, Programmiergerät unnötig:
http://www.mikrocontroller.net/attachment/1204/8051.pdf
Peter
@Peter Dannegger
Ahh... ;) Danke...
Aber zum testen würde es ja reichen. Also Hier wird das Programm ja auch
per Serial Schnittstelle direkt in den Speicher geschrieben! Nur nachdem
der Strom abgeklemmt wurde ist es eben weg, dafür kann man aber ne
Batterie einbauen. War damals wohl was besonderes... ka.
Gibt es denn Bauanleitungen zu einem Board (der neuen Generation/mit
Flashspeicher)?
Danny wrote:
> Gibt es denn Bauanleitungen zu einem Board (der neuen Generation/mit> Flashspeicher)?
Na viel anzuleiten is da nich. Das bischen MAX202, Quarz usw. hat man
schnell auf ner Rasterplatine zusammengepappt (Schaltplan siehe oben).
Dann noch Flip und SDCC 8051 (oder Wickenhäuser usw.) runterladen und ab
gehts.
Peter
Also ganz Easy im vergleich zu meinem Alten Board ^^
Naja aber genau zu wissen wie was Beschaltet wäre schon gut! also wie
die Max202 angeschlossen wird und der Quarz! (wie erwähnt über den
Aufbau hat man uns leider zuwenig erklärt was ich schade find)!
Ich habe folgendes Problem.
Wenn ich jetzt eine File erstelle zb. im text editor (test.c)!
Aber ich bekomm aus der c-file keine hexfile....
Kann mir einer helfen ???
Danny wrote:
> Aber ich bekomm aus der c-file keine hexfile....
Das macht man mit nem C-Compiler (kaufen, Eval-Version oder Freeware),
z.B.:
http://sdcc.sourceforge.net/http://www.keil.com/c51/default.asp?bhcp=1http://www.wickenhaeuser.de/
Bootloader-Typen des 8051 gibts z.B. von Atmel, Maxim, NXP, ...
Einfach mal auf deren Webseiten nachsehen.
Der obige Typ müßte einer sein (ohne Gewähr).
Ich benutze den AT89C51CC01UA, weil ich CAN brauche.
Peter
Danny wrote:
> Ja, aber habe irgendwie Problemde damit.
Damit kann man garnichts anfangen, also welche Probleme ?
> Habe den von Keil und Wicken...
Die Keil Eval plaziert den Code mit Offset, also nen genügend großen
8051 nehmen.
In der IDE hast Du auch HEX-Output ausgewählt ?
Ansonsten gibts da bestimmt Foren oder Knowledgebase, die die erste
Anlaufstelle zu speziellen Problemen sein sollten.
Mir hat auch mal Herr Keil geantwortet. Der dürfte aber schon längst in
Rente sein.
Ich benutze noch ne 1995-er Version. Da ich kein Banking brauche, tuts
die ja auch. Kostete damals etwa 1600,-DM.
Peter
@Peter Dannegger
Habe leider keine anleitung gefunden zum bau eines MC mit flash.
Also ich benötige den Controller mit Flash , ne Max 202 (nicht ne
max232??) laut der PDF von dir mehr nicht (abgesehen von den
kondensatoren und widerständen) ???
Die Schalter und Led's an den Ports ist ja ne freiwillige sache....
>keine anleitung gefunden zum bau eines MC mit flash.
Einen Die basteln ist auch nicht gerade einfach...
Der Flash ist schon auf dem Chip drauf.
Peters "Liebling" ist ein 8051 mit einem Bootloader, der über den
CAN-Bus mit einer neuen Appliaktion beschrieben werden kann.
Den gleichen gibt es auch mit einem Bootloader, der über die RS232
arbeitet. Beide müsste man bei Angelika-Reichelt erwerben können
(Achtung bei der Bestellbezeichnung!!!).
Übrigens ist ein Bootloader ein Programm auf dem Controller, das sich um
die programmierung des Controllers kümmert (klingt vermutlich etwas
widersinnig). Auf der PC-Seite kümmert sich "FLIP" um die Kommunikation
mit dem Controller. "FLIP" gibt es auf der Atmel-Seite.
Wenn du das hier meinst:
http://www.mikrocontroller.net/attachment/1204/8051.pdf
Das scheint auf RS232-Kommunikation ausgelegt zu sein, da zwar ein
MAX202 aber kein CAN-Transceiver vorhanden ist.
Du solltest dir dazu mal das Datenblatt des T89C51RD2-3C angucken.
Der RD2 ist abgekündigt. Der ED2 ist der Ersatztyp (das könnte man jetzt
"Gronottische Klugscheisserei" nennen, da ich das gerade auf der
Atmel-Seite herausgefunden habe...)