Forum: Mikrocontroller und Digitale Elektronik Datentransfer von Port C an Port D


von Fuzzy F. (fuzzy)


Lesenswert?

Habe ein Problem mit einem Datentransfer von Port C an Port D.
Zur Info: Ich habe einen ATmega 16 und habe ihn mit WinAVR Programmiert.
Wenn ich nun von Port C eine Zahl bekomme z.B. 15 oder so dann bekomme 
ich diesen nicht an Port D zurückgesand. Das JTAG habe ich abgeschaltet. 
Weiss langsam nicht mehr weiter.
Für Hilfreiche Tipps Danke ich im vorraus!!!

PS: Wenn in anderen Foren Tipps stehen dann her damit, habe schon 
gesucht aber nichts richtiges gefunden!

Hier mein Quelltext:

#include<avr/io.h>
#include<inttypes.h>
int main (void)
{

  MCUCSR = (1<<JTD);
  MCUCSR = (1<<JTD);
  DDRA = 0x00;     //port A input
  DDRB = 0xFF;      // port B output
  DDRC = 0x00;    // port C input
  //PORTC= 0x00;
  PINC=0x00;
  DDRD = 0xFF;


  int x = 0;
  unsigned char Bsend;
  int B,C,g,Pcdaten;
  TWCR = (0<<TWEN);
  ASSR = (0<<AS2);
  ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
  ADMUX = 0;
  ADMUX = (1<<REFS1) | (1<<REFS0);
  // Select pin ADC0 using MUX
  // Activate ADC with Prescaler 128 -->16Mhz/128 = 125kHz

  //Start conversion
    ADCSRA |= (1<<ADSC);
  // wait until converstion completed
   while (ADCSRA & (1<<ADSC) )

  for (;;) {
  ADCSRA |= (1<<ADSC);
  while (ADCSRA & (1<<ADSC) )
    // get converted value
    x = ADCW;

    x = x>>2;          //Shiften um 2 Stellen nach rechts

   Bsend = x & 0b00001111;
   PORTB = Bsend;


  Bsend = x & 0b11110000;
  Bsend=Bsend>>4;
  Bsend = Bsend + 128;
  PORTB = Bsend;

  Pcdaten = PORTC;
  PORTD=PORTC;
 // Pcdaten = Pcdaten*10;
 //  Pcdaten = 200;

   if (PIND &b00000010)      //pind.2==1
   {
      Pcdaten = Pcdaten + 10;
  }

   if (PIND &b00000100)        //pind.3==1
   {
      Pcdaten = Pcdaten - 10;
  }


  C = 500;

    B = C - Pcdaten;

    g = 0;

// Anschalten der LED
  //PORTD &= ~(1<<PD5);
   PORTD =0b01111111;

   while (g < Pcdaten)
  {
   asm volatile("nop\n\t"
             ::);

       g = g + 1;
  }
 // Ausschalten der LED

PORTD=0;
   //PORTD |= (1<<PD5);
   PORTD = 0b00000000;
   g = 0;

  while (g < B)
  {
   asm volatile("nop\n\t"
             ::);

       g = g + 1;
  }

  }
  ADCSRA &= ~(1<<ADEN);

int i;
i=0;

  for(i=0;i<255;i++)
  {

  asm volatile("nop\n\t"
             ::);
  PORTD=i;
}
}


von Sonic (Gast)


Lesenswert?

PORTC => Ausgangsregister
PINC => Eingangsregister
Du hast das ein paarmal durcheinandergebracht, glaub' ich.

Pcdaten = PORTC;
  PORTD=PORTC;

Hier liest du das Ausgangsregister ein, sollte wohl eher PINC heißen, 
oder?

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.