www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Compiler für AT89S8253


Autor: HTBL (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht lesenswert
Wieso läuft der SDCC nicht?
Hier funktioniert der wunderbar mit dem 8253er.
Was genau geht denn nicht?

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht lesenswert
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 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.