Forum: Mikrocontroller und Digitale Elektronik 2 PINS an dem PORTC besitzen ein dauerhaftes High Signal


von MichaelS (Gast)


Lesenswert?

Hallo ich bin neu auf dem Gebiet Mikrocontroller
Ich bin gerade an einem 4x4x4 RGB LED Cube am basteln, jetzt habe ich 
eine Platine angefertigt mit einem ATMEGA 32 16PU. Jetzt wollte ich Ihn 
programmieren aber das Problem ist, dass der Mikrocontroller an den PINS 
PC2(TCK)und PC3(TMS) trotz PORTC=0x00; ein High Signal liefert. Weis 
zufällig jemand an was dies liegen könnte ???

von Stefan S. (chiefeinherjar)


Lesenswert?

Ist JTAG aktiv?! Denn die Pins gehören zu dieser Schnittstelle.

Die Fuse dazu heißt JTAGEN.

von MichaelS (Gast)


Lesenswert?

Was ist dieses JTAG wie gesagt ich bin neu in diesem Gebiet

von Stefan S. (chiefeinherjar)


Lesenswert?

Dann schau dir mal an, welche Fuses gesetzt sind bzw poste sie, wenn du 
dir nicht sicher bist.

Ansonsten steht der Rest im Datenblatt.

von Blinky (Gast)


Lesenswert?

JTAG ist eine Schnittstelle für Debugging Zwecke.
Beim Programmieren eines AVR Mikrocontrollers können bestimmte Flags 
gesetzt werden (Fuses) welche verschidene Einflüsse auf den 
Mikrocontroller haben.
Wenn diese Schnittstelle aktiv ist, dann werden die Ports davon belegt 
und das Setzen des Ports im Programm wird ignoriert.
Siehe auch hier: https://www.mikrocontroller.net/articles/AVR_Fuses

von MichaelS (Gast)


Angehängte Dateien:

Lesenswert?

Wie meinst du das mit Fuses gesetzt??

von Axel S. (a-za-z0-9)


Lesenswert?

MichaelS schrieb:
> Wie meinst du das mit Fuses gesetzt??

"FUSE" (das englische Wort für "Sicherung") bezeichnet 
Konfigurationsbits der AVR Mikrocontroller. Mit diesen Bits kann man 
z.B. festlegen, mit welcher Taktquelle der AVR nach dem Reset losläuft, 
und ob bestimmte Programmierschnittstellen aktiv sein sollen oder nicht.

Beim ATmega32 ist die JTAG-Schnittstelle standardmäßig aktiviert (ja, 
per Fuse) und belegt dann die Pins PC2 und PC3. Du mußt sie 
deaktivieren, dann kannst du die Pins auch aus deinem Programm heraus 
verwenden.

Details findest du im Artikel AVR Fuses

von MichaelS (Gast)


Lesenswert?

Dankeschön für diese Nachricht um diese Fuses deaktivieren zu können 
gibt es doch bestimmt einen Code könnten sie mir diesen sagen ??

von K. S. (the_yrr)


Lesenswert?

es gibt keinen Code, das muss per ISP gemacht werden, womit 
programmierst du den µC denn (welche Software und welchen 
Programmieradapter?).
Dann können wir dir auch sagen wo du die Fuses ausliest und wieder 
setzen kannst.

von Dergute W. (derguteweka)


Lesenswert?

Moin,

K. S. schrieb:
> es gibt keinen Code,

Das glaube ich nicht, Tim.


Probiers mal damit, irgendwann recht "frueh" im Programm (obacht, nicht 
dass in r28 schon irgendwas wichtiges steht...):
1
in r28, 0x34
2
ori r28,0x80
3
out 0x34,r28
4
out 0x34,r28; enable port C lines; disable JTAG

Also das MSB im MCUCSR Register setzen und zwar 2x direkt 
hintereinander, sollte JTAG abschalten.
Steht auch im Datenblatt bei der Beschreibung des MCUCSR Registers.

Gruss
WK

von Carl D. (jcw2)


Lesenswert?

Dergute W. schrieb:
>
1
in r28, 0x34
2
> ori r28,0x80
3
> out 0x34,r28
4
> out 0x34,r28; enable port C lines; disable JTAG

oder eben
1
   uint8_t tmp = MCUCSR | (1<<JTD);
2
   MCUCSR = tmp;
3
   MCUCSR = tmp;
Die tmp Variable sorgt dafür, daß die Regel "2x in 4 Takten" eingehalten 
wird.

von c-hater (Gast)


Lesenswert?

Carl D. schrieb:

> Dergute W. schrieb:
>>
1
in r28, 0x34
2
>> ori r28,0x80
3
>> out 0x34,r28
4
>> out 0x34,r28; enable port C lines; disable JTAG
>
> oder eben
>
1
>    uint8_t tmp = MCUCSR | (1<<JTD);
2
>    MCUCSR = tmp;
3
>    MCUCSR = tmp;
4
>
> Die tmp Variable sorgt dafür, daß die Regel "2x in 4 Takten" eingehalten
> wird.

Nein, tut sie nicht, jedenfalls NICHT garantiert. Denn: keine einzige 
Stelle im C-Standard garantiert dies, es wird überhaupt niemals 
irgendein konkretes Timing garantiert.

Übrigens: auch der Asm-Code vom guten Weka garantiert dies nicht unter 
allen Umständen, nämlich dann nicht, wenn gerade im falschen Moment ein 
Interrupt ausgelöst wird. Wenn man allerdings das Nicht-Vorkommen eines 
Interrupts im Initialisierungsteil eines Programms als gegebene 
Randbedingung ansieht (weil sinnvoll), dann GARANTIERT der 
Assemblercode tatsächlich die Einhaltung des timing constraint.

Warum sollte man also den Code so verfassen, dass das Timing nicht 
garantiert ist, wenn man ihn auch so schreiben kann, dass das der Fall 
ist?

Nur merkbefreite C-only-Apologeten kommen auf so einen Unsinn.

von Stefan F. (Gast)


Lesenswert?

c-hater schrieb:
> Nur merkbefreite C-only-Apologeten kommen auf so einen Unsinn.

Die anderen kennen ihren Compiler und verlassen sich zu Recht auf 
gewisse Eigenschaften. Der avr-gcc implementiert nicht nur den C 
Standard, sondern auch einige Dinge, die ganz spezifisch für AVR sind. 
Dies hier ist so ein Punkt.

von Peter (Gast)


Lesenswert?

K. S. schrieb:
> es gibt keinen Code, das muss per ISP gemacht werden, womit
> programmierst du den µC denn (welche Software und welchen
> Programmieradapter?).
> Dann können wir dir auch sagen wo du die Fuses ausliest und wieder
> setzen kannst.

Natürlich geht das auch bequem per Code solange über ISP programmiert 
wird.

von c-hater (Gast)


Lesenswert?

Stefanus F. schrieb:

> Die anderen kennen ihren Compiler und verlassen sich zu Recht auf
> gewisse Eigenschaften. Der avr-gcc implementiert nicht nur den C
> Standard, sondern auch einige Dinge, die ganz spezifisch für AVR sind.
> Dies hier ist so ein Punkt.

Aha, und wo genau kann man in der avr-gcc-Doku nachlesen, dass genau 
diese Eigenschaft garantiert wird?

Im Übrigen: selbst wenn sich (wider Erwarten) so eine Stelle finden 
sollte, macht es immer noch keinen Sinn, das in C zu schreiben. Könnte 
ja einer auf die Idee kommen, einen anderen Compiler verwenden zu 
wollen. Soll's geben...

Ja mehr noch: das soll ja sogar gerade der ultimative Vorteil von C 
sein, dass genau das möglich ist, die allzeit hochgelobte 
"Portabilität"...

Natürlich ist auch der Assemblercode nicht portabel. Aber da knallt's 
dann wenigstens schon beim Compilieren/Assemblieren, wenn's nicht 
passt...

von Stefan F. (Gast)


Lesenswert?

Wir kennen deinen Standpunkt, es besteht kein Bedarf, ihn alle zwei 
Wochen erneut zu diskutieren.

von S. Landolt (Gast)


Lesenswert?

Stefan F. schrieb:

> Wir kennen deinen Standpunkt ...

So ist es. Aber es scheint doch immer irgendwie Spaß zu machen, darauf 
zu reagieren, nicht wahr?

von Stefan F. (Gast)


Lesenswert?

S. Landolt schrieb:
> es scheint doch immer irgendwie Spaß zu machen, darauf
> zu reagieren, nicht wahr?

Ja, solange es nicht in Beleidigungen ausartet. Momentan geht es noch.

von H.Joachim S. (crazyhorse)


Lesenswert?

Carl D. schrieb:
> oder eben   uint8_t tmp = MCUCSR | (1<<JTD);
>    MCUCSR = tmp;
>    MCUCSR = tmp;
> Die tmp Variable sorgt dafür, daß die Regel "2x in 4 Takten" eingehalten
> wird.

Und der würde nicht einen der beiden Befehle wegoptimieren? Logisch ist 
es ja erstmal sinnlos (es sei denn er erkennt, dass es z.B. im Fall des 
MCUCSR Sinn macht).
Ich setze dann lieber
#pragma opt-
.
.
#pragma opt+
ein

von Rolf M. (rmagnus)


Lesenswert?

c-hater schrieb:
> Nein, tut sie nicht, jedenfalls NICHT garantiert. Denn: keine einzige
> Stelle im C-Standard garantiert dies, es wird überhaupt niemals
> irgendein konkretes Timing garantiert.

Allerdings müsste ein Compiler schon sehr ungünstig implementiert sein, 
damit das nicht klappt. Ich würde hier aber tatsächlich auch ein in 
inline-Assembler implementiertes Makro schreiben.
Für den Fall von Timings, wo man wirklich einzelne Taktzyklen zählen 
muss, halte ich C auch nicht für geeignet.

H.Joachim S. schrieb:
> Carl D. schrieb:
>> oder eben   uint8_t tmp = MCUCSR | (1<<JTD);
>>    MCUCSR = tmp;
>>    MCUCSR = tmp;
>> Die tmp Variable sorgt dafür, daß die Regel "2x in 4 Takten" eingehalten
>> wird.
>
> Und der würde nicht einen der beiden Befehle wegoptimieren?

Nein, darf er nicht. Alle Zugriffe auf MCUCSR müssen durchgeführt 
werden, da MCUCSR volatile ist. Das ist garantiert.

> Logisch ist es ja erstmal sinnlos (es sei denn er erkennt, dass es z.B.
> im Fall des MCUCSR Sinn macht).

Wie gesagt: Wenn etwas volatile ist, dürfen Zugriffe darauf niemals 
wegoptimiert werden.

> Ich setze dann lieber
> #pragma opt-
> .
> .
> #pragma opt+
> ein

Das könnte auch nach hinten losgehen. Wenn dadurch noch zusätzliche 
eigentlich überflüssige, aber nicht wegoptimierte Instruktionen drin 
bleiben, die dir dann das Timing zerhauen.

von Stefan F. (Gast)



Lesenswert?

c-hater schrieb:
> Aha, und wo genau kann man in der avr-gcc-Doku nachlesen, dass genau
> diese Eigenschaft garantiert wird?

Kann ich Dir nicht sagen, aber ich weiss wo das Datenblatt des ATmega328 
einen ähnlichen Fall beschreibt. Siehe Anhang.

Wenn so etwas im Datenblatt steht, dann kann man sich darauf verlassen.

von Carl D. (jcw2)


Lesenswert?

Eigentlich wollt ich ja nur die Assemblerzeilen für den offenbar in C 
schreibenden TO aufbereiten. Aber auf die(/den) ganz speziellen 
Spezialisten kann man sich verlassen.

Stefanus F. schrieb:
> c-hater schrieb:
>> Aha, und wo genau kann man in der avr-gcc-Doku nachlesen, dass genau
>> diese Eigenschaft garantiert wird?
>
> Kann ich Dir nicht sagen, aber ich weiss wo das Datenblatt des ATmega328
> einen ähnlichen Fall beschreibt. Siehe Anhang.
>
> Wenn so etwas im Datenblatt steht, dann kann man sich darauf verlassen.

Das Datenblatt (Mega32, der Mega328 hat ja kein JTAG) beschreibt nur, 
welches Timing eingehalten werden muß.
Meine "Garantie" fußt eher auf dem volatilen Register (wie schon weiter 
oben von jemand bemerkt, sowie der Beobachtung über mehrere 
Compilergenerationen hinweg, daß das AVR-Compilerbackend des GCC kein 
Problem damit hat, eine Zuweisung auf ein Register mit Io-Adresse unter 
0x40 in das passender eine Assemblerstatement umzuwandeln. Deshalb auch 
eine doppelte Zuweisung und kein doppeltest verOdern.

von Thomas E. (thomase)


Lesenswert?

c-hater schrieb:
> Nur merkbefreite C-only-Apologeten kommen auf so einen Unsinn.

Haty, ich wünsche dir ein Frohes Neues Jahr. Halt die Ohren und das, 
worauf es noch ankommt, steif und lass dich von den bösen 
C-Programmierern nicht unterkriegen. Du schaffst es. Ich zähl auf dich.


PS: Enttäusch mich nicht. Ich hab einen 5er gesetzt, daß du auch 2019 
keinen Herzinfarkt bekommst.

: Bearbeitet durch User
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.