Themen:

AVR, avr-gcc, CAN, CPLD, Elektronik, Mikrocontroller, MSP430, PIC, Roboter, Schaltungen, Sensoren, Software, Testboards

Codeschnipsel für avr-gcc

Tags: AVR, Software, avr-gcc
Stand: 3. Januar 2007, 15:16
2 Kommentar(e)

Ansteuerung des UART

Da es die Codestücke insgesamt schon ein bisschen länger geworden sind wurden sie jetzt auf eine eigene Seite ausgelagert: Ansteuerung des UART.

Analog/Digital-Wandler

C:
#include <avr/io.h>
#include <stdint.h>

// Analog/Digital Wandler initialisieren
void
adc_init(void)
{
    // externe Referenzspannung und AD-Wandlerkanal 0 (ADC0) auswählen
    ADMUX = 0;

    // AD-Wandler einschalten und Prescaler = 64 einstellen (enstpricht 115 khz Wandlertakt)
    ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1);
}


int
main(void)
{
    uint16_t buffer;

    // A/D - Wandler initialisieren
    adc_init();

    while (1) {
        // Wandlung starten
        ADCSRA |= (1<<ADSC);

        // Warten bis die AD-Wandlung abgeschloßen ist
        while ( !(ADCSRA & (1<<ADIF)) )
            ;

        /* AD-Wert auslesen.
        ADCH muss als zweites gelesen werden, da nachdem ADCL gelesen wurde
        das ADC-Register gesperrt ist bis ADCH auch ausgelesen wurde. */

        buffer = ADCL | (ADCH<<8);

        // oder einfacher
        buffer = ADC;
    }
}

PWM mit Timer1

C:
#include <avr/io.h>

// Timer1 initialisieren
void
timer1_init(void)
{
    // normale 8-bit PWM aktivieren (nicht invertiert),
    // Das Bit WGM10 wird im Datenblatt auch als PWM10 bezeichnet
    TCCR1A = (1<<COM1A1)|(1<<COM1B1)|(1<<WGM10);

    // Einstellen der PWM-Frequenz auf 14 kHz (Prescaler = 1)
    TCCR1B = (1<<CS10);

    // Interrupts für Timer1 deaktivieren
    // Achtung: Auch die Interrupts für die anderen Timer stehen in diesem Register
    TIMSK &= ~0x3c;
}


int
main(void)
{
    // Timer1 initialisieren
    timer1_init();
   
    // Werte für die beiden PWM Kanäle setzen.
    // Zum Beispiel 100% Tastverhältnis für OC1A
    OCR1AL = 0xff;
    // und ca. 50% Tastverhältnis (= 127/255) für OC1B
    OCR1BL = 127;

    while (1) {
        // do nothing
    }
}

Zum Anfang

Kommentare

# Thomas meinte am 31. Dezember 2006, 19:52 dazu:

Hallo,

Ich finde deine Seiten Super. Das neue Design ist auch gut. Ich benutze oft deine Seiten. Doch dieser Artikel sollte etwas überarbeitet werden. Denn Codeschnipsel sind nur sinnvoll wenn ich mir damit Zeit ersparen kann. Doch hier muss ich doch wieder alles über den Timer lesen. Also bitte OCR1AL = 0xff; OCR1BL = 0x7f; genauer beschreiben.

Grüße Thomas

# Tristan Seifert meinte am 16. September 2008, 20:50 dazu:

Hallo,

Diese Seiten waren meine letzte Rettung bei meinem C-Programm!!! Ich bin ja noch recht neu auf dem Gebiet »C«

Deine Meinung:

  • Textformatierung ist mit Markdown möglich.
  • HTML wird entfernt.
  • Kommentare werden moderiert und sind daher eventuell nicht sofort sichtbar.
  • Irrelevante Kommentare werden gelöscht.