Forum: Mikrocontroller und Digitale Elektronik Compiler für AT89S8253


von HTBL (Gast)


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.

von Johannes (Gast)


Lesenswert?

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

von Peter D. (peda)


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

von HTBL (Gast)


Angehängte Dateien:

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.
1
#include <reg8253.h>
2
sbit s1 = 0x90;
3
4
void main (void)
5
{
6
while(1){
7
if(s1)
8
{
9
P0=0;
10
}
11
else
12
{
13
P0=1;
14
}
15
}
16
}
Dieses Programm hat funktionert. Warum funktioniert aber das angehängte 
Programm nicht?

von Peter D. (peda)


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

von C. W. (htbl)


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?

von Peter D. (peda)


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

von Peter D. (peda)


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.

von C. W. (htbl)


Lesenswert?

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

Ich habe nun verschieden Programme versucht.
Anweisungen wie
1
P0=P1;
2
3
//oder
4
5
if(0x01==P1)
6
{
7
//dann tue das unsw
8
}
 funktionieren.
Wenn ich aber solche Funktionen
1
unsigned char port1;
2
port1=P1;
3
4
//oder
5
6
if(P1==0x01)
7
{
8
//dann mache das unsw
9
}
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?

von C. W. (htbl)


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.
1
#include <reg8253.h>
2
unsigned char cnt;
3
unsigned char cnt1;
4
unsigned char port1;
5
/* EasyCASE F */
6
void main()
7
   {
8
   TMOD=0x01; //TMOD: GATE1 C/!T1 M11 M01 GATE0 C/!T0 M10 M00
9
   TCON=0x10; //TCON: TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
10
   //IE=0x41; //IE: EX0 ET0 EX1 ET1 ES ET2 _ EA
11
   EA=1;
12
   ET0=1;
13
   cnt=0x00;
14
   while (1)
15
      {
16
      P0=~cnt;
17
      port1=P1;
18
      //wenn ich port1=port1&0x0F; schreibe hängt sich der Microcontroller auf       
19
      }
20
   }
21
/* EasyCASE F */
22
void rupt() interrupt 1
23
   {
24
   cnt1++;
25
   if (cnt1>0x03)
26
      {
27
   if (cnt>=0xFF)
28
     {
29
     cnt=0x00;
30
     }
31
   else
32
     {
33
        cnt++;
34
     }   
35
      cnt1=0x00;
36
      }

von Peter D. (peda)


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

von C. W. (htbl)


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

von Peter D. (peda)


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

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.