naja .... es hat aber BISHER immer auf anhieb funktioniert , aber selbst auf 9600Baud gehts nicht!!! ich versuch mal das proggi zu kopieren, aber mein laptop mag meinen memostick nicht
Code:#include <avr/io.h> #include <avr/interrupt.h> volatile unsigned char TmOt1A; volatile unsigned char TmOt1B; volatile unsigned char Settings[2]; volatile unsigned char* Pos; volatile unsigned char* End; volatile unsigned int Time32k; volatile unsigned char ServoVal; volatile unsigned int ImpVal; #define ADC0 0 #define ADC1 1 #define ADC2 2 #define ADC3 3 #define ADC4 4 #define ADC5 5 #define ADC6 6 #define ADC7 7 ISR(SIG_UART_DATA) { UDR = 100;//*(Pos); //nach dem nur 0 rauskam hab ich mal 100 verwendet Pos++; if (Pos > End) { UCSRB &= ~(1<<UDRIE); Time32k = 0; TCNT0 = 0; TIMSK |= (1<<TOIE0); } } ISR(SIG_OVERFLOW0) { if(Time32k++ > 17 && ~(PIND & (1<<PD2))) // 18 Timerclocks sind etwas mehr als UART 2 Byte (sendepause für das easyradio-modul) ausserdem Busy-leitung an PD2 { TIMSK &= ~(1<<TOIE0); Pos = Settings; *(Pos) = ServoVal; Pos++; *(Pos) = (unsigned char)(ImpVal>>2); Pos = Settings; UCSRB |= (1<<UDRIE); } } //**** [unwichtig] ISR(SIG_OUTPUT_COMPARE1A) { switch(TmOt1A){ case(1): TCCR1A |= (1<<COM1A1); break;//DDRB |= (1<<PB1); break; case(2): TCCR1A &= ~(1<<COM1A1); break;//DDRB &= ~(1<<PB1); break; case(4): TmOt1A = 0; break; } TmOt1A++; } ISR(SIG_OUTPUT_COMPARE1B) { switch(TmOt1B){ case(1): TCCR1A |= (1<<COM1B1); break; case(2): TCCR1A &= ~(1<<COM1B1); break; case(4): TmOt1B = 0; break; } TmOt1B++; } void Timeout32k(unsigned int Tout) { Time32k = 0; while (Time32k < Tout); return; } //***** [/unwichtig] int main(void) { Time32k = 0; End = &(Settings[1]); Pos = Settings; TmOt1A = 0; TmOt1B = 0; ICR1 = 999; OCR1A = 200; OCR1B = 200; DDRB = (1<<PB2) | (1<<PB1); ADMUX = (1<<REFS0); ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1); TCCR1A = (1<<WGM11);// | (1<<COM1A1) | (1<<COM1B1); TCCR1B = (1<<CS10) | (1<<CS11) | (1<<WGM13) | (1<<WGM12); TCCR0 = (1<<CS02); TIMSK = (1<<OCIE1A);// | (1<<OCIE1B); TCCR1A |= (1<<COM1B1) | (1<<COM1B0); PORTD |= (1<<PD2); UBRRH = 0; UBRRL = 51; // 51 ist 9600, was auch nciht geht sonst 12 für 38400 UCSRB = (1<<TXEN); UCSRC = (1<<UCSZ1) | (1<<UCSZ0); //*********** Init ADC circuitry ADCSRA |= (1<<ADSC) | (1<<ADIF); // start conversion (init ADC) while (!(ADCSRA & (1<<ADIF))); // wait for very 1st conversion //*********** Enable Interrupt sei(); //*********** Start Timing Routine TCNT0 = 0; Time32k = 0; TIMSK |= (1<<TOIE0); //*********** Main Loop while(1) { //*********** Conversion A ADMUX = (ADMUX & 0xF0) + ADC0; // set ADMUX ADCSRA |= (1<<ADSC) | (1<<ADIF); // start conversion while (!(ADCSRA & (1<<ADIF))); // wait for 1st conversion ADCSRA |= (1<<ADSC) | (1<<ADIF); // discard 1st result while (!(ADCSRA & (1<<ADIF))); // wait for 2nd conversion ServoVal = ((unsigned int)(ADC>>2)*200/255); OCR1A = 120 + ServoVal; // write channel A result //*********** Conversion B ADMUX = (ADMUX & 0xF0) + ADC1; ADCSRA |= (1<<ADSC) | (1<<ADIF); while (!(ADCSRA & (1<<ADIF))); ADCSRA |= (1<<ADSC) | (1<<ADIF); while (!(ADCSRA & (1<<ADIF))); ImpVal = ADC; OCR1B = ImpVal; // write channel B result } return 0; }
EDIT: selbst mit 16Mhz Quarz passiert nix, UBBR hab ich auf 103 geändert um 9600 Baud beizubehalten immernoch 0x00







Zitieren

Lesezeichen