kramann.info
© Guido Kramann

Login: Passwort:










EmbSyst
1 day_by_day
2 Eingebettete_Systeme
..2.1 Softwareentwicklung
....2.1.1 AgileSoftwareentwicklung
....2.1.2 Verhalten
....2.1.3 Entwurfsmuster
....2.1.4 FuzzyRegler
....2.1.5 Uebung
..2.2 Arduino
....2.2.1 Uebung1
..2.3 Android
....2.3.1 UML
......2.3.1.1 Volumenberechnung
......2.3.1.2 UML_Klassendiagramm
......2.3.1.3 Konstruktor
......2.3.1.4 Statische_Variable
....2.3.2 bluej
....2.3.3 Threads
....2.3.4 Interfacedesign
....2.3.5 Android
......2.3.5.1 Getting_Started
......2.3.5.2 App
......2.3.5.3 Beispielprojekt
........2.3.5.3.1 Richtlinien
........2.3.5.3.2 Anforderungen
........2.3.5.3.3 Layout
........2.3.5.3.4 Projekt_einrichten
........2.3.5.3.5 Refactoring
........2.3.5.3.6 Icon
........2.3.5.3.7 Icon2
........2.3.5.3.8 Kurzanleitung
........2.3.5.3.9 Architektur
........2.3.5.3.10 Anwendungsklasse
......2.3.5.4 Threads
......2.3.5.5 Activities
......2.3.5.6 Was_ist_wo
......2.3.5.7 Regelungssysteme
........2.3.5.7.1 Servo
........2.3.5.7.2 Fahrzeug
......2.3.5.8 ADB_Apps
......2.3.5.9 Veroeffentlichen
......2.3.5.10 Einzelheiten
........2.3.5.10.1 Bildschirmaufloesung
........2.3.5.10.2 Parameter
........2.3.5.10.3 Permission
........2.3.5.10.4 Latenzzeit
......2.3.5.11 Tonerkennung
........2.3.5.11.1 Wahrscheinlichkeitsrechnung
........2.3.5.11.2 Kovarianz_Scilab
........2.3.5.11.3 Java_Threads
........2.3.5.11.4 Java_Reflection
....2.3.6 Processing
......2.3.6.1 Installation
......2.3.6.2 Erste_Schritte
......2.3.6.3 Mechatronik
......2.3.6.4 Bibliotheken
......2.3.6.5 Uebung
......2.3.6.6 Snippets
........2.3.6.6.1 Dateioperationen
........2.3.6.6.2 Bilder
........2.3.6.6.3 GUI
........2.3.6.6.4 Text
........2.3.6.6.5 PDF
........2.3.6.6.8 Maus
........2.3.6.6.10 Zeit
........2.3.6.6.13 Animation
........2.3.6.6.15 Simulation
......2.3.6.7 Referenzen
....2.3.7 Android_Processing
......2.3.7.1 Basics
......2.3.7.2 Einrichten
......2.3.7.3 Crossplattform
......2.3.7.4 sinus
......2.3.7.5 sample
......2.3.7.6 analyse
......2.3.7.7 synthese
......2.3.7.8 Hilfsapps
......2.3.7.9 Eigene_Library
....2.3.8 Processing_VR
....2.3.9 Shapes3D
....2.3.10 TextToSpeech
....2.3.11 Internetprogrammierung
......2.3.11.1 Codegenerierung
......2.3.11.2 PHP_Programmierung
......2.3.11.3 PHP_OOP
......2.3.11.4 Java
......2.3.11.5 UDP
......2.3.11.6 Internetkontrolle
........2.3.11.6.1 Kamerabild
....2.3.12 OSC
......2.3.12.1 Datenaustausch
......2.3.12.2 i2audiolab
......2.3.12.3 Ardour
....2.3.13 Netzwerkprogrammierung
....2.3.14 JNI
....2.3.15 Erweitern
......2.3.15.1 sprich
......2.3.15.2 spiel
....2.3.16 thbvr
....2.3.17 Reflection
....2.3.18 Script
....2.3.19 Java3D
3 Echtzeitprogrammierung
..3.1 Echtzeit
..3.2 Korrektheit
..3.2 Semaphoren
..3.3 Hardware
..3.5 Synchronprogramm
..3.6 Zustandsmaschine
..3.7 Arduino
....3.7.1 Uebung
....3.7.2 RTOS
....3.7.3 Scheduler
....3.7.4 Semaphor
......3.7.4.1 Laufkatze
......3.7.4.2 Java
......3.7.4.3 Semaphor
....3.7.5 Messages
..3.8 Android
....3.8.2 Threads
......3.8.2.1 Java
......3.8.2.2 Synchronisierung
..3.9 Petrinetze
....3.9.1 Installation
....3.9.2 Test
4 KI
..4.1 Unueberwachtes_Lernen
..4.2 Agentensysteme
....4.2.1 Architekturen
......4.2.1.1 Verhalten
......4.2.1.2 Entwurfsmuster
....4.2.2 SUMO
......4.2.2.1 GettingStarted
......4.2.2.2 Antrieb
......4.2.2.3 Sensoren
......4.2.2.4 Zeitbasis
......4.2.2.5 Fernsteuerung
......4.2.2.6 Umsetzung_Fernst
......4.2.2.7 Fernsteuerung3
......4.2.2.10 Umsetzung
......4.2.2.11 Sockelsoftware
......4.2.2.12 Plan
......4.2.2.13 Lernen
........4.2.2.13.1 Parameter
........4.2.2.13.2 Identifikation
........4.2.2.13.3 Java
..4.3 Genetische_Algorithmen
....4.3.1 Heuristiken
....4.3.2 Genalgorithmus
..4.4 Kalmanfilter
....4.4.1 Vorarbeit
....4.4.2 Minimalversion
....4.4.3 Beispiel
5 Bildverarbeitung
..5.1 Gestalttheorie
..5.2 Bildverarbeitung
6 Technische_Systeme
..6.1 Kulturgeschichte
..6.2 Technikphilosophie
..6.3 Anthropozaen
7 Literatur
kramann.info
© Guido Kramann

Login: Passwort:




Timer 1 auch als Zeitbasis nutzen ohne Interrupts

(EN google-translate)

(PL google-translate)

Eine einfache Möglichkeit, eine Zeitsteuerung für die einzelnen Prozesse des Programms zu erhalten besteht in der Nutzung eines Timer als Zähler und das Abwarten dessen Überlaufs am Ende der Main-Loop.

Im Fall hier wird der bereits für den Antrieb (PWM-Geber) verwendete Timer 1 benutzt. Dieser Timer war hier bisher so konfiguriert, dass ein 10-Bit Phasen-korrektes PWM-Signal generiert wird (Modus3, Datenblatt Seite 107). Nun hat dieses den Nachteil, dass hier der Zähler hoch- und wieder herunter zählt und somit bei einem bestimmten Zählstand nicht erkennbar ist, ob er beim Herauf- oder Herabzählen erreicht wurde.

Darum wird nun das nicht Phasen-korrekte Fast-PWM-Signal auch mit 10 Bit verwendet (Modus 7). #pdf atmega32_doc2503.pdf atmega32_doc2503.pdf - Datenblatt zum ATmega32.

Bei dem nachfolgenden Programm wird ein Blinken mit 0,5Hertz auf einer LED des Fahrzeugs erzeugt, indem für 122 Main-Loop-Durchgänge diese an und für die darauffolgenden 122 ausgeschaltet wird. Ein Main-Loop-Durchgang erfolgt dabei mit...


Zählfrequenz = 8.000.000 / (64*1024) ==  122,0703125Hz 

Da sich der PWM-Zyklus laut Datenblatt für Fast-PWM wie folgt berechnet und 
das Fahrzeut mit 8MHz getaktet ist:

Zählfrequenz = fclock / (N*(TOP+1))


Code 0-1: Berechnung der Frequenz, mit der ein Main-Durchlauf abgearbeitet wird (siehe auch nachfolgenden Quelltext).

Man beachte die Warteschleife while(TCNT1<1023) PORTB|=0; am Ende des nachfolgenden Quelltextes in der Main-Loop:
//   avr-gcc -O2 -mmcu=atmega32 syncprog.c -o syncprog.elf 
//   avr-objcopy -O ihex -j .text -j .data syncprog.elf syncprog.hex 

//   Upload über RobotLoader_20100712



#include<avr/io.h>

//   Zählfrequenz = fclock / (N*(TOP+1))
//   Zählfrequenz = 8.000.000 / (64*1024) ==  122,0703125Hz (einmal hochzählen)   ungefähr 8ms pro Schleifendurchlauf

void initialisiereMotore()
{
    DDRC |= 0b00001100;  //Richtung

    //10-Bit Phasen-korrektes PWM-Signal.
    TCCR1A = (1<<COM1A1) | (0<<COM1A0) | (1<<COM1B1) | (0<<COM1B0) | (0<<FOC1A) | (0<<FOC1B) | (1<<WGM11) | (1<<WGM10);
    TCCR1B = (0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (1<<WGM12) | (0<<CS12) | (1<<CS11) | (1<<CS10);
    DDRD |= (1<<PD5) | (1<<PD4); //auf Ausgang setzen.            
    OCR1A = 0; //PWM-Breite setzen (entspricht für Servo auf 0 Grad).
    OCR1B = 0; //PWM-Breite setzen (entspricht für Servo auf 0 Grad).
}

void fahrt(int links, int rechts)  //Wertebereich: +-1023
{
    if(links==0)    
    {
        PORTC &= ~(1<<PC2);
        OCR1B = 0;
    }
    else if(links<0)
    {
        PORTC |=  (1<<PC2);
        OCR1B = -links;
    }
    else
    {
        PORTC &= ~(1<<PC2);
        OCR1B = links;
    }

    if(rechts==0)    
    {
        PORTC &= ~(1<<PC3);
        OCR1A = 0;
    }
    else if(rechts<0)
    {
        PORTC |=  (1<<PC3);
        OCR1A = -rechts;
    }
    else
    {
        PORTC &= ~(1<<PC3);
        OCR1A = rechts;
    }

}

int main()
{
    unsigned long pause=0;
    initialisiereMotore();

    int ZAEHLER = 0;

    DDRC |= 0b01110000;

    while(1) //Durchlauf === 122,0703125Hz
    {
      /*
        for(pause=0;pause<300000;pause++)
            DDRB|=0;
        fahrt(1023,1023);  //Geradeaus

        for(pause=0;pause<300000;pause++)
            DDRB|=0;
        fahrt(0,0);  //stop

        for(pause=0;pause<300000;pause++)
            DDRB|=0;
        fahrt(200,200);  //langsame Geradeaus

        for(pause=0;pause<300000;pause++)
            DDRB|=0;
        fahrt(0,0);  //stop

        for(pause=0;pause<300000;pause++)
            DDRB|=0;
        fahrt(-1023,1023);  //Links-Drehung

        for(pause=0;pause<300000;pause++)
            DDRB|=0;
        fahrt(0,0);  //stop
     */

        ZAEHLER++;
        ZAEHLER%=244;

        //Blinken mit 0,5Hz:
        if(ZAEHLER<122) // 1 Sekunde an
        {
            PORTC |=  0b01110000;
        }
        else //dann 1 Sekunde aus.
        {
            PORTC &= ~0b01110000;
        }

 
        while(TCNT1<1023) PORTB|=0; //Immer warten, bis der Zähler den oberen Zählstand erreicht hat.
        //Der Zählvorgang ist langsam gegenüber dieser while-Schleife, so wird 1023 in jedem Fall "erwischt".
    }
}

Code 0-2: Beispielprogramm - Nur Blinken (Fahren auskommentiert) mit 0,5Hz, siehe while-Schleife in Main-Loop.

SUMOBOT3.zip - Obiges Programm als Quelltext und .hex-Datei.