Hallo zusammen, ich habe ein ADC Programm geschrieben. danach möchte ich mit UAST serieller Schnittstelle ein Zeichen schicken, um ADC zu testen. ADC ist mit Joystick verbunden. das programm testet einen ADC Kanal, wenn Joystick nach oben drücken, LED soll leuten. wenn Joystick nach unten drücken, sendet ein Zeichen "a " über serieller Schnittstelle an PC "HyperTerminal" mit 9600 hz von XP. Nach "Build" gibt es keine Fehler. aber LED leuchtet immer, egal ob ich nach oben oder unten drücke. ich weiß nicht, wo ich wahrscheinlich Fehler gemacht habe. gruß Wang ****************Programm ist hier******************** #include <avr/io.h> #include <avr/interrupt.h> #define FOSC 16000000 // #define BAUD 9600 // Einstellung der Baud Rate 9600 /************************************* Funktion: ADC Initialisierung **************************************/ void InitADC(void) { ADMUX =(0<<REFS1)|(1<<REFS0)|(0<<MUX1)|(1<<MUX0); // ADC Ref auf Avcc, PC0 gewaehlt /*****MUX1******MUX0*****Single 0 0 ADC0(PC0) J1_H 0 1 ADC1(PC1) J1_V 1 0 ADC2(PC2) J2_H 1 1 ADC3(PC3) J2_V */ ADCSRA =(1<<ADEN)|(1<<ADSC)|(0<<ADPS0)|(1<<ADPS1)|(1<<ADPS2); // ADC eingeschaltet, 64 Bit Prescale } /************************************* Funktion: USART Initialisierung **************************************/ void init_usart(void) { UBRRH = (FOSC/BAUD/16-1)/256; // Form der Buad Rate: 8 bit H UBRRL = (FOSC/BAUD/16-1)%256; // 8 bit L //Empfang, Send und RX Complete Interrupt vom Register aktivieren UCSRB |= (1 << RXEN)|(1 << TXEN)|(1 << RXCIE); } /**************** ***** Main ***** ****************/ void main(void) { uint16_t sample_j1_h,value_j1_h;//,value_j2_h,value_j2_vsample_j1_v,j,,value_j1_v ; DDRC |= (1<<5); //PC5 als Ausgang InitADC(); init_usart(); // USART initialisieren while(1) { sample_j1_h = 0; while ( ADCSRA & (1<<ADSC) & (!( UCSRA & (1<<UDRE)) ) ) { ; // auf Abschluss der Konvertierung warten } value_j1_h = ADCW; ADCSRA |= (1<<ADSC); //single conversion mode restart if (value_j1_h < 80) PORTC |= (1<<5); // wenn < 80, dann schaltet LED ein else UDR = 0x55; //send_usart('a'); // wenn >= 80, dann send Zeichen "a" } }
Hi > if (value_j1_h < 80) > PORTC |= (1<<5); // wenn < 80, dann schaltet LED ein Und an welcher Stelle schaltest du die LED wieder aus? MfG Spess
Wang schrieb: > while ( ADCSRA & (1<<ADSC) & (!( UCSRA & (1<<UDRE)) ) ) Auch solltest Du Dir den Unterschied zwischen '&' und '&&' zu Gemüte führen.
spess53 schrieb: > Hi > >> if (value_j1_h < 80) >> PORTC |= (1<<5); // wenn < 80, dann schaltet LED ein > > Und an welcher Stelle schaltest du die LED wieder aus? > > MfG Spess stimmt, habe ich vergessen, wieder auszuschalten
Hubert G. schrieb: > In der ADC-init ist PC1 ausgewählt, nicht PC0 wie im Kommentar. Ja,richtig PC1 ist geschaltet. nicht PC0 scheinbar, dass ich beim Umprobieren dem Kommentar falsch geschrieben habe. :-p
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.