Forum: Mikrocontroller und Digitale Elektronik SPIEN disable


von Atmega32 (Gast)


Lesenswert?

moin,

ich habe hier an meinem ATmega32 ein paar Steuerausgänge an die Pins 
TCK, TMS, TDO und TDI gehängt.

Programmieren tue ich Mit dem STK500 über die 6-ISP-Buchse.

Am Anfang hat es mit meiner Pinbelegung nicht so geklappt wie es sollte. 
Habe dann im STK-Interface beim Programmieren den Haken bei JTAGEN 
gelöscht.
Damit hat dann zumindest der Pin TCK das getan, was er tun sollte...

Nur wie kriege Ich die Pins TMS, TDO und TDI dazu ihre normale 
Portfunktionalität wahrzunehmen?

Den Haken bei SPIEN kann ich irgendwie nicht löschen...

mfg

von Spess53 (Gast)


Lesenswert?

Hi

>Nur wie kriege Ich die Pins TMS, TDO und TDI dazu ihre normale
>Portfunktionalität wahrzunehmen?

Da hast du wohl noch eien anderen Fehler. Mit dem Löschen der JTAG-Fuse 
werden alle vier Pins freigescaltet.

MfG spess

von MWS (Gast)


Lesenswert?

Atmega32 schrieb:
> Den Haken bei SPIEN kann ich irgendwie nicht löschen...

Das bewahrt Dich vor unbeabsichtigtem Harakiri.

von Falk B. (falk)


Lesenswert?

@Atmega32 (Gast)

>Habe dann im STK-Interface beim Programmieren den Haken bei JTAGEN
>gelöscht.

Richtig, man muss JTAG abschalten.

http://www.mikrocontroller.net/articles/AVR_Fuses#Kompatibilit.C3.A4tsfuses_und_manchmal_l.C3.A4stige_Defaults

>Nur wie kriege Ich die Pins TMS, TDO und TDI dazu ihre normale
>Portfunktionalität wahrzunehmen?

Wie jeden anderen Port, mit DDRx und Portx.

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Zugriff_auf_IO-Ports

>Den Haken bei SPIEN kann ich irgendwie nicht löschen...

Der sollte auch besser so bleiben, wenn du den Controller weiterhin 
programmieren willst.

AVR Fuses.

von Atmega32 (Gast)


Lesenswert?

...derzeit wird meine Schaltung noch über die ISP-Buchse des STK mit 
Energie versorgt.

Bevor ich eine Strippe ziehe:
Kann es sein, dass dies der Grund ist, warum die Portfunktionalität von 
TMS, TDO und TDI derzeit nicht wahrgenommen wird, obwohl der Haken bei 
JTAGEN gelöscht ist?

mfg

von Falk B. (falk)


Lesenswert?

Nein.

von Atmega32 (Gast)


Lesenswert?

>>Den Haken bei SPIEN kann ich irgendwie nicht löschen...
>
>Der sollte auch besser so bleiben, wenn du den Controller weiterhin
>programmieren willst.

Ich dachte bisher, dass über das STK immer eine Verbindung zum 
Controller möglich wäre, man sich damit also garnicht aussperren 
könnte...

von Falk B. (falk)


Lesenswert?

@Atmega32 (Gast)

>Ich dachte bisher, dass über das STK immer eine Verbindung zum
>Controller möglich wäre, man sich damit also garnicht aussperren
>könnte...

Mann kann ihn per STK500 und dessen HV-Programmierung wiederbeleben. 
Aber das ist kein Grund, SPIEN vorsätzlich zu deaktivieren.

von Atmega32 (Gast)


Lesenswert?

ja, dass das Problem bei den SPIEN liegt, war ein Schuss in den Ofen... 
Die ISP-Programmierung findet aschließlich über MOSI, MISO etc. statt...


Also ich habe den Haken JTAGEN auf disable gesetzt.
Die Pins C3, C4 und C5 (TMS, TDO, TDI) machen Schwierigkeiten.


Mein Programm sieht wie folgt aus:
1
#define E1_OFF PORTC |= (1<<PC0)
2
#define E2_OFF PORTC |= (1<<PC1)
3
#define E3_OFF PORTC |= (1<<PC2)
4
#define E4_OFF PORTC |= (1<<PC3)
5
#define E5_OFF PORTC |= (1<<PC4)
6
#define E6_OFF PORTC |= (1<<PC5)
7
#define E7_OFF PORTC |= (1<<PC6)
8
#define E8_OFF PORTC |= (1<<PC7)
9
10
11
#define E1_ON PORTC &=~ (1<<PC0)
12
#define E2_ON PORTC &=~ (1<<PC1)
13
#define E3_ON PORTC &=~ (1<<PC2)
14
#define E4_ON PORTC &=~ (1<<PC3)
15
#define E5_ON PORTC &=~ (1<<PC4)
16
#define E6_ON PORTC &=~ (1<<PC5)
17
#define E7_ON PORTC &=~ (1<<PC6)
18
#define E8_ON PORTC &=~ (1<<PC7)
19
20
int main(void)
21
{
22
DDRC |= ( 1 << DDC0);
23
DDRC |= ( 1 << DDC1);
24
DDRC |= ( 1 << DDC2);
25
DDRC |= ( 1 << DDC3);
26
DDRC |= ( 1 << DDC4);
27
DDRC |= ( 1 << DDC5);
28
DDRC |= ( 1 << DDC6);
29
DDRC |= ( 1 << DDC7);
30
31
while(1)
32
{
33
E1_ON;
34
_delay_ms(500);
35
E1_OFF;
36
37
E2_ON;
38
_delay_ms(500);
39
E2_OFF;
40
41
E3_ON;
42
_delay_ms(500);
43
E3_OFF;
44
45
E4_ON;
46
_delay_ms(500);
47
E4_OFF;
48
49
E5_ON;
50
_delay_ms(500);
51
E5_OFF;
52
53
E6_ON;
54
_delay_ms(500);
55
E6_OFF;
56
57
E7_ON;
58
_delay_ms(500);
59
E7_OFF;
60
61
E8_ON;
62
_delay_ms(500);
63
E8_OFF;
64
}
65
}

von ATmega32 (Gast)


Lesenswert?

...also das Problem ist noch aktuell...

Ich habe mittlerweile drei Wege versucht.

Erstens:
Nur über das JTAGEN Flag wie bereits oben beschrieben. Dort war das 
Resultat, dass ich den TAP-Pin TCK als normalen Portpin nutzen konnte, 
jedoch die Pins TMS, TDO, TDI nicht so geschaltet haben, wie ich es laut 
Programm erwartet hätte.


Zweitens:
Dann habe ich das ganze auch rein über Software versucht auszuschalten 
und das JTD-Bit im MCUCSR gesetzt.

Der Code dafür:

uint8_t mcucsr = MCUCSR;
mcucsr |= (1 << JTD);
MCUCSR = mcucsr;
MCUCSR = mcucsr;

Bei abgeschalteter Optimierung tat sich auf allen vier JTAG-Pins nichts. 
Bei optimaler Optimierung (-0s) hatte ich das gleiche Resultat wie bei 
der ersten Variante, nämlich dass der TCK-Pin funktioniert hat, die 
übrigen drei nicht.


Drittens:
Kombinationen aus Variante 1 und Variante 2 haben dieselben Ergebnisse 
geliefert, allerdings unabhängig vom Grad der Compileroptimierung... war 
ja irgendwie zu erwarten...



Nun gehen mir die Ideen langsam aus, woran es noch liegen kann, dass ich 
die JTAG-Pins nicht alle nutzen kann...

Die Beschaltung ist übrigens bei allen vier Pins identisch über einen 
PMOS-Transistor. Das Messergebnis liegt bei konstant 0V:
1
          +5V    +5V
2
           |      |
3
          100k    |
4
           |      |
5
           |  ||---
6
Pin---10Ohm---|
7
              ||>--
8
                  |
9
                  |
10
               Messung(Leerlauf)

...ich halte es für unwahrscheinlich, dass die drei Pins zerschossen 
wurden... woran also kann es liegen, dass TMS, TDI und TDO nicht 
funktionieren?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

ATmega32 schrieb:
> Bei abgeschalteter Optimierung tat sich auf allen vier JTAG-Pins nichts.

Das ist nicht verwunderlich, weil dann die zeitlichen Randbedingungen
für JTD nicht eingehalten werden.

> Bei optimaler Optimierung (-0s) hatte ich das gleiche Resultat wie bei
> der ersten Variante, nämlich dass der TCK-Pin funktioniert hat, die
> übrigen drei nicht.

Dann hast du noch eine andere Gurke in deiner Hardware.  JTAG ist,
egal ob man es mit JTD oder mit Abklemmen von JTAGEN abschaltet,
ganz sicher nicht mehr aktiv.

von Falk B. (falk)


Lesenswert?

@ ATmega32 (Gast)

>Nun gehen mir die Ideen langsam aus, woran es noch liegen kann, dass ich
>die JTAG-Pins nicht alle nutzen kann...

Wie wäre es, mal DIREKT am Pin zu messen?

>Die Beschaltung ist übrigens bei allen vier Pins identisch über einen
>PMOS-Transistor. Das Messergebnis liegt bei konstant 0V:

Was soll das? Miss erstmal DIREKT am AVR!

Siehe Fehlersuche.

von Karl H. (kbuchegg)


Lesenswert?

1
#define F_CPU 1000000UL
2
3
#include <avr/io.h>
4
#include <util/delay.h>
5
6
int main()
7
{
8
  DDRC = 0xFF;
9
10
  while( 1 )
11
  {
12
    PORTC = 0x00;
13
    _delay_ms( 500 );
14
    PORTC = 0xFF;
15
    _delay_ms( 500 );
16
  }
17
}

damit hast du jetzt erst mal ein Testprogramm, bei dem man nicht 800 
#define nach Tippfehlern absuchen muss.

JTAGEN ist disabled? Dann müssen die Portpins auch toggeln. Wenn nicht, 
dann häng mal deine externe Hardware von den Pins ab.
Erst dann wenns dann immer noch nicht toggelt, würde ich ins Auge fassem 
dass du irgendwie die Outputtreiber geschossen hast. Persönlich würde 
ich das allerdings als eher unwahrscheinlich ansehen, die halten schon 
was aus.

PS: Und schalt das JTAG per FUSE ab!

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.