- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 5 von 7 ErsteErste ... 34567 LetzteLetzte
Ergebnis 41 bis 50 von 64

Thema: Spannung auslesen

  1. #41
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    15.04.2008
    Beiträge
    330
    Anzeige

    E-Bike
    Ok, hab mal das alte Blinkprogramm auf den Chip gespielt und ratet mal...

    Es ging ohne Probleme zum draufspielen! Keinerlei Fehlermeldungen.
    Naja, schon mal die halbe Miete dachte ich mir und schließe ihn an meine Platine an... Und... Sie blinkt mit dem Code, den sie Blinken sollte.

    Also ist der Fehler 100 %ig im Code!!

    Code:
    #define 	F_CPU 3686400	// Taktfrequenz des myAVR-Boards
    #include	<avr\io.h>		// AVR Register und Konstantendefinitionen
    #include    <inttypes.h> 
    //----------------------------------------------------------------------
    
    uint16_t readADC(uint8_t channel) 
    {
    	// Funktion 1 zum Auslesen der Spannung
    
    	uint8_t i;                   // Variablen definieren (Zählervariable i + Resultat)
    	uint16_t result = 0;
    
    	ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1); //ADEN = ADC Enable 
    	// wenn adps1+2 on sind und adps0 off, dann ist der Teilungsfaktor 64 (Tabelle Datasheet)
    
    	ADMUX = channel; //Kanal wählen; REFs0+1 -> interne Referenz 2,56V verwenden, REFS1 gibt es bei Attiny13 nicht
    	//externen Kondensator mit 100nF (Aufdruck 104) an AREF auf Masse
    
    	//Dummy-Readout (unten), misst 1* Ergebnis, wird nicht gespeichert
    	ADCSRA = ADCSRA | (1<<ADSC); // Schaltet bei ADCSRA das ADSC-Bit ein, d.h. Messung starten
    	while(ADCSRA & (1<<ADSC)); //Warte bis Messvorgang vorbei ist
    
    	// Nun 3* Spannung auslesen, Durchschnittswert ausrechnen
    	for (i=0; i<3; i++) 
    	{
    		// Schleife, startet 3*
    		ADCSRA = ADCSRA |(1<<ADSC); // Einmal messen
    		while(ADCSRA & (1<<ADSC));  //Warte bis Messung vorbei
    
    		result = result + ADCW; // Resultate zusammenzählen (R1+R2+R3) -> später alles /3
    	}
    
    	ADCSRA = ADCSRA & (~(1<<ADEN)); //ADC wieder deaktivieren
    
    	result=result/3;    // Durchschnittswert
    
    	return result;
    }
    
    int main (void)						// Hauptprogramm, startet bei Power ON und Reset
    {
    	float spannung;    //Definiere Variable
    	DDRB=0b00001111;
    
    	while (true)
    	{
    
    		uint16_t result = readADC(0); // ruft die ADC Funktion auf an Pin0 =ADC0
    
    		(float) (result);
    		spannung=0.003086*(float) (result);
    		waitMs(400);
    
    		if ((spannung > 1.5) && (spannung < 1.7))
    		{
    			PORTB=PORTB|(1<<PB1);
    			waitMs(600);
    			PORTB=PORTB&(~(1<<PB1));
    		}
    		if ((spannung>1)&& (spannung<1.1))
    		{
    			PORTB=PORTB|(1<<PB2);
    			waitMs(600);
    			PORTB=PORTB&(~(1<<PB2));
    		}
    
    	else
    		{
    			PORTB=PORTB|(1<<PB1)|(1<<PB2);
    			waitMs(600);
    			PORTB=PORTB&(~(1<<PB1))&(~(1<<PB2));
    		}
    	}
    	return 0;
    }

  2. #42
    Erfahrener Benutzer Roboter Experte Avatar von BurningWave
    Registriert seit
    22.12.2007
    Ort
    nahe Stuttgart
    Alter
    30
    Beiträge
    656
    Auch wenn du es nicht glaubst, Programmerfehler entstehen nicht durch fehlerhaften Code. Wenn du es unbedingt testen musst, dann erstelle eine neue Datei, schreibe irgendeinen Mist rein und speicher die Datei unter .hex und versuche sie zu brennen, es wird funktionieren, wenn der Programmer den µC erkennt und die Verdrahtung stimmt. In diesem Fall funktioniert es einfach mit jeder Datei.
    Vielleicht hat deine Schaltung einen Wackelkontakt oder so (du willst sie ja nicht posten)?! Du sagtest, dass du den µC nach dem Programmieren in deine Platine gesteckt hast, heißt das, dass du das eine Mal ISP benutzt und das andere Mal den Programmer direkt?
    meine Homepage: http://www.jbtechnologies.de
    Hauptprojekte: Breakanoid 2 - Sound Maker

  3. #43
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    15.04.2008
    Beiträge
    330
    Vielleicht hat deine Schaltung einen Wackelkontakt oder so (du willst sie ja nicht posten)?
    Sry falls das blöd rübergekommen ist, aber ich habe keine Ahnung mit welchem Programm ich Schaltungen zeichnen kann...

    Nur, wie gesagt, Minimalbeschaltung... Ich kann probieren sie in Paint zu zeichnen und dann hier irgendwie raufzustellen...


    So ein Fehler mit 0x0F =! 0x00 hatte ich schon mal bei nem Blinkprogramm, dann hab e ich die Klammern geändert und aus int main (void) main () gemacht und es ging. Der Fehler schien nicht mehr auf...
    Darum bin ich von einem Codefehler überzeugt...

  4. #44
    Erfahrener Benutzer Roboter Experte Avatar von BurningWave
    Registriert seit
    22.12.2007
    Ort
    nahe Stuttgart
    Alter
    30
    Beiträge
    656
    So ein Fehler mit 0x0F =! 0x00 hatte ich schon mal bei nem Blinkprogramm, dann hab e ich die Klammern geändert und aus int main (void) main () gemacht und es ging. Der Fehler schien nicht mehr auf...
    Darum bin ich von einem Codefehler überzeugt...
    Und ich bin mir sicher, dass es Zufall war, es klingt ganz nach Wackelkontakt (o. ä.). int main (void) ist durchaus erlaubt (und wenn es ein Fehler wäre, würde der Compiler meckern). Ich denke, dass du einfach das eine Mal pech hattest und nach dem du das verbessert hast, hattest du Glück oder so.

    Du kannst Schaltpläne mit Eagle ( www.cadsoft.de ) erstellen oder einfach von Hand zeichnen und als Bild hochladen. Wie programmierst du den µC jetzt genau? Welcher Programmer? Welche Software? Wie sieht die Verbindung aus? ISP?
    meine Homepage: http://www.jbtechnologies.de
    Hauptprojekte: Breakanoid 2 - Sound Maker

  5. #45
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    15.04.2008
    Beiträge
    330
    Und ich bin mir sicher, dass es Zufall war, es klingt ganz nach Wackelkontakt
    Du meinst, in der Programmer-Platine??

    Wie programmierst du den µC jetzt genau?
    Also auf jeden Fall über USB. Es heißt myAVR Workpad und war bei der Platine mitgeliefert.

    http://www.myavr.de/
    mySmartUSB MK2
    myMultiProg MK2 USB

    Das eine wird auf das andere gelötet, Software liegt bei.

  6. #46
    Erfahrener Benutzer Roboter Experte Avatar von BurningWave
    Registriert seit
    22.12.2007
    Ort
    nahe Stuttgart
    Alter
    30
    Beiträge
    656
    OK, das mySmartUSB MK2 und das myMultiProg habe ich auch - und noch nie Probleme damit gehabt. Ein Wackelkontakt könnte nur in sofern vorliegen, dass die 2 Platinen nicht sauber miteinander verbunden sind oder der µC nicht richtig in der Fassung steckt.

    Ich würde dir empfehlen, mal einen anderen Programmer und Compilerzu benutzen, vielleicht funktioniert es dann. Ich benutze AVR Studio mit dem WinAVR Plugin (für avr-gcc) und als Programmer das mitgelieferte AVR Prog (unter dem Tools-Menü zu finden). Sollte das Programmieren mit AVR Prog fehlschlagen, dass ist der µC höchstwahrscheinlich defekt.
    meine Homepage: http://www.jbtechnologies.de
    Hauptprojekte: Breakanoid 2 - Sound Maker

  7. #47
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    15.04.2008
    Beiträge
    330
    Hey, ich habe das Programm soweit vereinfacht wie nur irgendwie möglich.

    Alles Unnötige rausgestrichen, wie die Anzeige der Daten.

    Zuerst hatte ich die ganze main-Funktion rausgeschmissen, mit dieser fängt er aber an, drum gabs gleich einen Error.


    Jetzt misst er nur mehr die Spannung mittels der Mainfunktion.

    Und: Es klappte endlich zum draufbrennen!!!!!!!!!!

    Der Code sieht vorerst so aus:

    Code:
    uint16_t readADC(uint8_t channel) 
    {
    	// Funktion 1 zum Auslesen der Spannung
    
    	uint8_t i;                   // Variablen definieren (Zählervariable i + Resultat)
    	uint16_t result = 0;
    
    	ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1); //ADEN = ADC Enable 
    	// wenn adps1+2 on sind und adps0 off, dann ist der Teilungsfaktor 64 (Tabelle Datasheet)
    
    	ADMUX = channel; //Kanal wählen; REFs0+1 -> interne Referenz 2,56V verwenden, REFS1 gibt es bei Attiny13 nicht
    	//externen Kondensator mit 100nF (Aufdruck 104) an AREF auf Masse
    
    	//Dummy-Readout (unten), misst 1* Ergebnis, wird nicht gespeichert
    	ADCSRA = ADCSRA | (1<<ADSC); // Schaltet bei ADCSRA das ADSC-Bit ein, d.h. Messung starten
    	while(ADCSRA & (1<<ADSC)); //Warte bis Messvorgang vorbei ist
    
    	// Nun 3* Spannung auslesen, Durchschnittswert ausrechnen
    	for (i=0; i<3; i++) 
    	{
    		// Schleife, startet 3*
    		ADCSRA = ADCSRA |(1<<ADSC); // Einmal messen
    		while(ADCSRA & (1<<ADSC));  //Warte bis Messung vorbei
    
    		result = result + ADCW; // Resultate zusammenzählen (R1+R2+R3) -> später alles /3
    	}
    
    	ADCSRA = ADCSRA & (~(1<<ADEN)); //ADC wieder deaktivieren
    
    	result=result/3;    // Durchschnittswert
    
    	return result;
    }
    
     main ()						// Hauptprogramm, startet bei Power ON und Reset
    {
    	float spannung;    //Definiere Variable
    	DDRB=0b00001111;
    
    	while (true)
    	{
    
    		uint16_t result = readADC(0); // ruft die ADC Funktion auf an Pin0 =ADC0
    
    		
    		}
    	return 0;
    }
    Nun hätte ich gerne, dass er die Spannung konvertiert und anzeigt. Das sollte doch mittels Bit-Verschiebung gehen, oder?

    Ich meine zB. 1,65 Grad: für die 1 Volt blinkt Led1 1 mal, für die sechs Volt Led2 6mal, etc.


    Edit: Wenn ich ''spannung=0.003086*(float) (result);'' dazugebe, streikt das Programm wieder...

  8. #48
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    15.04.2008
    Beiträge
    330
    So, hier habe ich die Schaltung

    das mit dem Attachment hinzufügen klappt irgendwie nicht, liegt das an meinem PC??

    ''spannung=0.003086*(float) (result);'' ist also der Fehler in meinem Program. Ich habe es auch schon ohne (float) versucht... Nichts geht irgendwie...

  9. #49
    Erfahrener Benutzer Roboter Experte Avatar von BurningWave
    Registriert seit
    22.12.2007
    Ort
    nahe Stuttgart
    Alter
    30
    Beiträge
    656
    spannung=0.003086*(float) (result); diese Zeile ist definitiv richtig und wenn du das Programm nicht brennen kannst, wenn es diese Zeile beinhaltet, dann funktioniert entweder dein Compiler nicht oder es ist irgendwas an der Hardware defekt.

    Mache es, wie ich gesagt habe und benutze AVR Studio mit WinAVR-Plugin.
    meine Homepage: http://www.jbtechnologies.de
    Hauptprojekte: Breakanoid 2 - Sound Maker

  10. #50
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    15.04.2008
    Beiträge
    330
    Ok, habe mir das AVR Studio schon runtergeladen, werde es dann mal mit dem probieren.

    Ich habe noch mal probiert, die Schaltung hochzuladen, jetzt schrieb er 'ungültiges Format' (ist in Paint geszeichnet...)

Seite 5 von 7 ErsteErste ... 34567 LetzteLetzte

Berechtigungen

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

12V Akku bauen