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


von M. B. (m_beffa)


Angehängte Dateien:

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:
1
void main(void)   // Hauptfunktion
2
{  
3
4
 unsigned int system_clock = 0;
5
 unsigned char com_clock = 0;
6
 unsigned char lcd_clock = 0;
7
8
 for(;;)
9
 {
10
   
11
  /*
12
  if(com_clock == 50 & (RS232_send_packet==0)) // Falls 50ms vorbei und letztes Paket gesendet.
13
   {
14
    RS232_send_packet = 1;  // Neues Paket senden.
15
  TI = 1;         // künstlichen Interrupt auslösen
16
  com_clock = 0;  // Takt Zaehler zurück setzen
17
   }
18
   */
19
20
   if(system_clock == 1000) // Jede Sekunde
21
   {  
22
   P1_1 = ~P1_1;  // Blinkled invertieren
23
   system_clock = 0; 
24
   }
25
   
26
27
28
  delay_1ms();  // Hauptzykluszeit
29
  system_clock++; // System Zähler
30
  com_clock++;    // RS232 Takt 
31
  lcd_clock++;
32
    
33
  if(com_clock > 60) // Überlaufschutz
34
   {
35
    com_clock = 0;
36
   }
37
  if(system_clock > 1000) // Überlaufschutz
38
   {
39
    system_clock = 0;
40
   }
41
     
42
 }
43
}


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

von Helmi (Gast)


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

von Matthias (Gast)


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

von M. B. (m_beffa)


Lesenswert?

Besten Dank erstmal für eure Antworten.

Also ich verwende uvision2.


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

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.

von Peter D. (peda)


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

von Matthias (Gast)


Lesenswert?

Welches Speichermodell (Small, Large...) verwendest Du bei Keil?

Matthias

von Helmi (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe mal deine Source durch meinem Compiler gejagt.

Teste es mal aus

Gruss Helmi

von Helmi (Gast)


Angehängte Dateien:

Lesenswert?

Und hier das Hex file

von M. B. (m_beffa)


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.

von Helmi (Gast)


Lesenswert?

Kannst du mal machen

HelmutLenzen@t-online.de

Gruss Helmi

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.