- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 7 von 7

Thema: Asuro defekt?!?!?

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Benutzer Stammmitglied
    Registriert seit
    19.12.2009
    Beiträge
    30

    Asuro defekt?!?!?

    Hallo zusammen,

    ich hab mir vor kurzem einen Asuro zugelegt. Der Zusammenbau, das flashen usw. hatt alles problemlos funktioniert. Aber je mehr Programme ich schreib, desto verrückter werd ich. Ich verwende zum Programmieren Programmers Notepad 2 so wie in der Anleitung beschrieben. Nur, selbst wenn Programmers Notepad keine Fehler noch Warnungen, ausgibt, macht der Asuro manchmal einfahc was er will. Manchmal überspricht er einfach manche Programmschleifen und springt einfach weiter zur nächsten. So wie beim folgenden Programm die erste Schleife übersprungen wird:
    Code:
    #include "asuro.h"
    #include <stdio.h>
    
    unsigned char colo = FALSE;
    unsigned char zahl[5];
    int i = 0;
    
    int main(void)
    {	
    	int zaehler = 0;
    	unsigned int data[2], licht;
    	Init();
    	licht = 5;
    	data[0] = 0;
    	MotorDir(FWD, FWD);
    	MotorSpeed(102, 95); //Motoren laufen unterschiedlich
    	
    	ODOMETRIE_LED_ON;
    	
    	StatusLED(RED);
    	
    	while(1) {
    		DDRC &= ~((1 << PC0) | (1 << PC1)); // Input => no break LED
    		ADMUX = (1 << REFS0) | WHEEL_RIGHT; // AVCC reference with external capacitor
    		ADCSRA |= (1 << ADSC);			// Start conversion
    		while (!(ADCSRA & (1 << ADIF)));	// wait for conversion complete
    		ADCSRA |= (1 << ADIF);			// clear ADCIF
    		data[1] = ADCL + (ADCH << 8);
    		
    		licht += data[1];
    		data[0]++;
    		if(data[0] > 50)
    			break;
    		
    	}
    	
    	StatusLED(GREEN);
    	licht = licht / 50;
    	MotorSpeed(0, 0);
    	for(i = 0; i < 600; i++)
    		Sleep(255);
    	MotorSpeed(100, 100);
    	
    	while(zaehler < 126){		
    		ADMUX = (1 << REFS0) | WHEEL_RIGHT; // AVCC reference with external capacitor
    		ADCSRA |= (1 << ADSC);			// Start conversion
    		while (!(ADCSRA & (1 << ADIF)));	// wait for conversion complete
    		ADCSRA |= (1 << ADIF);			// clear ADCIF
    		data[1] = ADCL + (ADCH << 8);
    		
    		
    		if((data[1] < licht) && (colo == FALSE)) {
    			colo = TRUE;
    			zaehler = zaehler + 1;
    			
    		}
    		else 
    			colo = FALSE;
    		
    		sprintf(zahl, "%d\n", data[1]);
    		SerWrite(zahl, 5);
    		
    	}
    	StatusLED(RED);
    	MotorSpeed(0, 0);
    	while(1);
    		
    		
    	return 0;
    }
    Die zweite Schleife funktioniert auch erst wie durch ein Wunder durch hinzufügen von spritnf und serwrite. Kann mir jemand sagen was ich falsch mach?

    MfG Neo

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    36
    Beiträge
    1.225
    Hallo Neo,

    du solltest dich noch etwas gründlicher mit der C-Programmierung auseinandersetzen. Was auch immer der ASURO tut, ist sicherlich nicht das was du möchtest - Deine erste Schleife ist mit "while(1)" eine Endlossschleife, alles was danach kommt wird also schon einmal nicht ausgeführt.

    Gerade am Anfang ist es von Vorteil, wenn man seine Gedanken zuerst auf Papier bringt (Sequenzdiagramm als Stichwort zum selbersuchen) und davon ausgehend die einzelnen Elemente dann ausprogrammiert.

    mfG
    Markus

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    19.12.2009
    Beiträge
    30
    Zitat Zitat von markusj
    du solltest dich noch etwas gründlicher mit der C-Programmierung auseinandersetzen.
    Ich denk ich beherrsch C relativ gut, weil ichs doch schon etwas länger mache. Mein Code ist zwar ein reines Durcheinander aber ich weis was ich mach.

    Zitat Zitat von markusj
    Was auch immer der ASURO tut, ist sicherlich nicht das was du möchtest -
    richtig
    Zitat Zitat von markusj
    Deine erste Schleife ist mit "while(1)" eine Endlossschleife, alles was danach kommt wird also schon einmal nicht ausgeführt.
    1. Fakt ist, dass der Asuro nichtmal die while-schleife ausführt sondern einfach einmal durchläuft und weiter macht wie wenn da keine schleife wäre Komischerweise beachtet er aber die 2. Schleife.
    2. Wenn ichs richtig weis, wird die while-schleife durch das break in der if-bedingung beendet.

  4. #4
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    "Ich denk ich beherrsch C relativ gut,..." Führe endlos aus, aber brich ab wenn data[0] > 50 ist. Klingt echt viel besser als "mach 50 mal". Du scheinst C echt zu beherrschen.

    Woran merkst du, dass die erste Schleife nur einmal ausgeführt wird? Was macht du da eigentlich?

    Dein Programm kann ich nur mit Warnung kompilieren:
    test.c: In function 'main':
    test.c:61: warning: pointer targets in passing argument 1 of 'sprintf' differ in signedness
    sprintf() ist eh der Overkill im Mega8 ;)

    Gruß

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    36
    Beiträge
    1.225
    Pardon, das "break" hatte ich übersehen/nicht erwartet.

    An für sich sehe ich keinen wirklichen Fehler im Code, aber du solltest dringend aufräumen und in Funktionen auslagern (zum Bleistift der ADC-Code gibt eine wunderbare Funktion).
    Zum Debuggen würde ich dir empfehlen, einmal "SerWrite" nach jedem Abschnitt zu platzieren. Ich würde aber jedes komische Verhalten am ehesten deiner kreativen Codestruktur zuordnen.

    Wenn du glaubst, dass eine Schleife zu wenig ausgeführt wird, kannst du dir ja die relevanten Variablen ausgeben lassen. Manchmal gibt es bei der Auswertung von Sensordaten unerwartete Überraschungen

    mfG
    Markus

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    19.12.2009
    Beiträge
    30
    @radbruch:
    "Führe endlos aus, aber brich ab wenn data[0] > 50 ist. Klingt echt viel besser als "mach 50 mal"", geb ich dir recht. Irgendwann kommt man halt zum verzweifeln, wenns net funktioniert obwohl eig kein Fehler drin ist.

    "Woran merkst du, dass die erste Schleife nur einmal ausgeführt wird? Was macht du da eigentlich? "
    1. Die Led wird rot, und fast gleich danach wieder grün und die Variable licht wird trotzdem gesetzt.
    2. Ich will den Roboter über die OdometrieSensoren steuern, heißt z.B. den Asuro 50cm weit fahren lassen. Um schwarz und weiß richtig zu unterscheiden hab ich mir gedacht ich errechne zuerst ein Mittelwert (1. while-schleife). und danach wird ausgewählt, alles was unter dem mittelwert ist, ist weiß und alles drüber schwarz.(2. while-schleife).

    Warnungen beim Kompilieren hab ich nicht.


    spritnf() hat bis jetzt prima funktioniert, überhaupt kein Problem, aber ich werds mal weglassen vllt. hilfts.

    @markusj:
    kann ja mal vorkommen

    Ich werd deinen Rat morgen beherzigen und es nochmal umändern,. Mal schauen was dabei herauskommt.

    mfg Neo

  7. #7
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    zu 1: 50 mal ADC-Wert ermitteln dauert ein Fingerschnippen für den Mega8
    zu 2: Das mit dem Mittelwert wird so nix

    Ich erkenne leider den Sinn noch nicht so ganz. Warum startet licht mit 5? Fünfzig Lesungen bei MotorSpeed(102, 95); sehen nicht alle Segmente. Und alles nach StatusLED(GREEN); ist mir schleierhaft.

    Den Mittelwert bildet man, indem man bei laufenden Motoren über eine bestimmte Zeit die Min- und Maxwerte sucht. Als "Schaltschwelle" sollte man dann noch eine kleine Hysterese berücksichtigen.

    Irgendwann kommt man halt zum verzweifeln, wenns net funktioniert obwohl eig kein Fehler drin ist.
    Don't panic ;)

    Gruß

    mic

    [Edit]
    Das wäre auch wichtig:
    Code:
       ODOMETRIE_LED_ON;
    	Sleep(10);
       StatusLED(RED);
    
       while(1) {
    Warum verwendest du nicht OdometrieData()?
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

Berechtigungen

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

Solar Speicher und Akkus Tests