www.mikrocontroller.net

Forum: Compiler & IDEs Frage zu einem Beispiel


Autor: BenM20 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: BenM20 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

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.