-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 17

Thema: AtMega32 mit Timer0 Servo ansteuern, nur wie?

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    31.03.2008
    Beiträge
    10

    AtMega32 mit Timer0 Servo ansteuern, nur wie?

    Anzeige

    Hi,

    wir sind so langsam am verzweifeln, da die von uns durchdachte Servoansteuerung nicht funktioniert.

    Wir arbeiten mit einem AtMega32 8MHz

    Plan war es das Signal für die Servosteuerung durch Interrupts zu erstellen (Interrupts alle 10µs)

    Nur leider ist das Ergebnis nicht das von uns Gewünschte 1,5ms(High) zu 17,5ms(Low) Verhältnis. wir bekommen eine Highzeit von ca. 9ms und demenstprechender Lowzeit.

    Der Fehler tritt sowohl bei der Benutzung des internen, als auch bei der Benutzung eines Externen Taktes auf.

    Der Timer scheint zu langsam zu sein, aber warum? woran kann das liegen


    Code:
    #include <avr/io.h>
    #include <avr/interrupt.h>
    
    // volatile Interupt Zugriff
    volatile int s_AnZeit = 150;		// "Lenkzeit" in microsecond
    volatile int s_AnZeit_tmp = 150;	// Sicherheits Zwischenspeicher für Lenkzeit
    volatile long int s_Counter = 0;	// Zählervariable für den Servo
    PORTD =0x00;						// PORTD auf Low setzen
    
    
    
    ISR(TIMER0_OVF_vect)
    {
    TCNT0 = 176;
    
    if (s_Counter == 0)
    {
    	PORTD =0x40;					// PORTD6 auf High setzen
    }
    
    if (s_Counter == s_AnZeit_tmp)
    {
    	PORTD =0x00;					// PORTD auf Low setzen
    }
    
    s_Counter++;
    
    if (s_Counter == 2000)
    {
    	s_AnZeit_tmp = s_AnZeit;		// Holen der neuen "Lenkzeit"
    	s_Counter = 0;					// Zurücksetzen der Zählervarible
    }
    
    }
    
    
    
    int main ()
    {
    
    
    DDRD=0xff; 							// PORTD6 auf Ausgang
    PORTD =0x00;						// PORTD vorsichtshalber mal auf Low gesetzt
    
    
    TCCR0 |= (0<<WGM01)|(1<<WGM00)|(0<<COM01)|(0<<COM00)|(1<<CS00);
    TCNT0 = 176;
    TIMSK |= (1<<TOIE0);
    
    sei();
    
    	do
    	{
    
    	
    	}
    	while (1);
    
    }
    Habt ihr eine Idee?

    gruß marcus

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Ob der Mega mit dem 8-MHZ quartz arbeitet, wird durch die Fuses entschieden. Das ist in deinem Beispiel natürlich nicht ersichtlich.

    Remark:
    Sowas ist natürlich sinnlos, Null verschieben gibt wieder Null
    (0<<WGM01)
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    31.03.2008
    Beiträge
    10
    Ja weiß ich doch, ich nutze das STK500 und hab da halt den Quarz bz. den internen Takt benutzt, aber bei beiden war das Ergebniss gleich, also muss der AVR wohl auf 8Mhz laufen.
    Das mit der 0 auf 0 schieben, ist noch drin da wir verschieden Einstellungen getestet haben.

    Der Punkt ist aber der, das der Timer ja so (also 8Mhz AVR takt) das gewünschte Ergebnis liefern sollte, macht er aber leider nicht, nur warum?

  4. #4
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Ich hab in eine Prog von mir nachgesehen, ich schreibe in TCCR0 nur den Prescaler rein, alles andere auf NULL (also KEIN WGMxx).
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    31.03.2008
    Beiträge
    10
    Ok das habe ich jetzt mal Versuch, dann müsste die Zeile also so sein:
    TCCR0 |= (1<<CS00); //Prescaler auf 1
    und halt den Vorladewert TCNT0 = 176;

    Aber er macht immernoch genau das selbe

  6. #6
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Muss annehmen, dass der Mega mit dem internen Oszillator läuft.
    d.h. die STK und auch der Quartz sind ihm völlig egal, daher auch das gleiche Ergebnis.

    TImer0 ist in der Grundfunktion wirklich nix mystisches.

    http://www.rn-wissen.de/index.php/Ba...erste_Programm

    Ich nehm aber lieber das Ponyprog (for free), das scheint mir persönlich intuitiver.

    Erstmal die Fuses lesen, dann schauen, was eingestellt ist. sind nur zwei Häkchen.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    31.03.2008
    Beiträge
    10
    Hi,
    Ja da der Timer in normaler Grundfunktion ist, dachten wir ja auch, kann nicht so schwer sein. Aber es geht nicht richtig, er ist ein Stück zu langsam, also der Takt zu lange.
    Das mit dem Quarz ist auch nicht das Problem, die Fuse-Bits sind jetzt auf extern gesetzt, wenn ich den Quarz rausnehme, generiert er überhaupt kein Signal, von daher denke ich, läuft der Quarz wie es sein sollte.
    Kann der Interupt-betrieb eine so lange "Störung" erzeugen, also anstatt 1,5mS ganze 9mS?
    Ich habe auch mal den AtMega getauscht, aber keine Besserung.

    Hat noch jemand einen Tipp was ich versuchen kann?

  8. #8
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Ich hab immer erstmal ein Testprogramm am Laufen, das jede Sekunde einmal blinkt.
    Da kann man schon mit freiem Auge abschätzen, ob die Speed passt.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    31.03.2008
    Beiträge
    10
    Da muss ich dir recht geben, habe mal eine 1S blinkende LED mit dem Timer gemacht, das funktioniert wie es sollte.
    Danach habe ich mich nochmal an mein Programm oben gesetzt und einfach den Port in der ISR auf High und dann sofort wieder auf Low gesetzt...
    ISR (Timer0) {
    PORTD=0x04;
    PORTD=0x00;}
    Der Port bleibt für ca. 9mS high.
    Woran kann das liegen, Rest-Kapazität die den Pegel oben hält?
    Oder einfach am 8 Bit-Timer?

  10. #10
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    14.10.2006
    Ort
    Saarland
    Beiträge
    390
    ich kenne mich mit dem mega32 nicht so aus, aber ist es nicht so, dass
    du hier TCCR0 |= (0<<WGM01)|(1<<WGM00) in den PWM-Modus schaltest
    statt: TCCR0 |= (0<<WGM01)|(0<<WGM00) für Normalmodus.
    Ist auch glaube ich das was PicNick meinte.

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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