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.
Wieso läuft der SDCC nicht? Hier funktioniert der wunderbar mit dem 8253er. Was genau geht denn nicht?
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
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?
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
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?
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
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.
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?
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 | }
|
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.