Hallo Leute! Könnte wohl einer mal über das Programm schauen und mir vielleicht sagen warum es nicht will. #include <avr/io.h> #include <avr/interrupt.h> int main (void) { unsigned int val; DDRC=0b1111111; PORTC=0b1111111; ADMUX=0b0101; ADCSRA=0x80; //ADC freischalten ADCSRA|=(1<<ADSC); //ADC Wandlung starten //Divisionsfaktor Clock ist 2 bei 1MHz-->500kHz while(ADCSRA&(1<<ADSC)); //solange bis Wandlung nicht abgeschlossen ist val=ADCL; //Einspeichern der Werte val=(ADCH<<8)|val; if(val<6) { PORTC=0; } return 1; }
Dein Programm läuft genau einmal. Wo ist Deine Endlosschleife? So sollte es gehen:
1 | #include <avr/io.h> |
2 | #include <avr/interrupt.h> |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | int main (void) |
10 | {
|
11 | unsigned int val; |
12 | DDRC=0b1111111; |
13 | PORTC=0b1111111; |
14 | |
15 | |
16 | ADMUX=0b0101; |
17 | |
18 | ADCSRA=0x80; //ADC freischalten |
19 | |
20 | ADCSRA|=(1<<ADSC); //ADC Wandlung starten |
21 | //Divisionsfaktor Clock ist 2 bei 1MHz-->500kHz
|
22 | while(1) |
23 | {
|
24 | while(ADCSRA&(1<<ADSC)); //solange bis Wandlung nicht abgeschlossen ist |
25 | |
26 | val=ADCL; //Einspeichern der Werte |
27 | val=(ADCH<<8)|val; |
28 | |
29 | if(val<6) |
30 | {
|
31 | PORTC=0; |
32 | }
|
33 | }
|
34 | |
35 | return 0; |
36 | }
|
Wenn Du sagst, was es denn wollen soll , dann kann Dir vielleicht auch jemand sagen, warum es das nicht tut. > val=ADCL; //Einspeichern der Werte > val=(ADCH<<8)|val; Nicht machen. Es gibt in C extra einen 16-Bit-Zugriff. "val = ADCW;" tut es auch und ist idiotensicher. Aber das da: > DDRC=0b1111111; ist tödlich! Warum schaltest Du die Analog-Eingänge als Ausgang und dann auch noch mit > PORTC=0b1111111; alle auf High?
ich wollte einfach mal den ADC probieren. ja ich weiss ist mir auch grad aufgefallen dass ich die ADCs auf high geschaltet habe. ich will einfach ne Spannung von 2,5V am ADC messen mit Referenzspannung 5V. Er soll ja auch nur einmal durchlaufen, um dann die Led am Port einschalten bei der if Anweisung
hier die neue Version #include <avr/io.h> #include <avr/interrupt.h> int main (void) { unsigned int val; DDRD=0b00000001; PORTD=0b00000001; ADMUX=0b0101; ADCSRA=0x80; ADCSRA|=(1<<ADSC); while(ADCSRA&(1<<ADSC)); val=ADCL; val=(ADCH<<8)|val; if(val<6) { PORTD=0; } return 1; }
jetzt hab ichs endlich. ich dösel. kommt davon wenn man so lange arbeitet. ich hab ja 10bit und das heißt 1024 Schritte habe ich und 2,5V liegen dann genau in der Mitte und meine if Anweisung ist auch Schwachsinnig. ich habs jetzt mit 500 Versucht und jetzt gehts auch. Hier zur Vollständigkeit das Programm: #include <avr/io.h> #include <avr/interrupt.h> int main (void) { unsigned int val; DDRD=0b00000001; PORTD=0b00000000; ADMUX=0b0101; ADCSRA=0x80; ADCSRA|=(1<<ADSC); while(ADCSRA&(1<<ADSC)); val=ADCL; val=(ADCH<<8)|val; if(val<360) { PORTD=0b00000001; } return 1; }
Habe auch ein Problem mit dem ADC. Folgende Fehlermeldungen werden ausgegeben: ../ATMEGA8.c:244: error: 'ADCSRA' undeclared (first use in this function) ../ATMEGA8.c:244: error: 'ADEN' undeclared (first use in this function) ../ATMEGA8.c:244: error: 'ADPS1' undeclared (first use in this function) ../ATMEGA8.c:244: error: 'ADPS0' undeclared (first use in this function) ../ATMEGA8.c:246: error: 'ADSC' undeclared (first use in this function) ../ATMEGA8.c:246: error: expected declaration or statement at end of input Kann mir jemand bitte helfen?
Folgendes Unterprogramm bereitet mir Probleme: Fehlermeldungen werden wie schon genannt ausgegeben. #include <avr/io.h> #include <lcd-routines.h> #include <lcd-routines.c> #include <inttypes.h> #include <portpins.h> #ifndef F_CPU #define F_CPU 12000000000 #endif #include <util/delay.h> #include <avr/interrupt.h> uint16_t Lese_Kanal(uint8_t mux) { uint8_t i; uint16_t ergebnis; ADMUX = mux; // Kanal waehlen ADCSRA = (1<<ADEN) | (1<<ADPS1); // Frequenzvorteiler 12MHz/64=187500Hz ADCSRA |= (1<<ADSC); // Dummy-read-out while ( ADCSRA & (1<<ADSC) ) { ; // auf Abschluss der Konvertierung warten } ergebnis = ADCW; // ADCW muss einmal gelesen werden, // Eigentliche Messung // ergebnis = 0; for( i=0; i<4; i++ ) { ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion" while ( ADCSRA & (1<<ADSC) ) { ; // auf Abschluss der Konvertierung warten } ergebnis += ADCW; // Wandlungsergebnisse aufaddieren } ADCSRA &= ~(1<<ADEN); // ADC deaktivieren ergebnis /= 4; // Summe durch vier teilen = arithm. Mittelwert return ergebnis; }
@ Tschusi Nicht dass es wichtig wäre, aber: > #define F_CPU 12000000000 Wo gibt's denn die Quarze dafür ;-) Ich bekomme mit deinem Codefetzen ganz andere Fehlermeldungen: ../tschusi_adc.c:2:26: error: lcd-routines.h: No such file or directory ../tschusi_adc.c:3:26: error: lcd-routines.c: No such file or directory ../tschusi_adc.c:5:22: error: portpins.h: No such file or directory Wenn ich die auslösenden #include auskommentiere, bleibt eine Fehlermeldung übrig: ../../../../crt1/gcrt1.S:52: undefined reference to `main' Das ist aber logisch, denn in deinem Codefetzen ist ja kein main() enthalten. Der Rest übersetzt bei mir wie gesagt ohne Probleme. Getestet habe ich mit AVR Studio 4.12 SP2 und WinAVR 20071222. Als Device habe ich Atmega8 und 12000000 Hz eingestellt. Sonst wurde nichts geändert. In Echt wäre noch Optimierung wegen delay.h nötig.
Danke für die Antworten nun wirds schon klappen. Noch schöne Festtage und einen guten Rutsch wünsche ich
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.