www.mikrocontroller.net

Forum: Mikrocontroller und Elektronik Compiler für AT89S8253

Autor: HTBL (Gast)
Datum: 21.03.2008 18:00

Hallo!

Welchen Compiler könnt ihr mir für den At89S8253 empfehlen. Ich habe
schon µVision und SDCC ausprobiert. µVision funktioniert einigermaßen,
aber wenn ich z.B. Befehle wie var1=var2&var3; oder mask=mask<<1;
programmieren möchte und das auf den 8253 spiele spinnt er. Im Simulator
jedoch funktioniert alles einwandfrei.
Mit SDCC habe ich überhaupt noch kein Programm zum Laufen gebracht.

Könntet ihr mir hier bitte weiterhelfen.
Autor: Johannes (Gast)
Datum: 21.03.2008 22:01

Wieso läuft der SDCC nicht?
Hier funktioniert der wunderbar mit dem 8253er.
Was genau geht denn nicht?
Autor: Peter Dannegger (peda)
Datum: 21.03.2008 23:23

HTBL wrote:
> µVision funktioniert einigermaßen,
> aber wenn ich z.B. Befehle wie var1=var2&var3; oder mask=mask<<1;
> programmieren möchte und das auf den 8253 spiele spinnt er.

Das ist natürlich ne super-duper Fehlerbeschreibung, mit der absolut
keiner was anfangen kann.

Mach nen compilierbaren und ausprobierten Quelltext als Anhang,
beschreibe, was Du erwartest, das er tun soll und was davon wie
abweicht.


Peter
Autor: HTBL (Gast)
Datum: 22.03.2008 13:47
Dateianhang: projekt.zip (12,3 KB, 19 Downloads)

Ok, ich habe das Projekt angehängt.

Das Programm sollte wenn Schalter_1 ein ist, alle Leds (hängen an Port0
mit R gegen Vcc) löschen.
Ist Schalter_2 aktiv sollte es mit cnt zählen und an den Leds anzeigen.

Aber das Programm funktioniert nicht, die Leds flakern nur. An den
Ausgängen der Ports P0 und P2 liegen ca. 3V und an P3 liegen 5V an.

Ich habe schon so ein Programm ausprobiert.
#include <reg8253.h>
sbit s1 = 0x90;

void main (void)
{
while(1){
if(s1)
{
P0=0;
}
else
{
P0=1;
}
}
}
Dieses Programm hat funktionert. Warum funktioniert aber das angehängte
Programm nicht?
Autor: Peter Dannegger (peda)
Datum: 22.03.2008 15:11

HTBL wrote:

> Dieses Programm hat funktionert. Warum funktioniert aber das angehängte
> Programm nicht?

Weil beide Programme völlig verschieden sind.

Einmal liest Du nur ein Bit ein (0x90 = P1.0).

Und im anderen den ganzen Port P1 mit 0x0F verknüpft. Dein Switch wertet
also P1.0 ... P1.3 aus.


Peter
Autor: C. We. (htbl)
Datum: 22.03.2008 15:38

Das ist mir schon klar, aber trotzdem müsste das Programm doch
funktionieren. Denn ich habe dort doch keinen Programmierfehler drin. Im
Simulator funktioniert mein Programm einwandfrei. Warum am 8253 nicht?
Autor: Peter Dannegger (peda)
Datum: 22.03.2008 15:43

C. We. wrote:
> Das ist mir schon klar, aber trotzdem müsste das Programm doch
> funktionieren.

Ja, was hast Du denn an P1.0 ... P1.3 angeschlossen (Bitmuster)?


> Im
> Simulator funktioniert mein Programm einwandfrei. Warum am 8253 nicht?

Ja, was hast Du denn im Simulator an P1.0 ... P1.3 eingestellt
(Bitmuster)?


Peter
Autor: Peter Dannegger (peda)
Datum: 22.03.2008 15:53

HTBL wrote:
> Aber das Programm funktioniert nicht, die Leds flakern nur. An den
> Ausgängen der Ports P0 und P2 liegen ca. 3V und an P3 liegen 5V an.

Das klingt garnicht gut.

P0 muß 0V* und P2 muß 5V sein, ansonsten versucht der 8051 dort externen
Speicher anzusprechen.

Du hast doch nicht etwa LARGE als Speichermodell ausgewählt, das braucht
externen SRAM.

Beim 89S8253 darfst Du nur SMALL nehmen!


Peter

* 0V, wenn an P0 keine Pullups oder Lasten hängen.
Autor: C. We. (htbl)
Datum: 22.03.2008 16:08

Nein ich habe als Speichermodell Small (2k or less) genommen.

Ich habe nun verschieden Programme versucht.
Anweisungen wie
P0=P1;

//oder

if(0x01==P1)
{
//dann tue das unsw
}
 funktionieren.
Wenn ich aber solche Funktionen
unsigned char port1;
port1=P1;

//oder

if(P1==0x01)
{
//dann mache das unsw
}
programmieren möchte, funktioniert gar nichts.

Dh. die Leds flackern. (Die Leds flackern aber auch wenn man den Chip
erased.)

Warum akzeptiert der µC einfachste Funktionen nicht?
Autor: C. We. (htbl)
Datum: 22.03.2008 16:27

In meinem vorigen Beitrag war etwas nicht ganz richtig.
Die Funktion port1=P1; wird schon akzeptiert. Nur muss port1 extra
deklariert werden und nicht mit anderen Variablen gleichzeitig.

Der Funktionierende Code sieht dann so aus.
#include <reg8253.h>
unsigned char cnt;
unsigned char cnt1;
unsigned char port1;
/* EasyCASE F */
void main()
   {
   TMOD=0x01; //TMOD: GATE1 C/!T1 M11 M01 GATE0 C/!T0 M10 M00
   TCON=0x10; //TCON: TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
   //IE=0x41; //IE: EX0 ET0 EX1 ET1 ES ET2 _ EA
   EA=1;
   ET0=1;
   cnt=0x00;
   while (1)
      {
      P0=~cnt;
      port1=P1;
      //wenn ich port1=port1&0x0F; schreibe hängt sich der Microcontroller auf       
      }
   }
/* EasyCASE F */
void rupt() interrupt 1
   {
   cnt1++;
   if (cnt1>0x03)
      {
   if (cnt>=0xFF)
     {
     cnt=0x00;
     }
   else
     {
        cnt++;
     }   
      cnt1=0x00;
      }

   
Autor: Peter Dannegger (peda)
Datum: 22.03.2008 21:23

EA-Pin auf GND?

Zeig mal das MAP-File, wo Dein Code/Daten liegen.


Wie gesagt, an P2 muß 5V anliegen, wenn Du ihn nicht benutzt.

Ansonsten erfolgen externe Zugriffe, d.h. das Programm kann nicht
funktionieren.


Peter
Autor: C. We. (htbl)
Datum: 23.03.2008 11:30

Hallo!

Ich hab das Programm nun schon zum Laufen gebracht.

KA warum, aber es lag am Programm.

Damit ich die Variable port1 ein Bitweise UND-machen kann, muss ich z.B:
port1&=0x0f; schreiben. Warum port1=port1$0x0f nicht akzeptiert wird
weis ich nicht.
Das selbe gilt fürs Bit verschieben: cnt<<=1;

Irgendwie komisch
Autor: Peter Dannegger (peda)
Datum: 23.03.2008 13:21

C. We. wrote:
> Warum port1=port1$0x0f nicht akzeptiert wird
> weis ich nicht.

Das ; fehlt und $ ist keine gültige C-Operation.


Ich benutze den Keil C51 seit über 10 Jahren und habe noch keine Bugs
festgestellt.

Wenn ein Code ohne Errors und Warnungen compiliert und gelinkt wird und
funktionell richtig scheint, dann poste ihn doch einfach im exakten
Wortlaut als compilierbaren Anhang, damit man den Fehler finden kann.

Und wenn Du Code postest, dann darfst Du aber keine Angst vor
Kommentaren und Funktionsbeschreibungen haben, es soll sich schließlich
ein völlig Fremder da durchfinden.


Peter

Antwort schreiben

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

Wichtige Regeln - erst lesen, dann posten!

  • Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
  • Aussagekräftigen Betreff wählen
  • Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
  • JPEG-Dateien (.jpg) nur für Fotos und Scans verwenden
  • Schaltpläne, Screenshots usw. als PNG oder GIF anhängen

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel






webmaster@mikrocontroller.netImpressumWerbung auf Mikrocontroller.net