Atmega <-> XMega PortInit und Abfrage

  • 1
  • 2
  • 3
  • 4
  • 5
  • Page 1 of 5
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

Atmega <-> XMega PortInit und Abfrage

 · 
Posted: 15.05.2012 - 12:16  ·  #1
Hallo Leute,

ich bin über ein Problem gestoßen, in meinen Vorhandenen ATMEGA-Projekt habe ich meine INITs immer in der Form erstellt:

Code

//IN_EthernetModOn
 PortA.0:= 1; //Pullup
 DDRA.0= 1;  // EINGANG

// IN_SOFTRESET PortA.1
 PortA.1:= 1; //Pullup
 DDRA.1= 1;  // EINGANG

// IN_RUNSTOP PortA.2
 PortA.2:= 1; //Pullup
 DDRA.2= 1;  // EINGANG

// IN_TAST1 PortA.3
 PortA.3:= 1; //Pullup
 DDRA.3= 1;  // EINGANG

Diesen Aufbau finde ich wegen der Komentare übersichtlicher für jeden IO.

Zur besseren Übersicht habe ich die Port-Pins wie folgt deklariert:
Code

VAR
// Input  Onboard
   IN_ETHERNET          [@PINA, 0 ] : bit;
   IN_SOFTRESET         [@PINA, 1 ] : bit;
   IN_RUNSTOP           [@PINA, 2 ] : bit;
   IN_SERVTAST          [@PINA, 3 ] : bit;


Beim ATMega läuft das auch richtig, bei er Portierung des vorhandenen Programmcodes läuft es aber auf dem XMEGA256A3 eben nicht! Ich bekomme keine richtigen Werte der PINs.

Erst als ich vor lauter Verzweifelung den INIT-Code wie folgt geändert habe lief es plötzlich ohne Probleme.

Code

//IN_EthernetModOn PortA.0
// IN_SOFTRESET PortA.1
// IN_RUNSTOP PortA.2
// IN_TAST1 PortA.3

// INIT Werte Eingänge
DDRA:= %00001111;
// INIT PULLUP
PORTA:= %00001111;


Aber Warum, das sollte doch eigentlich das gleiche sein oder ?!?!
Oder habe ich was übersehen?
AVRco 5.02

Gruss
Thorsten
rh
Administrator
Avatar
Gender:
Location: Germany
Age: 24
Homepage: e-lab.de
Posts: 5558
Registered: 03 / 2002
Subject:

Re: Atmega <-> XMega PortInit und Abfrage

 · 
Posted: 15.05.2012 - 14:42  ·  #2
Hallo Thorsten,

da läuft irgendwas schief!
In den DDRs eine 1 setzen bedeutet Pin wird zum Ausgang.

rolf
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

Re: Atmega <-> XMega PortInit und Abfrage

 · 
Posted: 15.05.2012 - 18:35  ·  #3
Hallo Rolf.

Das war wieder klar, wenn man mal schnell zwischen "Tür und Angel" schnell was online schreibt und einfach einen Teil aus dem Code kopiert und hier nur mal schnell anpasst und dann natürlich noch den FALSCH angepassten Text mit CopyAndPaste weiter kopiert und anpasst.

Sorry hier noch mal der richtige CodeTeil :)

Die Pins A0-A3 sind Eingänge und die Pins A4-A7 Ausgänge.

So läuft der INIT auf dem ATMEGA ohne Probleme, beim XMEGA erhalte ich keinen richtigen Zustand der PINS.
Code

//IN_EthernetModOn 
 PortA.0:= 1; //Pullup 
 DDRA.0= 0;  // EINGANG 

// IN_SOFTRESET PortA.1 
 PortA.1:= 1; //Pullup 
 DDRA.1= 0;  // EINGANG 

// IN_RUNSTOP PortA.2 
 PortA.2:= 1; //Pullup 
 DDRA.2= 0;  // EINGANG 

// IN_TAST1 PortA.3 
 PortA.3:= 0; //Pullup 
 DDRA.3= 0;  // EINGANG 



Code
VAR 
// Input  Onboard 
   IN_ETHERNET          [@PINA, 0 ] : bit; 
   IN_SOFTRESET         [@PINA, 1 ] : bit; 
   IN_RUNSTOP           [@PINA, 2 ] : bit; 
   IN_SERVTAST          [@PINA, 3 ] : bit; 


Wenn ich es aber so ändere läuft es ohne Probleme!
Code
//IN_EthernetModOn PortA.0 
// IN_SOFTRESET PortA.1 
// IN_RUNSTOP PortA.2 
// IN_TAST1 PortA.3 

// INIT Werte Eingänge 
DDRA:= %11110000; 
// INIT PULLUP 
PORTA:= %0001111; 


Ist doch eigentlich das gleiche oder?
Habe ich da trotz meinem oberen offensichtlichen Schreibfehler doch noch einen Denkfehler?

Gruss
Thorsten
rh
Administrator
Avatar
Gender:
Location: Germany
Age: 24
Homepage: e-lab.de
Posts: 5558
Registered: 03 / 2002
Subject:

Re: Atmega <-> XMega PortInit und Abfrage

 · 
Posted: 15.05.2012 - 19:10  ·  #4
Hallo Thorsten,

folgende Sourcen ergeben den korrekten Maschinencode
Code

 PortA.0:= 1; // Pullup  ->
                        LDI       _ACCA, 001h
                        STS       OUTSETA, _ACCA

 DDRA.0:= 0;  // INPUT   ->
                        LDI       _ACCA, 001h
                        STS       DIRCLRA, _ACCA

 PortA.7:= 1; //         ->
                        LDI       _ACCA, 080h
                        STS       OUTSETA, _ACCA

 DDRA.7:= 1;  // OUTPUT  ->
                        LDI       _ACCA, 080h
                        STS       DIRSETA, _ACCA   

Formal alles korrekt. Ich weiss nicht wo da ein Fehler sein soll...

rolf
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

Re: Atmega <-> XMega PortInit und Abfrage

 · 
Posted: 15.05.2012 - 20:12  ·  #5
Hallo rolf.
Quote by rh

Hallo Thorsten,

folgende Sourcen ergeben den korrekten Maschinencode
Code

 PortA.0:= 1; // Pullup  ->
                        LDI       _ACCA, 001h
                        STS       OUTSETA, _ACCA

 DDRA.0:= 0;  // INPUT   ->
                        LDI       _ACCA, 001h
                        STS       DIRCLRA, _ACCA

 PortA.7:= 1; //         ->
                        LDI       _ACCA, 080h
                        STS       OUTSETA, _ACCA

 DDRA.7:= 1;  // OUTPUT  ->
                        LDI       _ACCA, 080h
                        STS       DIRSETA, _ACCA   

Formal alles korrekt. Ich weiss nicht wo da ein Fehler sein soll...


Ich finde es ja auch merkwürdig, beim ATMEGA läuft das ganz normal, sobald ich das ganze Byte setze läuft alles wunderbar. Also dürfte der XMEGA doch auch keinen Schaden haben!

Ich schaue mir nachher mal den Maschinencode bei beiden Versionen an. Ich habe die ganzen Sachen zum testen zu Hause bei mir.

Beim XMEGA kann ich noch nicht mit dem AVRco Debuggen oder? Ansonsten hätte ich mir mal die Portregister Online angesehen.

Gruss
Thorsten
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

Re: Atmega <-> XMega PortInit und Abfrage

 · 
Posted: 16.05.2012 - 09:53  ·  #6
Hallo Rolf.
Quote by rh

Code

 PortA.0:= 1; // Pullup  ->
                        LDI       _ACCA, 001h
                        STS       OUTSETA, _ACCA

 DDRA.0:= 0;  // INPUT   ->
                        LDI       _ACCA, 001h
                        STS       DIRCLRA, _ACCA

 PortA.7:= 1; //         ->
                        LDI       _ACCA, 080h
                        STS       OUTSETA, _ACCA

 DDRA.7:= 1;  // OUTPUT  ->
                        LDI       _ACCA, 080h
                        STS       DIRSETA, _ACCA   


Der Maschinencode sieht gleich aus, komischerweise laufen seit gestern Abend beide Möglichkeiten nicht mehr?!?!

Ich werde Heute Nachmittag mal einen neuen XMEGA256A3 auf dem STK600 testen, evtl. hat der doch irgendeinen Schaden.

Gruss
Thorsten
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

Re: Atmega <-> XMega PortInit und Abfrage

 · 
Posted: 20.05.2012 - 04:42  ·  #7
Hallo Rolf.

XMEGA ist ausgetauscht, irgendwas stimmt hier nicht.

Auf dem Atmega läuft das setzen von Bits mit incl() und excl() ohne Probleme,
beim XMEGA nicht.

Ich habe jetzt einfach mal ein Variable erzeugt

Code
var
testbyte :byte;
testbit  [@testbyte,2] : bit;

....
loop
//hiermit lasse ich sie mir ausgeben
WriteLn(seroutC0, 'BYTE:'+ByteToBin(testbyte));



und versucht ein BIT im Byte zu setzen:
Code

testbit:= true; // kein Erfolg
testbyte.2:=true; //kein erfolg
testbyte:= testbyte or %00000010;  // kein Erfolg
incl(testbyte,2);  // kein Erfolg
Toggle( Output0Byte, 2); // das geht
testbyte := %00000010;  // das geht


Ist es jetzt nur zu spät (früh) das müsste doch eigentlich alles gehen?!?!
;) evtl. doch die Müdigkeit

Gruss
Thorsten
tramike
 
Avatar
 
Subject:

Re: Atmega <-> XMega PortInit und Abfrage

 · 
Posted: 20.05.2012 - 17:36  ·  #8
Hallo Thorsten,

habs rasch nachgebaut:

Code

Program Test;
Device = XMega256A3U, VCC=3.3;

Import SysTick, Heap, XMegaSupport, SerPortC0;

From System Import Float, Processes, Tasks, Pipes;

Define
  OSCtype        = extXTAL=16000000, PLLmul=8, prescA=1, prescB=2, prescC=1;

  StackSize      = $0800, iData;
  FrameSize      = $0800, iData;
  SysTick        = 10;                {msec}

  SerPortC0      = 57600, Stop1, timeout;
  RxBufferC0     = 250, iData;
  TxBufferC0     = 250, iData;

  Heap           = iData;
  Scheduler      = 10, 10, iData;
  TaskStack      = $0020, iData;
  TaskFrame      = $0010;
  
Implementation
{$IDATA}

Var
  TestByte :Byte;
  TestBit  [@TestByte,2] : Bit;


Begin
  Start_Processes($87);
  Loop
    WriteLn(SeroutC0, '----------');
    TestByte:= 0;
    TestBit:= True; // kein Erfolg
    WriteLn(SeroutC0, 'BYTE0:'+ByteToBin(TestByte));
    TestByte:= 0;
    TestByte.2:=True; //kein erfolg
    WriteLn(SeroutC0, 'BYTE1:'+ByteToBin(TestByte));
    TestByte:= 0;
    TestByte:= TestByte or %00000010;  // kein Erfolg
    WriteLn(SeroutC0, 'BYTE2:'+ByteToBin(TestByte));
    TestByte:= 0;
    Incl(TestByte,2);  // kein Erfolg
    WriteLn(SeroutC0, 'BYTE3:'+ByteToBin(TestByte));
    TestByte := %00000010;  // das geht
    WriteLn(SeroutC0, 'BYTE4:'+ByteToBin(TestByte));
  Endloop;
End Test.


Resultat:
Quote

----------
BYTE0:00000100
BYTE1:00000100
BYTE2:00000010
BYTE3:00000100
BYTE4:00000010


Für mich is das Resultat so, wie ich es erwartet hätte!?

Gruss,
Mike
  • 1
  • 2
  • 3
  • 4
  • 5
  • Page 1 of 5
Selected quotes for multi-quoting:   0

Registered users in this topic

Currently no registered users in this section

The statistic shows who was online during the last 5 minutes. Updated every 90 seconds.
MySQL Queries: 15 · Cache Hits: 14   140   154 · Page-Gen-Time: 0.026201s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI