Forum: Compiler & IDEs Frage zu einem Beispiel


von BenM20 (Gast)


Lesenswert?

Hallo

Habe eine Frage zu einem Beispiel. Und zwar verstehe ich paar sachen 
nicht!



interrupt [TIM0_COMPA] void timer0_com(void)
{
     // Three sync bytes (00-ff-ff), then 100 data bytes.

  PORTB.1 = ~PORTB.1;

    // Byte boundary.
    if (halfcycle == 16)
    {

     halfcycle = 0;
        voltageD=ADCH;
  if (voltageD == 255) voltageD = 0;

  ADCSRA.6=1;

      if (index == 0)     byte = 0x00;
      else if (index < 3) byte = 0xff;
       else byte = voltageD;

      bytenum++;
      if (index == 103) index = 0;

    }

    // On the falling edge of the clock, the output matches the data.
    if (halfcycle & 1)
      PORTB.0 = (byte >> (halfcycle >> 1)) & 0x01;
    // On the rising edge of the clock, the output is the data inverted.
    else
      PORTB.0 = (~(byte >> (halfcycle >> 1))) & 0x01;

    halfcycle++;
}


Also 1. PORTB.1 = ~PORTB.1;  es ist ein Output aber was macht es?

2. ist etwas was ich gar nicht verstehe

    // On the falling edge of the clock, the output matches the data.
    if (halfcycle & 1)
      PORTB.0 = (byte >> (halfcycle >> 1)) & 0x01;
    // On the rising edge of the clock, the output is the data inverted.
    else
      PORTB.0 = (~(byte >> (halfcycle >> 1))) & 0x01;

Und zwar Oben hat sich z.B. 1111 1111 (1-byte) gebildet. und jetzt wird 
er auf den Ausgang gelegt wenn das Bit 1 ist kommt es in if-Schleife , 
aber das Ergebnis soll  ein 01 oder 10 gebildet werden. also 
D-Mancheste-Code.  d.h. aus 8 bit müssen 16 werden , aber mir ist nicht 
ersichtlich wie es 16 wird!  Es läuft doch nur 8 mal durch.

Könnte mir einer sagen wie das funktioniert?

Ben

von Stefan B. (stefan) Benutzerseite


Lesenswert?

> Also 1. PORTB.1 = ~PORTB.1;  es ist ein Output aber was macht es?

~ ist ein Bitoperator von C zum bitweisen Negieren eines Werte. Der 
Logikpegel an PORTB.1 wird getoggelt (umgeschaltet).

> Es läuft doch nur 8 mal durch.

Nö. Zählvariable ist halfcycle und das läuft von 0 bis 15

von Stefan E. (sternst)


Lesenswert?

BenM20 wrote:

> Also 1. PORTB.1 = ~PORTB.1;  es ist ein Output aber was macht es?

Es invertiert den Output. Wenn es 0 war, wird es 1, und umgekehrt. Bei 
jedem Int wechselt also der Ausgang PB1, soll wohl ein Taktsignal sein.

> 2. ist etwas was ich gar nicht verstehe
>
>     // On the falling edge of the clock, the output matches the data.
>     if (halfcycle & 1)
>       PORTB.0 = (byte >> (halfcycle >> 1)) & 0x01;
>     // On the rising edge of the clock, the output is the data inverted.
>     else
>       PORTB.0 = (~(byte >> (halfcycle >> 1))) & 0x01;
>  ...
>  Es läuft doch nur 8 mal durch.

Nein, 16 mal, wird mit halfcycle gezählt.
"if (halfcycle & 1)" bedeutet: immer wenn Bit 0 in halfcycle 1 ist. 
Dieses if-else bedeutet damit nichts anderes, als "mache immer 
abwechselnd das eine und das andere".
Bei "PORTB.0 = (byte >> (halfcycle >> 1)) & 0x01;" ist erstmal wichtig, 
dass "(halfcycle >> 1)" eigentlich nur halfcycle/2 bedeutet. Bei Int 0 
und 1 wird also Bit 0 von byte ausgegeben, bei Int 2 und 3 das Bit 1, 
bei 4 und 5 das Bit 2, ... , bei Int 14 und 15 schließlich Bit 7. Die 
zweite Ausgabe ist identisch, bis auf das "~", dort wird also das 
invertierte Bit ausgegeben.

PS: Ich würde das Ganze übrigens umstellen: erst das Datenbit ausgeben, 
dann den Takt toggeln, dann halfcycle erhöhen, und am Ende den "if 
(halfcycle == 16)"-Block.

von BenM20 (Gast)


Lesenswert?

OK danke für die Schnelle Antwort,

habe es jetzt verstanden.

Habe aber doch noch eine Frage, und zwar


Inputs:
B.2 = Field Clock Input (T0)
B.4 = ADC input ADC2

Outputs:
B.0 = Manchester data output
B.1 = 2 KHz Clock

 <Tiny13.h>

void initialize(void);   //all the ini stuff
unsigned char voltageD, index, byte, halfcycle;  //digital voltage, 
index for data,number of half-cycles field clock has gone //through 
transmission, byte

//**********************************************************
//timer 0 compare ISR
interrupt [TIM0_COMPA] void timer0_com(void)
{
    ........
  }


//**********************************************************

void initialize(void)
{
  //set up the ports
  DDRB.0=1;   // PORT.0 and PORT.1 are outputs
  DDRB.1=1;
  //DDRB.2=0; //PORTB.2 is an input
  PORTB.0=0;
  PORTB.1=0;
  //PORTB.2=0; //no pull-up

  index=0;
  voltageD=0x00;
  byte=o;
  halfcycle=0;


  //set up timer 0
  //TIMSK0=12;    //turn on timer 0 cmp match A and  B ISR
  OCR0A = 32;    //set the compare to 32 periods
  TCCR0A=0b00000010;    //CTC mode
  TCCR0B=0b00000111;        //rising edge of external clock
  TIMSK0=0b00000100;    //enable compare match

  //set ADC registers in ADC noise canceler(Idle mode)
  ADMUX=0b01100010;
  ADCSRA=0b10000110;//enable the ADC, single conversion mode,
          // clk prescaler to 64=150kHZ resolution, no adc conversion 
complete interrup enable

   //turn on the ISR
   #asm ("sei");

}

Verstehe das es in den halbschritten aufgerufen wird, aber habe noch ein 
Problem mit dem Timer Interrupt. Der muss doch dann in halfcycle 
aufgerufen werden.

Verstehe nicht wo der Timer eingestellt wird.  So wie ich das Verstanden 
habe, vergleiche ich mit dem Port B.2, nehme ihn als Referenz . d.h. der 
müsste schon in halben Schritten sein.  Verstehe aber was das mit der 
Erzeugung von den 2KHz am Ausgang von B.1 hat. Oder Vergleiche ich die 
beiden?

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Der Timer0 wird in den vier Anweisungen unterhalb des Kommentars "//set 
up timer 0" eingerichtet.

Bei passender Taktquelle des µC gibt dir die Einstellung dort einen 2 
kHz Takt an PORTB.1.

PORTB.2 spielt dort keine Rolle. Die Anweisungen zu diesem Input sind 
auch in der Source auskommentiert. Die Doku passt nicht zum aktuellen, 
angegebenen (Teil-)Sourcecode.

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.