- Akku Tests und Balkonkraftwerk Speicher         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 14 von 14

Thema: Asuro ohne asuro.lib programmieren

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

    Praxistest und DIY Projekte
    ach stimmt ja, ist es in der neuen asurolib nicht sogar 36kHz ?!

  2. #12
    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

    Wir greifen vor, im Moment sind wir doch noch beim Aufruf der ISR.

    Die eigentliche Funktion des Timer2 ist die Erzeugung des 36kHz-Trägersignals für die IR-Kommunikation. In der orginalen CD-Lib wurde im CTC-Mode beim Erreichen des OCR2-Wertes der OC2-Ausgang umgeschaltet (togglen) und der Zähler wieder bei 0 gestartet. Bei 72kHz ergibt das 36kHz an OC2-Pin. Die ISR wird aber mit 72kHz angesprungen.

    Neuere Libs (mit FastPWM) schalten pro Zähldurchlauf des Timers2 (0x25-0xff) zweimal den OC2-Pin um, aber die ISR wird nur beim Überlauf am Ende mit 36kHz aufgerufen.

    Die Änderung des Timer2 auf 36kHz gibt es seit Version 2.3(beta2) in der asuro-Lib (IR-Abstandsmessung von Waste):
    Code:
    /*******************************************************************************
    *
    * File Name:   asuro.c
    * Project  :   ASURO
    *
    * Description: This file contains ASURO main features
    *
    * Ver.     Date         Author           Comments
    * -------  ----------   --------------   ------------------------------
    * 1.00	   14.08.2003   Jan Grewe		 build
    * 2.00     14.10.2003   Jan Grewe        LEFT_VEL, RIGHT_VEL -> MotorSpeed(unsigned char left_speed, unsigned char right_speed);
    *										 LeftRwd(),LeftFwd(),RightRwd(),RigthFwd() -> MotorDir(unsigned char left_dir, unsigned char right_dir);
    *                                        GREEN_ON,GREEN_OFF,RED_ON,RED_OFF -> StatusLED(unsigned char color);
    *                                        LED_RED_ON, LED_RED_OFF -> FrontLED(unsigned char color);
    *                                        Blink(unsigned char left, unsigned char right) -> BackLED(unsigned char left, unsigned char right);
    *                                        Alles in Funktionen gefasst => leichter verständlich ?!?!
    * 2.10     17.10.2003   Jan Grewe        new Timer funktion void Sleep(unsigned char time36kHz)  
    *
    * Copyright (c) 2003 DLR Robotics & Mechatronics
    *****************************************************************************/
    /****************************************************************************
    *
    * File Name:   asuro.c
    * Project  :   asuro library "Robotrixer Buxtehude"
    *
    * Description: This file contains additional functions:
    *
    * signal (SIG_ADC)                 interrupt/signal routine for encoder-counter
    * signal (SIG_INTERRUPT1)          signal for switches
    * Encoder_Init()                   initializing encoder-counter
    * Encoder_Start()                  start autoencoding
    * Encoder_Stop()                   stop autoencoding
    * Encoder_Set(int,int)             set encodervalue
    * Msleep(int delay)                wait for delay in milliseconds
    * Gettime()                        get systemtime in milliseconds
    * PrintInt(int)
    *
    * modifications in Sleep, SIG_OUTPUT_COMPARE2, PollSwitch, LineData
    *
    * Ver.     Date         Author           Comments
    * -------  ----------   --------------   ------------------------------
    * beta1	   31.03.2005   Robotrixer		 asuro library
    * -------  ----------   --------------   ------------------------------
    * the encoder source is based on RechteckDemo.c ver 2.0 by Jan Grewe 22.10.2003 
    * Copyright (c) 2003 DLR Robotics & Mechatronics
    
    *****************************************************************************/
    /****************************************************************************
    *
    * File Name:   asuro.c
    * Project  :   asuro library modified for IR collision detector
    *
    * Description: modifications made in following functions:
    *
    * SIGNAL (SIG_OUTPUT_COMPARE2)	->	SIGNAL (SIG_OVERFLOW2)
    * Gettime()							counts now 36kHz
    * Init()							timer2 modified for adjustable duty cycle
    * Batterie()						bug fixed
    * Sleep()							counts now 36kHz
    * Msleep()							counts now 36kHz
    *
    * Ver.     Date         Author           Comments
    * -------  ----------   --------------   ------------------------------
    * beta2	   11.06.2005   Waste   		 asuro library
    * -------  ----------   --------------   ------------------------------
    *****************************************************************************/
    /***************************************************************************
    *                                                                         *
    *   This program is free software; you can redistribute it and/or modify  *
    *   it under the terms of the GNU General Public License as published by  *
    *   the Free Software Foundation; either version 2 of the License, or     *
    *   any later version.                                                    *
    ***************************************************************************/
    
    #include "asuro.h"
    volatile unsigned char count36kHz;
    volatile unsigned long timebase;
    volatile int autoencode=FALSE;
    
    /* uses timer2 (36kHz for IR communication */
    SIGNAL (SIG_OVERFLOW2)
    {
    	TCNT2 += 0x25;
    	count36kHz ++;
    	if (!count36kHz) timebase ++;
    }
    
    ,,,
    
    /* Init function Processor will be initalized to work correctly */
    void Init (void)
    {
    	//-------- seriell interface programmed in boot routine and already running -------
    	//  prepare 36kHz for IR - Communication
    	TCCR2 = (1 << WGM20) | (1 << WGM21) | (1 << COM20) | (1 << COM21) | (1 << CS20);
    	OCR2  = 0x91; // duty cycle for 36kHz
    	TIMSK |= (1 << TOIE2); // 36kHz counter for sleep
    ....
    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!

  3. #13
    Benutzer Stammmitglied
    Registriert seit
    17.05.2009
    Beiträge
    46
    Hallo miteinander,

    Habe mich nochmals mit dem Ganzen befasst, mir ist nun einiges klarer geworden, doch leider noch nicht alles:
    1. Warum rechnet der compare2 die 36kHz mal zwei?
    2. Die ganzen Timer-Einstellungen (TCCR2,OCR2 und TIMSK) (habe die werde gefunden im ATmega8 Datenblatt, jedoch noch nicht verstanden. Werde es aber nochmals selbst versuchen)
    3. Die Sekunde die er warten soll ist länger als eine Sekunde (habe ein eigenes makefile erstellt und dort eine ATmega8 und den Takt mit 8MHz definiert)

    Hoffe ihr könnt mir bei der Frage 1 und 2 weiter helfen.
    Hier noch mein Funktionierender Code:
    Code:
     #include <avr/io.h> 
     #include <avr/signal.h>
     
     
     //Front LED an Port D6
     #define D6			(1<<PD6)
    
    
    // unsigned char= Wertbereich ohne Vorzeichen von 0-255
    // volatile 	= wird benutzt, um eine Variabel der Interrupt-Rutine zu geben 
    volatile unsigned char count72kHz;					
    
    
    // Rutine die mit 36Khz arbeite. Alle [1/(36*2)= 13.89müs] wird count72kHZ um 1 erhöht
    SIGNAL (SIG_OUTPUT_COMPARE2) {count72kHz ++;}
    
    
    // int	= Wertbereich von (-32768)-32767 
    int i;											
     
     
     // main Prozess wird gestartet
     int main (void) {
     
     
     // Port D6 wird als Ausgang gesetzt
     DDRD |= D6;
     
     
     // WGM21 = Mode 2 -> CTC
     // COM20 = auf OC2 auf gleichen Wert vergleichen
     // CS20  = kein prescaling
     TCCR2= (1<<WGM21) | (1<<COM20) | (1<<CS20);
     
     
     // 0x6E 110
     OCR2 = 0x6E;
     
     
     //Overflow-Interrupt aktivieren 
     TIMSK |= (1<<OCIE2);
     
     sei ();						//alle Interrupts einschalten
     
     
     while (1) {					//Endlosschleife starten
     
     PORTD |= D6;					//Port D6 auf high
     for (i= 0; i < 1000; i++)		// i ist 0, warten bis i 500 hat, i plus 1
     {
      count72kHz = 0;				//Variabel count72kHz ist 0
      while (count72kHz < 72);		//warten bis count72kHz 72 hat
     }
     
     
     PORTD &= ~D6;					//Port D6 auf low
     for (i= 0; i < 1000; i++)		//sieh oben
     {
      count72kHz = 0;
      while (count72kHz < 72);
     }}
     
     return 1;						//zurück zu main, wird aber nicht erreicht
     }
    Danke für eure Hilfe
    GR Bongo

  4. #14
    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

    Zu 1: Eine Periode mit 36kHz dauert zwei Halbwellen mit 72kHz. Nach 1/72000 high, nach weiteren 1/72000 wieder low. (Ich hoffe, ich habe die Frage richtig verstanden)

    Zu 2: Da mußt du leider selbst durch ;)

    Zu 3: Wieviel dauert die Sekunde denn länger?

    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!

Seite 2 von 2 ErsteErste 12

Berechtigungen

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

Solar Speicher und Akkus Tests