Switchport läuft bei mit nicht auf dem XMEGA

ThomasW69
 
Avatar
 
Subject:

Switchport läuft bei mit nicht auf dem XMEGA

 · 
Posted: 05.04.2014 - 17:06  ·  #1
Hallo zusammen. Ich bräuchte mal Hilfe beim Switchport. Ich habe an einem XMEGA256A3BU am PortA 4 Taster (Bit 3 bis 6) die gegen Low gezogen werden. Die arbeiten auch ordentlich, der Pegel geht sauber von 3,3V auf 0V beim Drücken. Dennoch liefert INP_STABLE1(x) kein Ergebnis. hab schon alle möglichen Sachen ausprobiert und weiß nicht mehr weiter.
Hier mal mein aktueller Code.

Code

program Stepperfoc3;

Device = xmega256A3BU, VCC=3.3;
{ $BOOTRST $20000}         {Reset Jump to $20000}

Define_Fuses
  Override_Fuses;
  NoteBook               = D;
  COMport                = USB;
  LockBits0 = [];   // protect boot and app against read back
  FuseBits0 = [];
  FuseBits1 = [];
  FuseBits2 = [];                         // mandatory !!

  // Brown-out is obligatory with USB !!!
  FuseBits5              = [BODACT0, BodLevel0, BodLevel1, BodLevel2];


Import SysTick, FlashWrite, SwitchPort1, SerportF0, TickTimer,USBSmart,QDEC_C0;
Import WatchDog,StepL6470;
From System Import LongWord, LongInt,Float, Processes, Tasks, Pipes, {SwitchPTimer1,} FlashCheck_S, FlashCheck_B;
From SerPort Import SerPortSelect;



Define
  // XMega USB must use the internal 32MHz OSC. So the system must use the 2MHz OSC
  // Wegen USB Port
  OSCtype                = int2MHz,
                           PLLmul = 16,
                           prescB = 1,
                           prescC = 1;

  SysTick        = 10,User;             {msec}
  StackSize      = $0080, iData;
  FrameSize      = $0080, iData;
  Scheduler      = iData;
  TaskStack      = $0020, iData;
  TaskFrame      = $0010;
  FlashChksum    = ProgEnd;        {or absolute address}
  TickTimer      = Timer_C1;


  SerPortF0        = 56000,Stop1,timeout;    {Baud, StopBits|timeout}
  RxBufferF0       = 64, iData;
  TxBufferF0       = 64, iData;

  
  //QuadraturDecoder
  QDECphase_C0 = PortD, 0, 1;                  // Port, Phase0, Phase90 input pin
  QDECres_C0 = 32;                             // Resolution QDEC C0, 16 or 32
  QDECevChan_C0 = 1;                           // 0..7

  Watchdog       = msec2000; //Watchdog auf 2 Sek setzen.

  SwitchPort1    = PinA;
  PolarityP1     = %10000111;            // polarity
  Debounce       = 5;

  //Definitionen für die USB Schnittstelle
  USBmanufact            = 'xxxx';       // max 31 bytes
  USBprodName            = 'xxx';           // "     "
  USBpid                 = 30;
  USBvid                 = $0569;
  USBprodRel             = 300;
  USBcurrent             = 200;
  USBvBUS                = PortC.0;                 // port and pin

  StepL6470drvs  = 1;                    // driver stage count
  StepL6470port  = SPI_Soft, PortB.2, PortB.3, PortB.4;
  StepL6470SS_1  = PortB.5, PortB.7;   // chipselect and SingleStep pin      //ToDo


uses uL6470,lcd144Ser;


Implementation

{$IDATA}

{--------------------------------------------------------------}
{ Type Declarations }

type
  tBuf64                 = Array[0..63] of byte;



{--------------------------------------------------------------}
{ Const Declarations }
const
  //Downloader ID muss mit der im Bootloader übereinstimmen, damit Firmware
  //geflasht werden kann
  DownLoaderID : word   = $1234;           // mandatory constant

{--------------------------------------------------------------}
{ Var Declarations }
{$IDATA}
var
  // these two buffers must be aligned to even addresses !!
  RxBuf                 : tBuf64, align2;  // USB incomming Buffer
  TxBuf                 : tBuf64, align2;  // USB outgoing Buffer
  usbCommand            : byte;
 
 {--------------------------------------------------------------}
{ functions }

{--------------------------------------------------------------}
  //  User function to receive EP0 ControlRequests from Host
Function myUSB_ControlRequest(bRequest : Byte; wValue : word) : boolean;
// need always answer from device
begin
  usbCommand:=bRequest;
  case (bRequest) of
    $00 : // do a real RESET
          USB_ControlSend(nil, 0);
          mDelay(100);
          HardWareReset;
        |
  else
    USB_ControlSend(nil, 0);  // unknown vendor request, do an ACK
    Return(true);
  endcase;
end;

{--------------------------------------------------------------}
Procedure USB_CheckRxTx;
Var Count, C: byte;
begin
  if USB_RxDataAvail then
    Count:= USB_RxCount;
    c:=RXBuf[0];
    //writeln(Serout,'USBChar:'+bytetostr(c));
    //writeln(Serout,'USBCount:'+bytetostr(count));
    case C of
    $02:   //IPAdressen aus dem USBPuffer in den EEprom
          // writeln(serout,'USBConfig');
      //     CopyBlock(@rxBuf+1,@elocalIP,4);
          // writeln(serout,'IP:'+IPToStr(elocalIP));
      //     CopyBlock(@rxBuf+5,@eremoteIP,4);
      //     CopyBlock(@rxBuf+9,@eGateway,4);
      //     CopyBlock(@rxBuf+13,@eMask,4);
      //     CopyBlock(@rxBuf+17,@eMAC,6);
           mdelay(200);
           HardWareReset;
       |
    endcase;
    // Daten als Response zurücksenden
    CopyBlock(@rxBuf,@txBuf,word(count));
    USB_TxSend(@TxBuf,64);
    USB_RxSetBuf(@RxBuf);            // we need more data ..
    USBCommand:=0;
  endif;
end;



// PORTS definieren
procedure InitPorts;
begin
 
 //Für die Tasten
  PortA:= %01111110;
  DDRA := DDRA AND %10000111; //inputs auf die schalter

  DDRE:=$FF;
  PortE:=$FF;
  lcd_Reset;

end; //InitPorts

process SendStatus(20,20:iData;3,suspended);
begin
// Sendflag:=true;
// mdelay(100);
end;


//Prozess für die USB Kommunikation
process RunUSB(80,80:iData);
begin
  USB_ControlJob;        // or run in Systick every < 40ms
  USB_CheckRxTx;
end RunUSB;


{--------------------------------------------------------------}
{ Main Program }
{$IDATA}

begin
  EEprom[EEpromEnd]:= $00;
  initports;

  //USB initialisierung
  USB_SetControlCallback(@myUSB_ControlRequest); // optional, if you need it!
  USB_Init(@RxBuf);        // Attach USB and connect RxBuf for FIRST RX INT
  USB_RxSetBuf(@RxBuf);            // we need more data ..
  SerPortSelect:= UsartF0;

  EnableInts($87);
  Start_Processes($87);

  mdelay(3000); //Auf das Display warten
  //lcd_init;
  //lcd_cls;
 
  //Die Hauptschleife
  loop
    if  Inp_STABLE1(3) then // SWITCHPORT1 Bit3 = TRUE
      lcd_Text('Key1',7,5,white);
    endif;
    if  Inp_STABLE1(4) then // SWITCHPORT1 Bit4 = TRUE
      lcd_Text('Key2',7,5,white);
    endif;
    if  Inp_STABLE1(5) then // SWITCHPORT1 Bit5 = TRUE
      lcd_Text('Key3',7,5,white);
    endif;
    if  Inp_STABLE1(6) then // SWITCHPORT1 Bit6 = TRUE
      lcd_Text('Key4',7,5,white);
    endif;
 endloop;
end Stepperfoc3.



Meine Compilerversion ist die 5.04.50.
Für sachdienliche Hinweise bin ich sehr dankbar.
ThomasW69
 
Avatar
 
Subject:

Re: Switchport läuft bei mit nicht auf dem XMEGA

 · 
Posted: 05.04.2014 - 18:02  ·  #2
Vielleicht noch als Zusatzinfo: ich habe jetzt mal zusätzlich mit PCInt gearbeitet und da reagieren die EIngänge super. Es muss also was am Switchport sein.

Define
PCintAmask = %00011000; // pins 3 and 4 used
PCintAedge = $00; // all falling edges

Procedure PCIntA3; // Interrupt CallBack
begin
inc(i);
end;

Procedure PCIntA4; // Interrupt CallBack
begin
dec(i);
end;



Vielleicht hilft das ja zur Identifikation des Problems.
Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2134
Registered: 03 / 2003
Subject:

Re: Switchport läuft bei mit nicht auf dem XMEGA

 · 
Posted: 05.04.2014 - 21:50  ·  #3
Hi Thomas,

hast du den FAT16_32 importiert und zufälligerweise nicht die aktuelle Version ?

Gruss
Harry

[Edit]Ok hast nicht ..... schade das wars bei mir neulich.

Gib mal den PortA direkt (ByteToBin) auf dem LCD aus und schau ob das funktioniert.
ThomasW69
 
Avatar
 
Subject:

Re: Switchport läuft bei mit nicht auf dem XMEGA

 · 
Posted: 06.04.2014 - 09:51  ·  #4
So ich habe mal den Code etwas geändert.
In der Hauptschleife habe ich ein ByteToStr eingebaut und auf das LCD ausgegeben. zusätzlich wird ein Zähler in der Hauptschleife abgearbeitet der ebenfalls ausgegeben wird.
Das Ganze schaut jetzt so aus.

Code
 //Die Hauptschleife
  loop
    //Debug Ausgabe auf LCD
    s:=inttostr(i);
    lcd_Text('count: '+s,9,0,white);
    s1:=bytetobin(PortA);
    lcd_Text(s1,10,0,white);


    if  Inp_RAISE1(3) then // SWITCHPORT1 Bit3 = TRUE
      lcd_Text('Key1',7,5,white);
    endif;
    if  Inp_RAISE1(4) then // SWITCHPORT1 Bit4 = TRUE
      lcd_Text('Key2',7,5,white);
    endif;
    if  Inp_RAISE1(5) then // SWITCHPORT1 Bit5 = TRUE
      lcd_CLS;
    endif;
    if  Inp_RAISE1(6) then // SWITCHPORT1 Bit6 = TRUE
      lcd_Text('Key4',7,5,white);
    endif;
    inc(i);
  endloop;


und das passiert beim Drücken der Tasten. Rein gar nix :-(

[video]https://www.youtube.com/watch?v=EouBXyqOEEo[/video]


Im Nächsten Schritt habe ich dann das ByteToStr in die Interrupt Routine vom PCInt gepackt.

Code
Procedure PCIntA3; // Interrupt CallBack
begin
  s1:=bytetobin(PortA);
end;

Procedure PCIntA4; // Interrupt CallBack
begin
  s1:=bytetobin(PortA);
end;


....


  //Die Hauptschleife
  loop
    //Debug Ausgabe auf LCD
    s:=inttostr(i);
    lcd_Text('count: '+s,9,0,white);
   // s1:=bytetobin(PortA);
    lcd_Text(s1,10,0,white);


    if  Inp_RAISE1(3) then // SWITCHPORT1 Bit3 = TRUE
      lcd_Text('Key1',7,5,white);
    endif;
    if  Inp_RAISE1(4) then // SWITCHPORT1 Bit4 = TRUE
      lcd_Text('Key2',7,5,white);
    endif;
    if  Inp_RAISE1(5) then // SWITCHPORT1 Bit5 = TRUE
      lcd_CLS;
    endif;
    if  Inp_RAISE1(6) then // SWITCHPORT1 Bit6 = TRUE
      lcd_Text('Key4',7,5,white);
    endif;
    inc(i);
  endloop;


Das Ergebnis schaut so aus. Der PCInt wird ausgelöst und der String erscheint auf dem LCD.
Also muss eine Reaktion auf den Tastendruck erfolgen. Warum aber wird dieser nicht am PortA angezeigt?
[video]https://www.youtube.com/watch?v=tzP5_Juti6E[/video]


Und zum Schluss nochmal die Variante die irgendwie funktioniert. Der Zähler i wird nicht mehr bei jedem Durchlauf der Hauptschleife incrementiert sondern direkt in der einen PCint Routine incrementiert und in der anderen decrementiert. Das hatte ich ja schon im vorigen Post so gemacht.

Code
Procedure PCIntA3; // Interrupt CallBack
begin
  inc(i);
end;

Procedure PCIntA4; // Interrupt CallBack
begin
  dec(i);
end;

....

  //Die Hauptschleife
  loop
    //Debug Ausgabe auf LCD
    s:=inttostr(i);
    lcd_Text('count: '+s,9,0,white);
//    lcd_Text(s1,10,0,white);


    if  Inp_RAISE1(3) then // SWITCHPORT1 Bit3 = TRUE
      lcd_Text('Key1',7,5,white);
    endif;
    if  Inp_RAISE1(4) then // SWITCHPORT1 Bit4 = TRUE
      lcd_Text('Key2',7,5,white);
    endif;
    if  Inp_RAISE1(5) then // SWITCHPORT1 Bit5 = TRUE
      lcd_CLS;
    endif;
    if  Inp_RAISE1(6) then // SWITCHPORT1 Bit6 = TRUE
      lcd_Text('Key4',7,5,white);
    endif;
   // inc(i);
  endloop;




[video]https://www.youtube.com/watch?v=G-e0v4_kDDc[/video]

Ich habe so die Leise vermutung, dass irgendwas mit den dsc-Files für diesen Xmega nicht stimmt. in der readme Datei vom Compiler Revision 5.04.67 steht ja drin, dass ein paar XMEGA Files korrigiert wurden weil Fehler drin waren. Dummerweise ist unsere Update-Subscription abgelaufen. Ich glaub da muss ich meinen Chef mal triggern, dass er Geld locker macht.
ThomasW69
 
Avatar
 
Subject:

Re: Switchport läuft bei mit nicht auf dem XMEGA

 · 
Posted: 06.04.2014 - 10:44  ·  #5
Hallo Harry.

Das mit der Ausgabe von PortA war natürlich nicht zielführend. Es muss logischerweise PinA sein. Dann kommt auch was an. Das funktioniert zumindest beim ByteToBin(PinA). Der Switchport reagiert dennoch nicht.

[video]https://www.youtube.com/watch?v=GmaKp6Qt-U0[/video]
rh
Administrator
Avatar
Gender:
Location: Germany
Age: 24
Homepage: e-lab.de
Posts: 5558
Registered: 03 / 2002
Subject:

Re: Switchport läuft bei mit nicht auf dem XMEGA

 · 
Posted: 06.04.2014 - 14:04  ·  #6
Hallo Thomas,

das XMega Switchport Problem wird in Kürze untersucht.
Aber was sind das für seltsame Bilder???
"Ein Plugin wird benötigt um diese Inhalte darzustellen"

rolf
ThomasW69
 
Avatar
 
Subject:

Re: Switchport läuft bei mit nicht auf dem XMEGA

 · 
Posted: 06.04.2014 - 18:33  ·  #7
Hallo Rolf

Das sind keine Bilder das sind Youtube-Videos. Es kanns ein, dass da das Adobe-Flash Plugin im Browser benötigt wird. Ich habe einfach im Post Editor hier im Forum auf Video hinzufügen geklickt und die URL vom Youtube-Video eingefügt.

Ansonsten hier die Videos in der selben Reihenfolge wie im Post als Direktlinks
Video1
Video2
Video3
Video4
rh
Administrator
Avatar
Gender:
Location: Germany
Age: 24
Homepage: e-lab.de
Posts: 5558
Registered: 03 / 2002
Subject:

Re: Switchport läuft bei mit nicht auf dem XMEGA

 · 
Posted: 10.04.2014 - 13:26  ·  #8
Hallo Thomas,

das obige Programm ist viel zu komplex um da ein Fehler suchen zu können.
Vermutlich tut es deshalb nicht weil SysTick =10, User aber die Applikation
nie den SysTickJob aufruft.

Um einen Fehler zu finden brauche ich immer ein möglichst kleines Testprogramm
mit dem man das Problem eindeutig nachvollziehen kann.
Ich habe jetzt ein kleines Testprogramm geschrieben und das tut.
Code
program SwitchTest;

{$NOSHADOW}
{ $WG}                     {global Warnings off}

Device = xmega256A3U, VCC=3.3;
{ $BOOTRST $20000}         {Reset Jump to $20000}

Define_Fuses
  Override_Fuses;
  NoteBook   = a;
  COMport    = USB;
  ProgMode   = PDI;
  LockBits0  = [];
  FuseBits0  = [];
  FuseBits1  = [];
  FuseBits2  = [];
  FuseBits4  = [];
  FuseBits5  = [];
  Supply     = 3.3, 100;

Import SysTick,
       BeepPort,
       SysLEDblink,
       SwitchPort1;

From System Import Random;

Define
  OSCtype        = int32MHz, PLLmul=4, prescB=1, prescC=1;
  SysTick        = 10;                {msec}
  StackSize      = $050, iData;
  FrameSize      = $080, iData;

  BeepPort       = PortR.0;
  SysLEDblink    = mSec300;           {10..1000 msec}
  SysLEDBlink0   = PortR.1, low;      {LEDon = low level}
  
  SwitchPort1    = PinF;
  PolarityP1     = %00000111;            // polarity
  Debounce       = 5;

implementation

{$IDATA}
type

var

// functions
//-----------------------------------------------------
procedure InitPorts;
begin
 //Für die Tasten
  DDRF := %00000011; //inputs auf die schalter, LED out
  PortF:= %00000011;
end; //InitPorts

// main
begin
  InitPorts;
  EnableInts($87);
  BeepChirpL(3);
  SysLEDflashAllOn;

  //Die Hauptschleife
  loop
//    if  Inp_STABLE1(6) then // SWITCHPORT1 Bit6 = False
    if  Inp_Raise1(6) then // SWITCHPORT1 Bit6 = False
      BEEPCLICK;
      Toggle(PortF.0);
    endif;
//    if  Inp_STABLE1(7) then // SWITCHPORT1 Bit7 = False
    if  Inp_Raise1(7) then // SWITCHPORT1 Bit6 = False
      BEEPCLICK;
      Toggle(PortF.1);
    endif;
    mDelay(300);
    SwitchPort1_Clear;
 endloop;
end SwitchTest.

rolf
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: 14 · Cache Hits: 14   135   149 · Page-Gen-Time: 0.030934s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI