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
> 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
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.
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.