Forum: Mikrocontroller und Digitale Elektronik AT89C2051 pin P1.7 bug?


von Denny K. (xorg1990)


Lesenswert?

Hallo Leute, ich habe mir im Internet diese "SHE-879 clock6" gekauft.
Basierend auf dem AT89C2051.

Bei der Uhr ist noch der Pin P1.7 frei, denn möchte ich gerne aller 
vollen Minute toggeln.

Den Original code gibt es auf github:
https://github.com/KUMIKOMINOSATO/Clock6


Ich bekomme den Pin nicht getoggelt, der  ist immer high. Egal was ich 
schreibe,
habe alle möglichkeiten durch

Programmieren/Compilieren tue ich ebenfalls mit MikroC Pro for 8051.

Durch zufall bin ich auf diesen Beitrag gestoßen:
https://forum.mikroe.com/viewtopic.php?f=48&t=71679

Er hat das dann wohl über diesen uc51 Compiler gelöst.
Ich komme mit dem uc51 Compiler absolut nicht klar.

Ich habe noch auf eine Inline Assembler Methode zurückgegriffen
1
asm CPL P1.7
Nix, pin immer high.

Kennt einer eine Lösung für das Problem??

von H.Joachim S. (crazyhorse)


Lesenswert?

void timer1() iv IVT_ADDR_ET1 ics ICS_AUTO {
//Function to display the number using seven segmnet multiplexing. For 
more details refer seven segment multiplexing.

    TL1=VALTL1;        //Reloading Timer1
    TH1=VALTH1;
    if(timer250us.B4==4){
        if(timer8ms==0){
            timer8ms=1;
            ++timer_1_cnt;
        }
    }else{
          timer8ms =0;
    }
    P3=0xbf;
    P1=0xff;      <----

von Denny K. (xorg1990)


Lesenswert?

Wie schnell geht den das bei euch.

Das habe ich gekonnt übersehen.^^

von Denny K. (xorg1990)


Lesenswert?

Ok, jetzt stellt sich natürlich die Frage, wie ich aller vollen Minute 
den Pin für 1sec auf low stelle.

Ich bin leider in Sachen 8051 nicht bewandert.

Wenn ich den Timer stoppe und P1 auf 0 stelle, ist der pin immer noch 
auf High. Auf den Display steht dann eine 8, alles andere ist aus.

Wenn die Anzeige für 1sec stehen bleibt wäre das kein Problem.
Nur die Zeit darf nicht aus dem Ruder geraten.

von H.Joachim S. (crazyhorse)


Lesenswert?

Denny K. schrieb:
> Wenn ich den Timer stoppe und P1 auf 0 stelle, ist der pin immer noch
> auf High.

Das kann nicht sein.

Denny K. schrieb:
> Ok, jetzt stellt sich natürlich die Frage, wie ich aller vollen Minute
> den Pin für 1sec auf low stelle.

Erstmal musst du die Portzugriffe in der ISR verändern, nicht stumpf den 
ganzen Port beschreiben, sondern P1.7 nicht mit anpacken.

P1=P1 | 0x7f;

Und bei der Segmentausgabe auch:

P1=P1 & digi_val[sec1];

von Denny K. (xorg1990)


Lesenswert?

H.Joachim S. schrieb:
> Denny K. schrieb:
>> Wenn ich den Timer stoppe und P1 auf 0 stelle, ist der pin immer noch
>> auf High.
>
> Das kann nicht sein.
Anscheint doch. Wenn die Anzeige ein mal ein war, bekomme sie 
anschließend nur noch auf 00:00:00 gestellt oder auf 88:88:88;


Wenn die Anzeige nur noch 88:88:88 zeigt ist ja alles an oder aus (je 
nach Anzeige typ)
Wenn  nun alle bits in p1 drehe geht alles aus bis auf das zweite 
Segment der Stunde.

Den Pin P1.7 kann ich nach wie vor nicht toggeln.

von Stefan F. (Gast)


Lesenswert?

Dieser Mikrocontroller ist so alt, da kannst du 1000% sicher sein, dass 
die I/O Ports so funktionieren, wie sie sollen.

von Peter D. (peda)


Lesenswert?

Code läßt sich schlecht in Prosa nachvollziehen.
Häng mal den kompletten neuen Code an.
Aber bloß nicht einfügen !!!

von S. R. (svenska)


Lesenswert?

Das Datenblatt sagt, dass P1.7 ein ganz normaler I/O-Pin ist, genauso 
wie P1.6 und P1.5 auch.

Das heißt, dass du folgendes prüfen musst:
- den Code, wo der Port initialisiert wird
- den Code, wo der Port beschrieben wird
- die Schaltung, die an dem Pin hängt.

Wenn der Pin an einem kleinen Pullup bzw. Vcc angeschlossen ist, dann 
kann der Controller daran zerren wie er lustig ist, hinten kommt immer 
ein High (manchmal stärker, manchmal schwächer) raus und die Treiber 
sind möglicherweise schon hinüber.

Der Code muss jetzt außerdem den Pin berücksichtigen. Wenn er das bisher 
nicht gemacht hat, musst du jeden einzelnen Zugriff durchgehen und 
sicherstellen, dass du da keinen Unfug ausgibst.

von Stephan (Gast)


Lesenswert?

Port 1 einlesen
CPL P1.7
Port 1 ausgeben

von Stephan (Gast)


Lesenswert?

Du musst den Port ausgeben sonst wird zwar das Register getoggelt das 
Bit erscheint aber nicht am Port.

von Peter D. (peda)


Lesenswert?

Stephan schrieb:
> Port 1 einlesen
> CPL P1.7
> Port 1 ausgeben

Dann hast Du nur einen Puls von 2 Zyklen Länge auf P1.7.

Stephan schrieb:
> Du musst den Port ausgeben sonst wird zwar das Register getoggelt das
> Bit erscheint aber nicht am Port.

Das ist Quark.
Natürlich wirken alle Befehle auf SFRs auch auf die Ports.

von Stephan (Gast)


Lesenswert?

Peter D. schrieb:
> Dann hast Du nur einen Puls von 2 Zyklen Länge auf P1.7.

Solange auf der 97h kein anderer was macht wüsste ich nicht warum das so 
sein sollte. Wer sollte den Wert ändern? Solange das nicht in der 
schleife läuft.

Peter D. schrieb:
> Stephan schrieb:
>> Du musst den Port ausgeben sonst wird zwar das Register getoggelt das
>> Bit erscheint aber nicht am Port.
>
> Das ist Quark.
> Natürlich wirken alle Befehle auf SFRs auch auf die Ports.

Da hast Du Recht. Hatte jetzt nicht im Kopf das dort Bitadressierbarer 
Bereich ist.

von Denny K. (xorg1990)


Lesenswert?

Danke erst mal für die nette Unterstützung, habe nun selbst eine Lösung 
gefunden. Aber eine Sache funktioniert doch noch nicht.

In den ganzen switch case Baum habe ich if´s eingebaut
1
 case 0:
2
        if(isLEDon == 1){
3
          P1= digi_val[sec1] |~ 0x7f;//led aus
4
        }else{
5
          P1= digi_val[sec1];
6
        }
7
        dig_ctrl_1 = 0;
8
        break;
Die Zeit hole ich aus den Display Array
1
if(firstStart == 1){
2
       if(digi_val[sec1] == 0x08 && digi_val[sec2] == 0x08){
3
          isLEDon = 0;//led an
4
       }
5
       if(digi_val[sec1] == 0x44){
6
          isLEDon = 1;//led aus
7
       }
8
    }

firstStart wird auf 1 gesetzt sobald die erste Sekunde angelaufen ist. 
Sonst habe ich gleich nach den Einschalten einen Pin toggle.

Das funktioniert wenn die Anzeige ein ist.

Wenn aber in den mode = 1 gehe also das Display aus ist toggled die LED 
aller 10 sec.
Wieso eigentlich?
sec1 und sec2 sollten doch genau so schnell laufen.


Für den Fall mode = 1 habe ich natürlich eine extra Pin toggle Funktion
1
void toggleLed(){
2
 asm  CPL P1.7
3
}

von Peter D. (peda)


Lesenswert?

Denny K. schrieb:
> Aber eine Sache funktioniert doch noch nicht.

Peter D. schrieb:
> Häng mal den kompletten neuen Code an.
> Aber bloß nicht einfügen !!!

Ist das denn so schwer zu verstehen?

von Stefan F. (Gast)


Lesenswert?

0x7f 0x08 0x44 sagt mir gar nichts. Das ist genau so Kryptisch, wie eine 
Durchsage im Kaufhaus: "12 bitte 101"

Benutze Konstanten mit Namen, damit der Quelltext lesbar wird.

von shigemaru nishiyama (Gast)


Lesenswert?

Please take look recent code.
You can use P1.7 as other purpose

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.