Forum: Mikrocontroller und Digitale Elektronik easy8051A Programmierung mit mikroC V1.0


von Toni (Gast)


Lesenswert?

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

von Bernd N (Gast)


Lesenswert?

>> It comes with the AT89S8253

Beziehen sich deine Fragen auf den Controller, C oder den Compiler ?

von Toni (Gast)


Lesenswert?

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

von Bernd N (Gast)


Lesenswert?

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.

von Toni (Gast)


Lesenswert?

Auf dem Entwicklungsboard easy8051A von Mikroelektronika ist ein 12bit 
ADC vorhanen...
Hm... also keine Aussicht auf Erfolg? :(

von Bernd N (Gast)


Lesenswert?

http://www.mikroe.com/eng/products/view/406/easy8051a/

Software und Beispiele finden sich doch beim Hersteller... wo ist das 
Problem ?

von Bernd N (Gast)


Lesenswert?

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.

von Toni (Gast)


Lesenswert?

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

von Bernd N (Gast)


Lesenswert?

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

von Toni (Gast)


Lesenswert?

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

von Bernd N (Gast)


Lesenswert?

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/

von Toni (Gast)


Lesenswert?

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

von Guter Rat (Gast)


Lesenswert?

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!

von Toni (Gast)


Lesenswert?

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!

von Bernd N (Gast)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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

von Matthias K. (matthiask)


Lesenswert?

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

von Toni (Gast)


Lesenswert?

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

von Toni (Gast)


Lesenswert?

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

von Toni (Gast)


Lesenswert?

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

von Toni (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.