Guten Tag! Ich habe ein mächtiges Problem mit dem oben genannten Entwicklungsbord. Leider habe ich die A und nicht die B Variante, für die es weit mehr Beispiele gibt und scheinbar auch leichter zu programmieren ist. Kann mir da vllt jemand helfen? Ich würde gerne eine Spannung über den ADC in einen digitalen Wert umwandeln und diesen dann auf einem LCD oder GLCD anzeigen lassen aber ich habe absolut keine Ahnung wie das gehen soll! Könnt ihr mir da eine Seite empfehlen bzw. mir vllt dabei helfen es zu programmieren? Ich wäre euch sehr dankbar! ich verzweifle und das auch noch bei der Hitze... LG Toni
>> It comes with the AT89S8253
Beziehen sich deine Fragen auf den Controller, C oder den Compiler ?
Es handelt sich hierbei nicht um den AT89S8253, sondern um den AT89S8252!!! Was genau dabei der unterschied ist, habe ich nicht herausfinden können aber es wird wohl sicherlich einen geben. Meine Frage bezieht sich auf die Programmierung mit mikroC, wie ich was anspreche usw. da anschließen ist ja mit dem board kein Problem. Ich bräcuhte sozusagen Beispielcode oder besser gleich ein fertiges Projekt, bei dem ich mir das ansehen kann und dann mein eigenes Programm zusammenbauen kann. LG Toni
mikroC werden hier wohl wenige verwenden... typisch ist eher Keil oder SDCC. Der AT89s8252 ist nicht mehr auf dem Markt, der Nachfolgetyp ist der s8253. Unterschiede siehe Datenblatt. http://www.atmel.com/dyn/resources/prod_documents/doc0401.pdf Einen ADC hat der nicht.
Auf dem Entwicklungsboard easy8051A von Mikroelektronika ist ein 12bit ADC vorhanen... Hm... also keine Aussicht auf Erfolg? :(
http://www.mikroe.com/eng/products/view/406/easy8051a/ Software und Beispiele finden sich doch beim Hersteller... wo ist das Problem ?
Ein bischen solltest du selbst lesen... das ist ein Keil Compiler, vermutlich DEMO denn die Beispiele sind für Keil geschrieben. Es wäre auch nett wenn du den ADC angibst, wer mag schon die gesamte Doku lesen.
Entschuldige aber ich habe das wohl überlesen! Sry aber ich bin noch ein blutiger Anfänger und brauche da wohl für den Anfang etwas mehr Hilfe...
>> Sry aber ich bin noch ein blutiger Anfänger und brauche da wohl für den >> Anfang etwas mehr Hilfe... Das geht in Ordnung... sie es als Tip, je genauer du schreibst desto mehr Hilfe bekommst du. Ich würde dir empfehlen den Einstieg mit den Unterlagen zu machen und später auf den SDCC umzusteigen... Der Keil Compiler is recht teuer und die Demo Version in der Codegröße eingeschränkt.
Naja, Unterlagen habe ich leider nicht wirklich außer die verfügbaren PDFs des Herstellers. Das Board gehört der Schule und ich soll damit nun eben etwas Programmieren. Die hat auch die Vollversion von mikroC. Damit habe ich bisher nur blinkende LEDs hinbekommen. Ich habe es auch in sämtlichen Variationen blinken lassen aber das ist ja nun wirklich nicht schwer! Nun soll ich aber eben das Display ansteuern und bekomme es mit dem Beispielcode nicht zum laufen... Mein Lehrer kann oder will mir nicht helfen. Ich denke und hoffe mal, das auslesen des ADC wird am Ende nicht das Problem sein. Der Beispielcode von Mikroelektronika sieht ja folgendermaßen aus: #include <at898252.h> #include <string.h> #include <lcd.h> void main() { LCD_Init(); // Initialize LCD LCD_print("Mikroelektronika");// Write to LCD LCD_Cmd(LCDL2); // Set cursor at begining of the second line LCD_print("LCD example"); while(1); // Stay here } Das mit dem AT89S8253 sieht hingegen so aus: // LCD module connections sbit LCD_RS at P2.B0; sbit LCD_EN at P2.B1; sbit LCD_D7 at P2.B5; sbit LCD_D6 at P2.B4; sbit LCD_D5 at P2.B3; sbit LCD_D4 at P2.B2; // End LCD module connections char txt1[] = "mikroElektronika"; char txt2[] = "Easy8051B"; char txt3[] = "lcd4bit"; char txt4[] = "example"; char i; // Loop variable void Move_Delay() { // Function used for text moving Delay_ms(500); // You can change the moving speed here } void main(){ Lcd_Init(); // Initialize LCD Lcd_Cmd(LCD_CLEAR); // Clear display Lcd_Cmd(LCD_CURSOR_OFF); // Cursor off LCD_Out(1,6,txt3); // Write text in first row LCD_Out(2,6,txt4); // Write text in second row Delay_ms(2000); Lcd_Cmd(LCD_CLEAR); // Clear display LCD_Out(1,1,txt1); // Write text in first row LCD_Out(2,4,txt2); // Write text in second row Delay_ms(500); // Moving text for(i=0; i<4; i++) { // Move text to the right 4 times Lcd_Cmd(LCD_SHIFT_RIGHT); Move_Delay(); } while(1) { // Endless loop for(i=0; i<7; i++) { // Move text to the left 7 times Lcd_Cmd(LCD_SHIFT_LEFT); Move_Delay(); } for(i=0; i<7; i++) { // Move text to the right 7 times Lcd_Cmd(LCD_SHIFT_RIGHT); Move_Delay(); } } } Dieser wird auch korrekt compiliert aber funktioniert eben mit meinen AT89S8253 wohl nicht. Die Pinbelegung passt jedenfalls und vom Codeablauf scheint mir das ach alles einleuchtend... geht eben nur nicht. seufz Leider kann ich also nichts anderes tun als von den Beispielen leben aber die sind bis auf blinkende LEDS für mein Board nicht funktional :( Sry, wenn ich vllt nerve aber es ist als ob ich vor einer rießigen Mauer in einer Einbahnstraße stehe... Gruß Toni
Das kann nicht der Ganze Code sein. Hast du denn das Datenblatt vom Display gelesen. Beispielprogramme für ein solches Display findest du ohne Ende. Eine gute Adresse ist auch http://www.8052.com/
Das müsste schon der ganze Code sein. Ich denke mal, dadurch dass bei dem Beispielprogramm die Bibliotheken Lcd und Lcd_Constants genutzt werden, fällt wohl eine Menge Programmierarbeit weg. Kann man diese vllt irgendwie ansehen? Vllt sind die ja genauso nicht für meinen Mikrocontroller geeignet!? Ich schaue mir erstmal deine empfohlene Seite an. Danke erstmal... Gruß Toni
Hallo Toni, wenn das Beispiel nicht läuft, kann es durchaus sein, daß mit den Unterprogrammen wie z.B. Lcd_Init() was "faul" ist. Wenn die LCD-Module Connections in Deinem Programm neu definiert wurden, müssen, sofern nicht geschehen auch alle! dazugehörigen Routinen neu compiliert werden. Woher soll denn das Unterprogramm bzw. der hier erzeugte Assemblercode die von Dir festgelgte Zuordnung kennen? Wenn die Textausgabe vom Beispiel klappt, dann ist die größte Hürde geschafft. Das mit dem Ausgeben der ADC-Werte klappt dann (fast) schon von alleine..... Eine (sehr) unwahrscheinliche weitere Fehlermöglichkeit, bitte verstehe mich nicht falsch, ich will Dir keine Angst machen oder Dich verunsichern. Überprüfe mal ob das LCD-Display auch zum Beispiel paßt, bzw. noch das "Original-Teil" ist. Leider gibt es ein paar LCD-Display-Typen die nicht den Standard-LCD- Baustein sondern einen sogenannten fast 100% kompatiblen verwenden, das "fast" bedeutet z.B. eine Änderung der Lcd_Init. Letzteres müßte man Dir aber sagen (können), denn das gehört sicher nicht zur Aufgabenstellung. Viel Erfolg!
Nein, es ist alles noch Original, habe ich mir versichern lassen! Wie komme ich in die Init? habe alle ordner duchgesucht und nichts gefunden... Gibt es vllt eine andere Möglichkeit, z.B. einer kostenlosen Entwicklungsumgebung ohne Codebegrenzung oder sowas? Habe meiner Meinung nach alles probiert (jedenfalls was mir in den Kopf gekommen ist) aber nichts hat auch nur anähernd geholfen... Würde momentan am liebsten alles in die Ecke werfen, wenn ich nicht selbst daran interissiert wäre!
http://www.mikroe.com/eng/products/view/406/easy8051a/ Den Link hatte ich dir gegeben und das LCD Beispiel ist dabei. Der fehlende Code befindet sich im h file :-) strange. Wie auch immer, mach dich mit deiner Umgebung vertraut, lese und heul weniger :-) So und jetzt ran ans Display.
Deine Pindefinitionen kannst Du in der Pfeife rauchen, wenn Du sie nirgends im Code verwendest. Schau bitte in ein C-Buch, was "#define xxx yyy" bedeutet. Das Beispiel ist für P0 geschrieben, also mußt Du genau die Pinbelegung verwenden, die im Manual abgebildet ist. Und die Pullups einschalten, der P0 hat keine internen. Peter
>Der AT89s8252 ist nicht mehr auf dem Markt, der Nachfolgetyp ist der >s8253. Unterschiede siehe Datenblatt.... und hier: http://www.atmel.com/dyn/resources/prod_documents/doc3449.pdf Hardwaremäßig sind insbeondere die kleineren Kondensatoren am Quarz von Bedeutung, Pkt. 13. Eingige AT89S8253 laufen auch mit 22-33p, andere nicht.
Yeah!!! =) Hab es hinbekommen mit dem LCD! Es waren nur die Pins falsch angegeben ^^ Für das zweite Beispiel müssen die Pins folgendermaßen belegt sein, dann geht es: sbit LCD_RS at P2.B2; //register select (data/instruction) signal pin sbit LCD_EN at P2.B4; //enable signal pin sbit LCD_D7 at P0.B7; sbit LCD_D6 at P0.B6; sbit LCD_D5 at P0.B5; sbit LCD_D4 at P0.B4; Dann kann ich mich jetzt an das einlesen mit dem ADC machen und vllt auch noch auf dem MMC-Modul zwischenspeichern... Mal sehen, ob das jetzt alles etwas leichter von der Hand geht. Vielen Dank für eure Hilfe! Gruß Toni
Hallo! Also ich habe es ja jetzt hinbekommen den ADC Wert auf meinem 2x16 LCD anzuzeigen und in bestimmte größen umzuwandeln. Allerdings wird der Zweite anzuzeigende Wert nicht korrekt berechnet, obwohl es die gleiche Routine ist. Kann mir vllt mal jemand meinen Fehler im Quellcode zeigen? void main(){ . . . while (1) { // auslesen des ADC Wertes auf Kanal 0 Messung = getADC(0); // Berechnung Gewicht in kg Gewicht = Messung*0.488; //0.488 = 2000kg / 10^12 bit // Zeige Gewicht, 1. Spalte, oben DisplayValue(Gewicht,0); // Berechnung Spannung in V Volt = (Messung* 5) / 4095; // Zeige Volt, 1. Spalte, unten DisplayValue(Volt,2); // 100ms warten Delay_ms(100); . . . } void DisplayValue(unsigned double KWert, unsigned short Kanal) { //zeige Werte auf LCD (4x4 Tabelle) char i, lcdReihe, lcdSpalte; long Wert; //Zuweisung der Kanäle auf dem LCD if (Kanal < 2) //Kanal 1 und 3, erste Spalte lcdReihe=1; else lcdReihe=2; if (Kanal%2 > 0 ) //Kanal 2 und 4, zweite Spalte lcdSpalte=13; else lcdSpalte=4; //für leichtere Darstellung der Nachkommastellen Wert = KWert * 100; //Berechnung vom Dezimal in ASCII (Vorkommastelle) i = Wert /100000 + 48; LCD_Chr(lcdReihe, lcdSpalte, i); Wert %= 100000; i = Wert /10000 + 48; LCD_Chr(lcdReihe, lcdSpalte+1, i); Wert %= 10000; i = Wert /1000 + 48; LCD_Chr(lcdReihe, lcdSpalte+2, i); Wert %= 1000; i = Wert /100 + 48; LCD_Chr(lcdReihe, lcdSpalte+3, i); Wert %= 100; //Kommastelle i = 46; LCD_Chr(lcdReihe, lcdSpalte+4, i); //Berechnung vom Dezimal in ASCII (Nachkommastelle) i = Wert /10 + 48; LCD_Chr(lcdReihe, lcdSpalte+5, i); Wert %= 10; i = Wert + 48; LCD_Chr(lcdReihe, lcdSpalte+6, i); } Wenn ich beispielsweise für die Variable Messung einen festen Wert von 1234 eingebe, erhalte ich auf dem LCD die Anzeige C0= 0602.68 kg C2= 0001.00 V C0 stimmt aber C2 müsste eigentlich 0001.50 V ergeben!!! Außerdem ändert sich C2 nur bei Werten wie 1024 = 1 V; 2048 = 2V usw. Kann mir bitte jemand weiterhelfen? Ich hoffe mein Quellcode ist verständlich! Gruß Toni
keiner eine Idee? Für mich sieht das nämlich alles richtig aus aber wahrscheinlich sehe ich den Wald vor lauter Bäumen nicht mehr...
OK, ich hab es... komische Lösung aber naja, es funktioniert! Also, wenn ich die Rechnung nicht direkt mit dem vom ADC ausgegebenen Messwert mache, sondern diesen Wert erstmal auf eine weitere Variable lege, dann geht das: double Gewicht = 0; Gewicht = Messung; // Berechnung Gewicht in kg Gewicht = Gewicht * 0.48840049; DisplayValue(Gewicht,0); Volt = Messung; Volt = Volt * 5 / 4095; DisplayValue(Volt,2); Delay_ms(100); Dennoch hätte ich noch eine Frage zu einen anderen Problem. Also ich wollte in der Main das Gewicht speichern, immer dann, wenn es sich ändert. Dazu habe ich bisher nur folgenden Code (bisher nur einmaliges Speichern): //Speichern auf EEPROM Eeprom_Write(0x100, Gewicht); //Weiterleiten der Daten an serielle Schnittstelle handshake = 0x00 ; handshake = Uart_Read() ; // Software Handshake if(handshake == 0xDF) // Handshake erfolgreich { // Daten senden an serielle Schnittstelle Uart_Write(Eeprom_Read(0x01)) ; } aber dadurch werden völlig andere Werte gespeichert. Kann mir jemand sagen warum? Vllt könnt ihr mir wenigstens einen Pseudocode geben, mit dem ich das realisieren könnte!? Ich bin für jede Hilfe und jedem Ratschlag sehr dankbar! Gruß Toni
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.