www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Probleme mit Keil Compiler und 8051


Autor: M. Beffa (m_beffa)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Guten Tag allerseits,

ich versuche eine kleine einfache Software für eine Bedienungseinheit zu 
schreiben. Die Bedienungseinheit ist mit einem 8051 bestückt, genauer es 
ist ein M80C31F von OKI drauf. Zum entwicklen habe ich den WICE M4 Eprom 
Emulator.

Nun zum Problem:

Ich habe bereits Treiber zur Ansteuerung von Display/Tastatur und RS232 
geschrieben. Nur verhält sich der Compiler oder der 8051 sehr 
merkwürdig.

z.b.

habe ich eine ISR die vom Ext Int0 ausgelöst wird (dies geschieht bei 
einem Tastendruck). Der Code in der ISR funktioniert so wie ich mir das 
vorstelle, füge ich jedoch noch weitere Zeilen in die ISR ein, so läuft 
plötzlich das gesammte Programm nicht mehr. (Nicht mal eine Livesign LED 
die eigentlich immer blinken sollte, auf dem Display kommt auch nichts 
mehr, tote hose überall)

Der Compiler jedoch meldet keinen Fehler.

Danach habe ich um zu Testen was denn jetz nicht richtig ist, immer mehr 
Code auskommentiert bis ich nur noch bei diesem Stück war:
void main(void)   // Hauptfunktion
{  

 unsigned int system_clock = 0;
 unsigned char com_clock = 0;
 unsigned char lcd_clock = 0;

 for(;;)
 {
   
  /*
  if(com_clock == 50 & (RS232_send_packet==0)) // Falls 50ms vorbei und letztes Paket gesendet.
   {
    RS232_send_packet = 1;  // Neues Paket senden.
  TI = 1;         // künstlichen Interrupt auslösen
  com_clock = 0;  // Takt Zaehler zurück setzen
   }
   */

   if(system_clock == 1000) // Jede Sekunde
   {  
   P1_1 = ~P1_1;  // Blinkled invertieren
   system_clock = 0; 
   }
   


  delay_1ms();  // Hauptzykluszeit
  system_clock++; // System Zähler
  com_clock++;    // RS232 Takt 
  lcd_clock++;
    
  if(com_clock > 60) // Überlaufschutz
   {
    com_clock = 0;
   }
  if(system_clock > 1000) // Überlaufschutz
   {
    system_clock = 0;
   }
     
 }
}


Aber komischerweise funktioniert nicht mal mehr das! Es sind keine 
Interrupts aktiviert, das Display ist nicht initialisiert, ich will nur 
die LED blinken lasse, (was mit diesem Code schonmal funktioniert hat)

Ich weis echt nicht wo ich noch suchen soll!

Ich denke irgendwas wird hier wegoptimiert oder sowas in der Art.

Ein weiters Sympton ist, wenn ich den Optimierungsgrad runterschalte auf 
3 (Peephole optimization) dann erhalte ich gar kein Hex File mehr, der 
Compiler zeigt folgende Warnung: (ich habe ein Screenshot gemacht)

Ich bin echt mit meinem Latein am Ende.

Ich habe versucht das Problem so gut wie möglich zu beschreiben. Wenn 
jemand aber noch mehr Infos braucht, nur Fragen.

Mit freundlichen Grüssen,
Marco Beffa

Autor: Helmi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Fehlermeldungen die du bekommst sind nur warnungen das die 
entsprechende Code stelle zwar in deinem File eingebunden wird es aber 
darauf kein Aufruf erfolgt. Deshalb wird sie vom Linker ignoriert. Am 
besten du entfernst aus dem Linkfile mal alle Datein die du in der 
abgespeckten Version nicht brauchst. Dann muessten diese Warnmeldung 
verschwinden. Dann kannst du es nochmal testen. Welche version von Keil 
verwendest du uVision2 oder 3 ?
Auch waere es ratsam die sache mal nicht auf der Platine sondern im 
Debugger mal zu testen.

Gruss Helmi

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Probiers mal so:
P1_1 = !P1_1; // Blinkled invertieren
anstelle P1_1 = ~P1_1;  // Blinkled invertieren

(Bei mir läuft Dein Testprogramm, ohne "delay_1ms();", was Du uns 
vorenthälst, blinkt aber sehr schnell.)

P1 kann oft keine LED direkt treiben, vorallem sollte die LED über Rv 
zwischen Portpin und VCC liegen.

Matthias

Autor: M. Beffa (m_beffa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Besten Dank erstmal für eure Antworten.

Also ich verwende uvision2.


hier wäre noch der Code zu den Delay Funktionen:
void delay_1ms(void)   //924 Taktzyklen (bei 11.059MHz) warten
{
 unsigned int zaehler = 0;
 for(zaehler = 0; zaehler < 115; zaehler++);
}

Ehm, die Hardware ist meines Wissens absolut in Ordnung. Mir ist schon 
klar dass der Ausgang nicht direkt eine LED treiben kann. Da ist schon 
ein Transistor dazwischen.

Auch im Debugger habe ich getestet, funktioniert bestens!

Versteht ihr nun mein Problem?


Im Debuger Funktioniert die abgespeckte Version. Auf der Hardware nicht. 
Jedoch blinkt die LED mit nem älteren Version (wovon ich nur noch das 
HEX FIle habe) Die LED und der 8051 kann also nich kapput sein. Es muss 
irgendwo am Compiler liegen.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau mal ins MAP-File, wie die SRAM-Auslastung ist.
Für den Stack sollten noch etwa 16 Byte frei bleiben.

Schau mal ins Startup.a51, was da für den Stack reserviert ist.
Besser da dann 16 Byte eintragen, dann gibts nen Linker-error, wenn die 
nicht mehr da sind.


Peter

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welches Speichermodell (Small, Large...) verwendest Du bei Keil?

Matthias

Autor: Helmi (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe mal deine Source durch meinem Compiler gejagt.

Teste es mal aus

Gruss Helmi

Autor: Helmi (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Und hier das Hex file

Autor: M. Beffa (m_beffa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Peter Dannegger
Wo finde ich das MAP File?
Ich kann im Projekt verzeichniss nur .obj, .lst, .i, .lnp files finden.
Auch ein Startupfile verwende ich nicht. Wie kann ich ein solches 
erstellen?

@Mathias
Ich verwende das SMALL Modell. Mit XDATA steuere ich dann 4 externe 
Bytes an.

@Helmi
Danke vielmals für das Compilieren!
Dein HEX File funktioniert perfekt bei mir.

Das bedeutet dann wohl das definitiv bei meinem Compiler was faul ist!

Hättest du was dagegen wenn ich dir das gesamte Projekt schicke um kurz 
zu versuchen ob auch das funktioniert?


Danke vielmals euch allen.

Autor: Helmi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kannst du mal machen

HelmutLenzen@t-online.de

Gruss Helmi

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.