- Akku Tests und Balkonkraftwerk Speicher         
Seite 2 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 11 bis 20 von 36

Thema: Oszilloskop erster Versuch, kleine Probleme

  1. #11
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    Anzeige

    E-Bike
    nagut ich muss dazu sagen, dass ich noch nicht einschätzen kann was genau die anforderungen sind aber das ist ne vorbereiitung auf nen projekt und mir wurden nur rahmenbedingungen und noch keine details gegeben, also lass cih das auch mich zukommen jetzt und behalte deine tips im hinterkopf, wenns mal soweit kommt ^^ danke besserwessi, vll. komm ich nochmal auf dein fachwissen zurück, wenn ich ein anderes elektrisches problem habe, analoge schaltungen habe ich einfach noch keine erfahrungen gemacht, auch dass ich die tiefpassfrequenz erheblich tiefer als die PWM frequenz legen muss, wurde mir erst im experiment klar

    EDIT: also die anpassung mit 10nF und 3,6kOhm hat nix gebracht, cih geh mal die datenblätter durch wegen taktein- und ausgang

    EDIT: synchroner takt hilft auch nicht, die schwebung bleibt bestehen

  2. #12
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    ich weis ich weis doppelpost, aber cih hab ne neue frage

    wie stelle ich den controller ein, dass er nur 8bit ADC wandelt statt 12bit ?
    ich datenblatt steht, dass ich so die ADC clock höher schrauben kann , aber nicht WIE ich ihn auf 8bit reduziere
    im moment häng ich bei ADC prescaler 8 fest, alles darunter ergibt keine normal berechnbare frequenz mehr, da müsste ich die werte erst eineichen!

    oder kann das an der geschwindigkeit liegen, dass ich vielleicht die interrupts verschleppe ?

    Code:
    #include <avr/io.h>
    #include <avr/interrupt.h>
    unsigned char tval;
    unsigned char adcval[923];
    unsigned char* end;
    unsigned char* pos;
    
    ISR(SIG_OUTPUT_COMPARE0)
    {
    	cli();
    	if (tval++ > 125) {
    		TIMSK &= ~(1<<OCIE0);
    			while (!(UCSRA & (1<<UDRE)));
    			UDR = 'A';
    			while (!(UCSRA & (1<<UDRE)));
    			UDR = 'D';
    			while (!(UCSRA & (1<<UDRE)));
    			UDR = 'C';
    			while (!(UCSRA & (1<<UDRE)));
    			UDR = '\r';
    		ADCSRA |= (1<<ADIE);
    	}
    	sei();
    }
    
    ISR(SIG_ADC)
    {
    	*pos = ((unsigned char)(ADC/16))+'!';
    	pos++; 
    	if (pos > end) {
    		ADCSRA &= ~((1<<ADEN) | (1<<ADIE));
    			while (!(UCSRA & (1<<UDRE)));
    			UDR = 'F';
    			while (!(UCSRA & (1<<UDRE)));
    			UDR = 'I';
    			while (!(UCSRA & (1<<UDRE)));
    			UDR = 'N';
    			while (!(UCSRA & (1<<UDRE)));
    			UDR = '\r';
    		pos = adcval;
    		do {
    			while (!(UCSRA & (1<<UDRE)));
    			UDR = *pos;
    			while (!(UCSRA & (1<<UDRE)));
    			UDR = '\r';
    		} while (pos++ < end);
    	}
    }
    
    ISR(SIG_UART_RECV)
    {
    
    }
    
    ISR(SIG_UART_TRANS)
    {
    
    }
    
    int main()
    {
    	end = &(adcval[922]);
    	pos = adcval;
    	tval = 1;
    	UBRRH = 0;
    	UBRRL = 25;
    	UCSRC = (1<<USBS) | (1<<UCSZ1) | (1<<UCSZ0) | (1<<URSEL);
    	UCSRB = (1<<RXEN) | (1<<TXEN);
    			while (!(UCSRA & (1<<UDRE)));
    			UDR = 'S';
    			while (!(UCSRA & (1<<UDRE)));
    			UDR = 't';
    			while (!(UCSRA & (1<<UDRE)));
    			UDR = 'a';
    			while (!(UCSRA & (1<<UDRE)));
    			UDR = 'r';
    			while (!(UCSRA & (1<<UDRE)));
    			UDR = 't';
    			while (!(UCSRA & (1<<UDRE)));
    			UDR = '\n';
    			while (!(UCSRA & (1<<UDRE)));
    			UDR = '\r';
    	TCNT0 = 0;
    	OCR0 = 124;
    	TCCR0 = (1<<WGM01) | (1<<CS02) | (1<<CS00);
    	ADMUX = (1<<REFS0);
    	ADCSRA = (1<<ADPS1) | (1<<ADPS0) | (1<<ADEN) | (1<<ADATE);
    	ADCSRA |= (1<<ADSC);
    	TIMSK = (1<<OCIE0);
    	sei();
    	while(1);
    	return 0;
    }
    der code ist momentan noch frickelage und auf hyperterminal abgestimmt, ich schreibe die werte in einen textdatei und importier die werte in eine excel tabelle um sie wie oben zu sehen auszuwerten

    ich will den code so bauen dass ich 5 mal pro sekunde eine aufzeichnung von 923 byte mache (beim niedrigsten "unerreichbaren" prescalewert müssten das 1,5 perioden sein bei 1kHz) und dann die daten per comport versende also 5 * 923byte * 10bit = 46150Baud

    das ganze dann verbunden mit nem kleinen programm wass dann die parameter für die messung festlegt und die daten grafisch auswertet, vll. setz ich das programm auf nen 2ten mega mit LCD um der es dann darstellt (quasi tragbar machen)

    hat jemand verbesserungsvorschläge ?

  3. #13
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    36
    Beiträge
    1.225
    Erstens ist im AVR ein 10 Bit ADC.
    Zweitens kannst du ihm nicht sagen, dass er nur 8 Bit machen soll, er wandelt immer 10 Bit. Du kannst ihm aber mitteilen, dass er das Ergebnis linksbündig ablegen soll, dann brauchst du nur das High-Byte auslesen (spart platz), wenn du weißt, dass dein Ergebnis aufgrund der hohen Wandlungsfrequenz zwar 10 Bits hat, die letzten beiden aber keine zuverlässigen Werte sind.
    Du behandelst ihn dann einfach wie einen 8 Bit ADC.

    Deine ISR macht ferner genau das, was eine ISR NICHT tun sollte: Warten.
    Sinnvoller wäre es, einen Puffer einzurichten, in den der ADC seine Werte reinspeichert und entweder in der Hauptschleife oder in einer UDRE-ISR zu verschicken.

    mfG
    Markus

  4. #14
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Da ist noch ein 2 tes problem in der ISR. In einer ISR sollte man die Befehle SEI() un CLI() sehr vorsichtig einsetzen. Wenn man nicht genau weiss was man da macht (geschalchtelte ISRs) dann haben cli() und Sei() in einer ISR nichts zu suchen.

  5. #15
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    scheeeeiiii ... vergessen rauszumachn ^_^ aber die haben an der stelle ja keine kritische wirkung, der timer dient(im moment) nur als verzögerung damit der ADC sich vernünftig einpegeln kann, auch wenn 4/5tel sekunden reichlich zu viel dafür sind
    nachdem der timer abgelaufen iss lösche ich den interrupt ja

  6. #16
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Das sei() in der ISR kann durchaus kritisch sein. Gerade durch das warten auf die UART in der ISR (was man auch nicht tun sollte) kann erneut der selbe Interrrupt aufgerufen werden. Auch wenn das sei() am ende des isr codes steht, kommt da noch das wiederherstellen der Register. Es kann also sehr leicht zu einem erneuten aufruf der selben ISR routine kommen, bevor sie zu ende ist und damit zum Crash wegen Stacküberlaufs und Hängen im der ISR. Gerade am Ende der ISR sollte keine sei() stehen, das wird ganz am Ende, nach dem wiederherstellen der Register ohnehin getan. Das cli() ist nicht so schlimm, aber definitiv überflüssig.

    Hier geht das ganze noch gerade mal gut das der Interrupt abgeschaltet wird.

  7. #17
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    darum gehts hier doch jetzt garnicht, während der messung passiert doch garnüscht mit den cli() und sei()!!!

    das problem ist ein ganz anderes, ausserdem war das cli/sei mal wieder einer meiner unüberlegten verzweiflungstaten und verdankt meiner vergesslichkeit, dass das jetzt noch drinne steht XD

    der motor läuft nicht, aber dich stört dass ich die spiegel nicht eingestellt habe

    EDIT:

    Deine ISR macht ferner genau das, was eine ISR NICHT tun sollte: Warten.
    Sinnvoller wäre es, einen Puffer einzurichten, in den der ADC seine Werte reinspeichert und entweder in der Hauptschleife oder in einer UDRE-ISR zu verschicken.
    also markusj jetzt wirds krümelig hier .... ich hab oben geschrieben dass dass erstmal nur frickelcode iss ........... die ISR fürs UART sind wenn man genau hinsieht LEER .... ich hab auch geschrieben dass ich es so machen will, dass er mir eie mess-serie auf befehl anfertigt, also hätte ich das senden schon interruptartig gelöst, in einer schönen statemachine .... der puffer ist da, nur wollt ich im moment noch speicher sparen, da ich nicht wusste wieviel ich für eine 1kHz messerie tatsächlich brauche und wieviel mir der controller zur verfügung stellt .....

    PS: mein programmierstil ist ein wenig eigenwillig, ich zerleg mein problem in module, schreib die module so dass sie funktionieren, beseitige probleme(an der stelle bin ich grade), bereinige den quellcode(!!!) und setze dann das programm zusammen .... dass man dann anfängt die goldwage zu bemühen kratzt ein wenig an meiner ehre tut mir leid dass ich da so ausfällig werde

    EDIT EDIT:

    hat jemand verbesserungsvorschläge ?
    AUUU SCCHHHEEEIII .... .... .... ok tut mir leid ich hab das jetzt selber erst gemekrt .... ungünstig formuliert .... optimierungsvorschläge triffts besser, frühere versuche haben gezeigt das arrayzugriffe ala array[x++] = ADC; SEHR ineffizeint sind, da hab ich schon optimiert aber ob es halt NOCH effektiver gehen würde OMG ok asche auf mein haupt verdammt >_<

  8. #18
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    36
    Beiträge
    1.225
    Ceos, du hast recht. Ich hatte übersehen, dass das verschicken erst dann stattfindet wenn deine Messung abgeschlossen ist.
    Eine Frage: Bist du sicher dass deine Zuweisung am Anfang der ISR so funktioniert?
    Ich meine diese hier:
    Code:
    *pos = ((unsigned char)(ADC/16))+'!';
    Ich bin noch nicht ganz so erfahren im Umgang mit C, aber das schaut komisch aus.

    mfG
    Markus

  9. #19
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    der 10bit ADC wert wird um 4 bit verkleiner 6 bit, macht 64 stufen, addiert mit dem zahlenwert des ausrufezeichen (33 als das niedrigste darstellbare textzeichen) ergibt eine reichweite von '!' (33) bis '`' (96), da der ADC 12 bit hat wird die gesamte rechenoperation als 16bit wert ausgeführt und ich downcaste es auf 8bit, da ich es in einem charwert speichern möchte

    den zeichensalat importiere ich dann in eine exceltabelle, wo ich mir dann mittels der formel
    =CODE("datenzelle")-33
    mir einen zahlenwert von 0 bis 63 ausrechnen lasse, den ich dann in einem liniendiagramm interpretiere (siehe bild erster post)

    wenn ich die werte von 0 - 256 (also durch 4 statt 16 geteilt hätte) versucht hätte zu übertragen hätte ich steuerzeichen und sonst irgendwelchen müll gehabt, den ich nicht in einer excel tabelle interpretieren kann

    wenn ich mein programm fertig habe, werde ich 8bit werte übertragen und im prgramm direkt auswerten, leider muss ich den ADC dennoch komplett auslesen, also 12bit weil ich ja die volle spannung messen möchte und anschliessend durch 4 teilen also auf 8bit runterrechnen, deshalb war ja meine frage danach ob ich dem ADC per hardware mitteilen kann gleich auf 8bit basis zu arbeiten, aber leider klappt das ja nicht

  10. #20
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Der AD Wandler wandelt immer 10 Bit, aber man kann einstellen wie die Bits auf ADCL und ADCH aufgeteilt werden. Wenn das Bit ADLAR im Register ADMUX gestezt ist, enthält ADCH die obernen 8 Bits und ADCL die unteren 2. Dann kann man also aus ADCH die werte mit 8 Bis auflösung auslesen.

    Entschuldigung wenn ich zu sehr vom Thema abgewichen bin.
    Ohne Kommentare ist so ein programm schwer zu verstehen, und die Verzögerung ist schon etwas ungewöhnlich.

    Die wartezeiten sind ja nur in der ISR wenn nicht gemessen wird. Ich weiss nicht wie gut GCC beim optimieren ist, aber das ADC/16 könnte relativ lange dauern wenn es nicht vom optimierer durch (ADC >>4) ersetzt wird. Immerhin ist der Prescaler nur bei 8 d.h. maximal 8*13 Zyklen für die AD ISR routine. Das kann immerhin schon mal erhlären wieso keine kleinerer Teiler geht, denn dann reicht offensichtlich die Zeit nicht mehr für die ISR und es werden werte ausgelassen.
    Wenn der Controller mit 16 MHz läuft ist das auch schon reichlich schnell für den AD, da sollte eher ein Teiler von 32 oder so hin.

    Die Schwebungen können auch bei gleichem Quarz noch vorkommen die PWM Frequenz ist 8 MHz / 99 (oder 100 ?). Die AD Frequenz 16 MHz / 8 / 13 = 16 MHz / 104 = ca. 153 kHz. Da kann es immernoch zu einer Art schwebung kommen, denn der AD Eingang wird ja nur ganz kurz für ca. 1 µs abgefragt. Jenachdem ob da gerade das PWM Signal H oder L ist kann das schon einen Unterschied machen. Selbst auf eine geätzten Platine ist es nicht leicht da kleine Störungen zu vermeiden.

Seite 2 von 4 ErsteErste 1234 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen