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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Denny K. (xorg1990)


Bewertung
0 lesenswert
nicht 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
asm CPL P1.7
Nix, pin immer high.

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

von H.Joachim S. (crazyhorse)


Bewertung
1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Wie schnell geht den das bei euch.

Das habe ich gekonnt übersehen.^^

von Denny K. (xorg1990)


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


Bewertung
1 lesenswert
nicht 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)


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


Bewertung
1 lesenswert
nicht 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)


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


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


Bewertung
-1 lesenswert
nicht lesenswert
Port 1 einlesen
CPL P1.7
Port 1 ausgeben

von Stephan (Gast)


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

von Peter D. (peda)


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


Bewertung
-1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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
 case 0:
        if(isLEDon == 1){
          P1= digi_val[sec1] |~ 0x7f;//led aus
        }else{
          P1= digi_val[sec1];
        }
        dig_ctrl_1 = 0;
        break;

Die Zeit hole ich aus den Display Array
if(firstStart == 1){
       if(digi_val[sec1] == 0x08 && digi_val[sec2] == 0x08){
          isLEDon = 0;//led an
       }
       if(digi_val[sec1] == 0x44){
          isLEDon = 1;//led aus
       }
    }

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
void toggleLed(){
 asm  CPL P1.7
}

von Peter D. (peda)


Bewertung
1 lesenswert
nicht 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. (stefanus)


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

: Bearbeitet durch User
von shigemaru nishiyama (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
Please take look recent code.
You can use P1.7 as other purpose

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.