-
        

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

Thema: Asuro ohne asuro.lib programmieren

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    17.05.2009
    Beiträge
    46

    Asuro ohne asuro.lib programmieren

    Anzeige

    Hallo,

    Bin am C erlernen. Einen kleinen Einblick habe ich mit Asuro bekommen. Nun wollte ich es einmal ohne der asuro.c und asuro.h Dateien probieren.
    Bis jetzt habe ich mir erst das ein und ausschalten der Ports beigebracht.

    Jetzt wollte ich mit dieser Funktion die H-Brücke ansteuern. So wie ich es verstanden kann ich PB1 und PB5 auf +5v stellen um den Motor mit voller Geschwindigkeit laufen zu lassen. Habe dies versucht, jedoch ohne Erfolg. Ich denke der Fehler liegt an der PWM Leitung. Muss PB1 immer ein PWM Signal senden. Theoretisch nicht und das bedeutet Vollgas.

    Habe auch das Asuro-Wiki konsultiert, jedoch ohne erfolg.
    Wo Liegt der Fehler?

    Hier der Code:
    Code:
     #include <avr/io.h>
     
     #define FRONT_LED			(1<<PD6)
     #define STATUS_LED_GRUN	(1<<PB0)
     #define STATUS_LED_ROT		(1<<PD2)
     #define BACK_LED_RECHTS	(1<<PC0)
     #define BACK_LED_LINKS		(1<<PC1)
     #define PORT_B5			(1<<PB5)
     #define PORT_D5			(1<<PD5)
     #define MOTOR_PWM_B		(1<<PB1)
     #define Motor_PWM_D		(1<<PD1)
     
     int main (void) {
     
     DDRB |= STATUS_LED_GRUN | PORT_B5 | MOTOR_PWM_B;
     DDRC |= BACK_LED_RECHTS | BACK_LED_LINKS;
     DDRD |= FRONT_LED | STATUS_LED_ROT | PORT_D5 | Motor_PWM_D;
     
     
     PORTB |= STATUS_LED_GRUN | PORT_B5 | MOTOR_PWM_B;
     PORTC |= BACK_LED_RECHTS | BACK_LED_LINKS;							
     PORTD |= FRONT_LED | STATUS_LED_ROT | PORT_D5 | Motor_PWM_D;		
     
     return 1;
     }

  2. #2
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    while(1); fehlt vor return

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

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    17.05.2009
    Beiträge
    46
    Hallo radbruch

    Leider habe ich es noch nicht fertiggebracht die Räder zum drehen zu bringen. Immer hin habe ich am Port B1 1.6 V. Würde sagen ich habe ein PWM Signal erschaffen
    Werde über das Wochenende ein wenig pröbeln. Falls ich nicht weiter komme Frage ich nochmals.
    Danke für die Hilfe
    mfg Bongo

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

    Motor links: PB1 (PWM) und PD5(high) UND PD4(low)
    Motor rechts: PB2 (PWM) und PB5(high) UND PB4(low)

    Wenn du PB4/PD4 nicht als Ausgang und low schaltest steuern die Transistoren T1 und T5 nicht durch. Für links:

    PD4 low, PD5 high und PB1 high =

    T1 leitet (PD4low)!
    low an ic1:12 (PD4low) und high an ic2:13 (PB1high) T2 sperrt

    T3 sperrt (PD5high)
    high an ic3:2(PD5high) und high an ic3:1 (PB1high) T4 leitet

    Strom fließt von Vcc über T1 nach Motor nach T4 zu GND

    Ich hoffe, nun passt es endlich

    Gruß

    mic

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

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    17.05.2009
    Beiträge
    46
    Super, nun fährt der Asuro. Auch mit der Kombination mit dem PWM Signal funktioniert es. Danke!

    Nun habe ich mich (seit 2 Tagen) mit der Sleep Funktion auseinander gesetzt. Doch leider klappt dies nicht.
    Code:
     #include <avr/io.h>
     
     
     
     #define D6			(1<<PD6)
    
    volatile unsigned char count72kHz;
    
    int i;
     
     int main (void) {
     
     
     DDRD |= D6;
     
     
     TCCR2= (1<<WGM21) | (1<<COM20) | (1<<CS20);
     OCR2 = 0x6E;
     TIMSK |= (1<<OCIE2);
     
     while (1) {
     
     PORTD |= D6;	
    
     for (i= 0; i < 1000; i++)
     {
      count72kHz = 0;
      while (count72kHz < 72);
     }
     
     
     PORTD &= ~D6;
    
    
     for (i= 0; i < 1000; i++)
     {
      count72kHz = 0;
      while (count72kHz < 72);
     }
     }
     return 1;
     }
    Was habe ich übersehen? Ich weiss, dass ich es auch mit der Funktion delay ms hinkriegen würde.
    Gibt es eigentlich Tabellen werte wo ich für den counter die Werte WGM, COM und CS ablesen kann?

    Danke für die Hilfe.
    Gr Bongo

  6. #6
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    Hallo

    Die Timerwerte muss man sich selbst errechnen, im Datenblatt des Mega8 (Pflichtlektüre für mit ohne Lib Programmierer!) stehen die Tabellen für die Registerbits.

    while (count72kHz < 72);

    Hast du mal darüber nachgedacht wie count72kHz es schaffen soll so groß wie 72 zu werden? Was bedeutet denn das "volatile"?

    Gruß

    mic

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

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    17.05.2009
    Beiträge
    46
    Hallo radbruch

    Ich hatte früher für die Sleep-Funktion folgende Formel benutzt:
    for (i=0; i<1000; i++) {Sleep(72); // 72/72=1ms -> 1000 wiederholen

    Und diese habe ich nun versucht aufzulösen.
    Das volatile habe ich aus der asuro.c

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

    Das es aus asuro.c stammt ist schon klar, ich wollte dich nur etwas in Richtung der Lösung "schieben". Da du dir schon einiges selbst erarbeitest hast wollte ich dir den Weg zeigen die Lösung selbst zu finden.

    Der Timer wird im Overflow-Mode betrieben, das bedeutet, immer wenn der Timerzähler 255 überschreitet (Timer2 ist ein 8 Bit-Timer) passiert irgendwas. Nach dem Überlauf startet der Timer in diesem Modus beim Wert der in OCR2 steht. Standartmässig ist in der Lib der Interrupt aktiviert:

    TIMSK |= (1<<OCIE2);

    Im Timermaskregister wird so das Bit gesetzt welches den Overflow-Interrupt erlaubt (O verflow C ounter I nterrupt E nable 2). Wenn das Register überläuft wird zur Interruptserviceroutine ISR) für den Überlauf des Timer 2 gesprungen. Das ist so ähnlich wie der Aufruf einer Funktion. In der Lib wird eine ältere Schreibweise für die ISR verwendet:

    SIGNAL (SIG_OVERFLOW2)
    {
    }

    Das solltest du in asuro.c auch finden und dort wird auch count72kHz geändert. Diese ISR must du nun selbst einfügen sonst setzt der Kompiler hier nur eine Dummy-ISR mit einem return ein. Und hier gehört auch das "volatile" dazu: Es teilt dem Kompiler mit das es eine Variable ist die in einer ISR verändert wird. Dadurch muss er sie anders speichern, aber ich schweife ab...

    Die ISR wird während deiner while (count72kHz < 72);-Schleife quasi im Hintergrund ausgeführt. Deshalb wird count72kHz nach 72 Aufrufen (=Interrupts) so groß wie 72 und deine Schleife wird beendet.

    Neben dem Bit im TIMSK müssen auch die globalen Interrupts freigegeben werden:

    sei();

    Gruß

    mic

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

  9. #9
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    33
    Beiträge
    2.378
    bitte beachte, dass du den timer noch passend initialisieren musst, kannst dir ja datenblatt und die asuro lib zur hilfe nehmen, damit du auch wirklich eine zählfrequenz von 72kHz bekommst

  10. #10
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    Hallo

    Das Timersetup stammt aus der orginalen asuro-(CD)-Lib mit 72kHz-Takt, dort wird ein anderer Interrupt verwendet:

    SIGNAL (SIG_OUTPUT_COMPARE2)

    Deshalb stimmt meine Beschreibung oben überhaubt nicht. Wie das wirklich funktioniert ist nicht nur für mich schwer durchschaubar:
    http://www.roboternetz.de/phpBB2/zei...ag.php?t=31409

    Das ist mehr als kniffelig :)

    Gruß

    mic

    [Edit]
    Ich habe jetzt etwas gestöbert und bin auf diese Beschreibung von Sternthaler gestoßen:
    http://www.roboternetz.de/phpBB2/zei...=452634#452634

    Das ist die Beschreibung der neueren (aktuellen?) 36kHz-Version (mit den ominösen 0x25;) die eine Pulsweitenmodulation der IR-Led erlaubt. Es ist meiner Meinung nach die bessere Initialisierung des Timer2 beim asuro.

    Eine Beschreibung der orginalen 72kHz-Version von Henk persönlich habe ich hier gefunden:
    http://www.roboternetz.de/phpBB2/zei...?p=79918#79918

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

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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