mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik dsPIC30F6012A PORTB Probleme


Autor: Patrick B. (p51d)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo miteinander

Ich habe gerade begonnen, einen Source-Code für den HI-Tech Compiler 
umzuschreiben.
Dabei bin ich auf die merkwürdigen Eigenheiten des PORTG gestossen.
Als Ausgang funktioniert das Port wie es soll, aber sobald ich es als 
Eingang definiere, kriege ich immer nie die Werte, in eine Variable, die 
eigentlich am Port liegen.

Weiss jemand Rat?
#define TXE                  (PORTF & (1 << 6))                          // Transmitt-enable pin
#define WR_dis               PORTF &= ~(1 << 4)                          // Write disable
#define WR_en               PORTF |= (1 << 4)                          // Write enable
#define RX                   (PORTD & (1 << 11))                         // Receive data Pin
#define RD_dis              PORTF |= (1 << 3)                          // Read disable
#define RD_en              PORTF &= ~(1 << 3)                          // Read enable 
#define PWREN                (PORTF & (1 << 5))                          // configurations-status
#define  DATA_bus      PORTB
#define DDR_in        TRISB = 0xFFFF
#define DDR_out        TRISB = 0

static unsigned char index_rxBuf_R = 0;                               // Index of last write RX-Buffer 
static unsigned char index_rxBuf_W = 0;                               // Index of last read RX-Buffer
static unsigned char rxBuf = 0;                                  // RX-Buffer
static unsigned char index_txBuf_R = 0;                               // Index to write TX-Buffer 
static unsigned char index_txBuf_W = 0;                               // Index to read TX-Buffer
static unsigned char txBuf[txBuf_max + 1];                       // TX-Buffer


void ft245_init(void){
  char i = 0;
  unsigned char blink_cnt = 0;
  
  RD_dis;                                              // set control-pins
  WR_dis;
  
  for(i=0;i<=txBuf_max;i++){                                // clear buffer
    txBuf[i] = 0;
  }
  while(PWREN != 0){                                 // wait until USB FTDI-configuration
    if(blink_cnt >= 250){                                  // Blaue LED mit 2Hz blinken
         PORTC ^= (1 << 1);
         blink_cnt = 0;
    }
    blink_cnt ++;
    __delay_ms(1);  
  }
}
void ft245_tx(void){                                         // send-function
  if(TXE == 0){                                      // if sending possible
  
    if(index_txBuf_R == index_txBuf_W){                    // no new data => return
      return;
    }
    if(index_txBuf_R == txBuf_max){                        // ringbuffer
      index_txBuf_R = 0;
    }
    else{
      index_txBuf_R ++;
    }
    
    DATA_bus = txBuf[index_txBuf_R];                       // write datas to the ftdi
    WR_en;                                           // new data available
    WR_dis;
  }
}
void txBuf_Write(char parameter){                            // TX buffer handling
  if(index_txBuf_W == txBuf_max){                           // ringbuffer
    index_txBuf_W = 0;
  }
  else{
    index_txBuf_W ++;
  }
  txBuf[index_txBuf_W] = parameter;
}

void ft245_rx(void){                                         // read function (polling)
  if(RX == 0){                                       // if new data in the FTDI buffer
    index_rxBuf_W  = ~index_rxBuf_W;    
    DDR_in;  
    ADPCFG = 0xFFFF;                    // Digital IO  
    RD_en;                                            // read data enable
    rxBuf = (DATA_bus & 0xFF);                            // store data    
    RD_dis;                                           // read finished
    DDR_out;
  }
}

void USB(void){
  ft245_tx();
  ft245_rx();
  if(index_rxBuf_W == index_rxBuf_R){                       // Buffer Error abgleichen
    return;                                               // Wenn keine neuen Daten => aus Funktion heraus springen
  }
  index_rxBuf_R = ~index_rxBuf_R;  
  
  txBuf_Write(rxBuf);
}

int main(void){
  TRISB = 0x0000;                                      // Data-Bus 
  ADPCFG = 0xFFFF;                      // Digital IO bei PortB
  TRISD = 0b0000111111111000;                  // RXF, CON inputs
  TRISF = 0b1111111111100111;                  // TEX, RD, WR, PWREN
  while(1){
    USB();
  }
  return 0;
}

Ich weiss momentan wirklich nicht mehr weiter, respektive wo das Problem 
sonst noch sein könnte.

Besten Dank für die Hilfe
MFG
Patrick

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.