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:
1 | char *NB; |
2 | |
3 | char *namen[] = { "Rot", "DAN", "SEB", "SVE", "TIM", "LYN" }; |
4 | |
5 | if( NTR <= 5 ){ |
6 | NB = namen[NTR]; |
7 | LCDPos(1,0); |
8 | LCDString( NB); |
9 | }
|
Unter C weißt man einfach einen Pointer zu, statt unnötig ganze Strings zu kopieren. Peter
@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)!
Sorry, okay vergess wasich geschrieben hab :) Ist ja alles auf dem Schaltplan! Hab nicht richtig geguckt. Danke dir!!!
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 ???
@Peter Dannegger Ist das der Chip in deiner PDF ? http://www.reichelt.de/?SID=26YBy676wQARoAABYt2b0f17129d99395c8f54d08b4297ccebe65;ACTION=3;LA=4;GROUP=A364;GROUPID=2960;ARTICLE=46015;START=0;SORT=artnr;OFFSET=16
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=1 http://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
Ja, aber habe irgendwie Problemde damit. Habe den von Keil und Wicken... schon probiert!
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.
Danke... das habe ich schon soweit verstanden! Ich wollte schon einen der über die r232 komuniziert. Aber das war pedas pdf aber auch so oder nicht ?
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...)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.