- LiTime Speicher und Akkus         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 22

Thema: Ständig Interrupt Probleme

  1. #11
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hast du im ADCSRA auch das ADIE gesetzt, ich sehe auch keine Referenzspannung REF im ADMUX, oder verwendest du extere Referenz.
    Hast du das Licht mit einem Oszi angesehen, es kommt sehr oft vor das das Licht flimmert und du es nicht bemerkst.

  2. #12
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.651
    Zitat Zitat von Hubert.G
    ... Hast du das Licht mit einem Oszi angesehen, es kommt sehr oft vor das das Licht flimmert und du es nicht bemerkst ...
    "...mit einem Oszi angesehen..." Kann ich nur wärmstens empfehlen. ICH (bin nach 8 Wochen µC - "Erfahrung" am tiny13 ja noch immer in der Anfängerklasse) und ich hatte die seltsamsten Probleme beim Programmieren mit Interrupt+Timer+ADC+Ports - bis ich einen Oskar genommen hatte und mal den/die Port/s nachgemessen habe. Auf einmal läuft meine Programmiererei erheblich schneller, weil ich die Reaktionen des µC auf mein Programm VIEL besser mitbekomme. Was ich will ist ja leider nicht immer das, was ich mit meinem Programm dem µC auftrage (sozusagen Verständigungsprobleme) . . . [-( und das merke ich mit dem Oszilloskop einfach VIEL schneller.

    @Spongebob85: Viel Erfolg
    Ciao sagt der JoeamBerg

  3. #13
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.11.2006
    Ort
    Hamburg
    Alter
    38
    Beiträge
    199
    Hatte das ADIE Bit echt noch nicht gesetzt. Hab ich eben erstmal gemacht.
    Der Sevo spinnt immernoch. Irgendwie glaub ich das das ein HardwareProblem sein könnte. Wüsste nur nicht warum das dann immer nur zum tragen kommt wenn ich meinen Motorkram programmiere. Theoretisch kann das doch irgend ein kleiner Metallspan auslösen, oder?
    Ich kann mir nämlich überhaupt nicht mehr vorstellen, das meine Software fehler macht.
    Ich kann programmieren was ich will. Nichts klappt

    und das merke ich mit dem Oszilloskop einfach VIEL schneller.
    Ach ja, wie gerne hätte ich doch ein oszilloskop aber ich komm nirgendwo an sowas ran. Muss ich wohl mein Weihnachtsgeld opfern

    Ich werde gleich erstmal ein Layout endwerfen. Mit meinem zusammengebrutzelten kram bin ich immer unglücklicher.

    MfG Jan
    Habe Mut, dich deines eigenen Verstandes zu bedienen.

  4. #14
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Poste doch mal noch den gesamten Code, vielleicht kann man dann etwas erkennen, bei Teile davon ist das immer etwas schwer, weil die Zusammenhänge fehlen.

  5. #15
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.651
    Sorry, Jan, ich denk ja, manchmal hätten andere die gleichen Probleme wie ich. Wie sieht es mit der Spannungsversorgung des Servos aus? Oder Strom? Ich hatte doch einige Probleme mit diesen Dingen - z.B. Netzteil auf max 200 mA gestellt und so.

    Und der Oskar ist blos geliehen ich würd sowas teueres nie kaufen.
    Ciao sagt der JoeamBerg

  6. #16
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.11.2006
    Ort
    Hamburg
    Alter
    38
    Beiträge
    199
    @Hubert.G:
    Mein Ganzer Code sieht jetzt so aus:
    Code:
    #include <avr/io.h>
    #include <stdint.h>
    #include <avr/interrupt.h>
    
    #ifndef F_CPU
    #define F_CPU 16000000
    #endif
    
    #define Scheinwerfer PD0
    #define Rueckleuchten PD1
    #define PWM_ServoPort PD5
    #define IR_Servo OCR1A
    #define Motor_Links PB3
    #define Motor_Rechts PD7
    #define Motor_Links_Rueck PC0
    #define Motor_Rechts_Rueck PC1
    
    //---------------------------------Globale Variablen----------------------------------
    volatile uint8_t count=0;
    volatile int8_t posi=25, a=1; 
    volatile uint16_t LDR;
    
    //---------------------------------Interruptroutinen----------------------------------
    ISR(TIMER1_COMPB_vect)
    {
    count++;
    }
    
    ISR(ADC_vect)
    {
    LDR = ADC;
    }
    
    //---------------------------------Helligkeitsmessung---------------------------------
    void helligkeitsmessung(void)
    {
    ADCSRA |= (1<<ADSC);
      
    if (LDR<=150)
      {
      PORTD |= (1<<Scheinwerfer);
      PORTD |= (1<<Rueckleuchten);
      }
    if (LDR>=190)
      {
      PORTD &= ~(1<<Scheinwerfer);
      PORTD &= ~(1<<Rueckleuchten);
      }
    }
    
    //-------------------------------------IR_Servosteuerung---------------------------------------
    int IR_Servoposition(void)
    {
    if ((count>=2)&&(a>=1))
      {
      posi++;
      count=0;
      if (posi>=50)
        {
        a=0;
        } 
      }
    if ((count>=2)&&(a<=0))
      {
      posi--;
      count=0;
      if (posi<=0)
        {
        a=1;
        }
      }
    return ((posi)+440);   //440=min, 490=max
    }
    
    //--------------------------------------Motorsteuerung-----------------------------------------
    void Motorsteuerung(void)
    {
    OCR0=0; //255=Max (Links)
    OCR2=0; //255=Max (Rechts)
    }
    
    //-------------------------------------initialisierungen---------------------------------------
    void Initial_ADC0(void)
    {
    ADMUX |= 0x00;	//AREF, resultat rechtsbündig, ADC-Eingang ADC0
    ADCSRA |= ((1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0));  //ADC eingeschaltet, Teilungsfaktor..
    ADCSRA |= (1<<ADIE);
    DDRD |= ((1<<Scheinwerfer) | (1<<Rueckleuchten));
    }
    
    void Initial_IR_Servo(void)
    {
    TCCR1A |= ((1<<WGM11)|(1<<COM1A1)|(1<<COM1A0)); //9-Bit PWM, Inverted Mode OC1A
    TCCR1A |= ((1<<COM1B1)|(1<<COM1B0)); //Inverted Mode OC1B
    TCCR1B |= (1<<CS12); 	//Prescaler 256
    TIMSK |= (1<<OCIE1B);
    DDRD |= (1<<PWM_ServoPort); 
    PORTD |= (1<<PWM_ServoPort);
    OCR1B=500; //beliebige zeit (irgendwas unter ner ms)
    }
    
    void Initial_Motoren(void)
    {
    //Ausgang Initialisieren (OC0)
    DDRB |= (1<<Motor_Links); //Setzen als Ausgang
    PORTB |= (1<<Motor_Links); //Pull-Up
    
    //Ausgang Initialisieren (OC2)
    DDRD |= (1<<Motor_Rechts); //Setzen als Ausgang
    PORTD |= (1<<Motor_Rechts); //Pull-Up
    
    //Initialisierung der Ausgänge für Rückwärtsfahren
    DDRC |= ((1<<Motor_Links_Rueck)|(1<<Motor_Rechts_Rueck));
    
    //Initialisierung PWM für OC0
    TCCR0 |= ((1<<WGM01)|(1<<WGM00)); //Fast PWM
    TCCR0 |= (1<<COM01); //Clear Output on Compare, Set on Top
    TCCR0 |= ((1<<CS02)|(1<<CS00)); //CLK/1024 (15,625kHz, 64µs/periode)
    //Compare Register ist OCR0
    
    //Initialisierung PWM für OC2
    TCCR2 |= ((1<<WGM21)|(1<<WGM20)); //Fast PWM
    TCCR2 |= (1<<COM21); //Clear Output on Compare, Set on Top
    TCCR2 |= ((1<<CS22)|(1<<CS21)|(1<<CS20)); //CLK/1024 (15,625kHz, 64µs/periode)
    //Compare Register ist OCR2
    }
    
    //---------------------------------------Hauptprogramm---------------------------------
    int main(void)
    {
    Initial_ADC0();
    Initial_IR_Servo();
    Initial_Motoren();
    sei(); //Globales Interrupt gesetzt
    
    while(1)
      {
      helligkeitsmessung();
      IR_Servo = IR_Servoposition();
      Motorsteuerung();
      }
    return 0;  //wird nie erreicht
    }
    Irgendwie finde ich auch komisch das man für jeden Interrupt mindestens eine Globale Variable braucht. Oder gibts ne andere Möglichkeit?
    Und die Struktur gefällt mir auch nicht wirklich. Ist halt aber mein erster Roboter und das erste mal das ich mehr als die Main funktion verwende.

    @oberallgeier
    Die Spannungsversorgung erfolgt über einen 7805. An dessen Eingang ein Akku hängt der 9,6V Nennspannung hat. Ist alles schon auf meinem Roboter.

    Hab hier von dem Roboter noch ein paar Bilder angehängt:
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken seite_137.jpg   motorplatine_557.jpg  
    Habe Mut, dich deines eigenen Verstandes zu bedienen.

  7. #17
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.651
    Zitat Zitat von Spongebob85
    @oberallgeier
    Die Spannungsversorgung erfolgt über einen 7805. An dessen Eingang ein Akku hängt der 9,6V Nennspannung hat. Ist alles schon auf meinem Roboter...
    Hab gerade das Datenblatt des 7805 angesehen. ok, (9,6 - 2) V - also mit dem Dropout das ist ok. Im Datenblatt sind als Ausgang 1,5 A empfohlen, Reichelt hält sich da eher zurück: "1A positiv voltage regulator / Gehäuse: TO-220" . Wieviel zieht der "Rest" Deiner Schaltung aus dieser Quelle? Reicht das alles.

    Ich hätte einfacher fragen sollen: hast Du mal die Spannung, am besten vorm Servo Vcc nachgemessen?

    Noch schönen Sonntag
    Ciao sagt der JoeamBerg

  8. #18
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    In deiner while-Schleife startest du deine drei Unterprogramme dauernd, speziell den ADC. Wenn du alle 20mSec zuerst dein Servo, dann die Motorsteuerung und dann die Helligkeitsmessung startest, ist das doch schnell genug.
    Bei einem Interrupt werden interne Variable nicht gesichert und daher auch schnell mal überschrieben.
    Zur Stromversorgung noch, wenn so ein Servo wegläuft braucht es schnell mal 500mA, so ein Spannungszucker kann da ganz rasch was durcheinanderbringen.

  9. #19
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.11.2006
    Ort
    Hamburg
    Alter
    38
    Beiträge
    199
    Wieviel zieht der "Rest" Deiner Schaltung aus dieser Quelle? Reicht das alles.
    Der servo ist der einzige "Großverbraucher"
    Die motoren laufen direkt über den Akku.

    In deiner while-Schleife startest du deine drei Unterprogramme dauernd, speziell den ADC. Wenn du alle 20mSec zuerst dein Servo, dann die Motorsteuerung und dann die Helligkeitsmessung startest, ist das doch schnell genug.
    Das verstehe ich nicht? Ist das also gut oder schlecht wie ich das mach? Und wie kann ich das verbessern?

    Bei einem Interrupt werden interne Variable nicht gesichert und daher auch schnell mal überschrieben.
    Was kann ich dagegen machen?

    Zur Stromversorgung noch, wenn so ein Servo wegläuft braucht es schnell mal 500mA, so ein Spannungszucker kann da ganz rasch was durcheinanderbringen.
    Gibt es noch ne andere Möglichkeit als den 7805? Was kann ich denn gegen diese Spannungsucker machen. Hab an ein und ausgängen vom 7805 Kondensatoren (100nF) über den µC auch einen 100nF kondi und die referenzspannung die von außen kommt ist mit einer 10µH Induktivität und einem 100nF Kondensator stabilisiert (so wie im Datenblatt beschrieben).

    Euch auch noch nen schönen Sonntag!

    MfG Jan
    Habe Mut, dich deines eigenen Verstandes zu bedienen.

  10. #20
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Zur while-Schleife habe ich geschrieben: Wenn du alle 20mSec zuerst dein Servo, dann die Motorsteuerung und dann die Helligkeitsmessung startest, ist das doch schnell genug. Also deinen Timer1 zum starten nehmen.
    Code:
    while(1)
      {
    if(count){
      count=0;
      IR_Servo = IR_Servoposition();
      Motorsteuerung();
      helligkeitsmessung();
     }
      }
    return 0;  //wird nie erreicht
    }
    So würde ich die Aufrufe machen.
    Zu den Variablen, entweder global oder als volatile kennzeichnen.
    Stromversorgung: Das ist so ein Fall wo man ein Oszi braucht um so Grenzfälle festzustellen, ein normales Meßgerät ist nicht schnell genug. Wenn die Software nichts mehr bringt das Servo mal probeweise mit einem eigenen Regler versorgen.

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Berechtigungen

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

LiTime Speicher und Akkus