Schlagzeilen

AVR Codeschnipsel

Die hier eingestellten Codeschnipsel sind eingenständig, aber
natürlich mit Hilfe von Codebeispielen aus dem Internet und
aus verschiedenen Büchern erstellt. Sollte jemand persönliche
Rechte (Copyright etc) verletzt sehen, so bitte ich um Nachricht.
Werde dann schnellstmöglich Abhilfe schaffen. Danke!

 

ATTINY45 zwei mal analog ADC auslesen, auswerten und auf zwei mal LED anzeigen

 

Versuchsaufbau:

ttiny45AnalogLed

 

Programm:

/*
ATTINY45
Zwei mal ADC, misst zwei Spannungen und
gibt, wenn 2V überschritten, dieses auf zwei LED aus

ADC3 auf PB3 -> LED PB2
ADC2 auf PB4 -> LED PB1

FUSES:
SPIEN
CKDIV8
Int. RC Osc. 8 MHz; Start-up time PWRDWN/RESET: 6 CK/14 CK + 64 ms

AVR-Studio-Konfig Frequency = 1 MHz
*/

#include <avr/io.h>
#include <inttypes.h>
#include <util/delay.h>     /* bei alter avr-libc: #include <avr/delay.h> */ 
#include <stdint.h>

#ifndef F_CPU
#warning "F_CPU nicht definiert, wird nun nachgeholt"
#define F_CPU 1000000L
#endif

# define ADC0_PB5 0b00000000;
# define ADC1_PB2 0b00000001;
# define ADC2_PB4 0b00000010;
# define ADC3_PB3 0b00000011;

float spannung;

int main(void)
{
    uint8_t ana_wert;

    DDRB |= (1 << PB1) | (1 << PB2);    // Augang LED
    PORTB |= (1<<PB1);                    // an
    PORTB |= (1<<PB2);                    // an
    _delay_ms(1000);                    // Kontrolle LEDs
    PORTB &= ~(1<<PB1);                // aus
    PORTB &= ~(1<<PB2);                // aus

    ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0);     // Prescaler und Enable
    ADMUX = ADC2_PB4;                                // select channel
//    ADMUX |= (1<<REFS0) | (0<<REFS1);                 // mit VCC aufAVCC von 0 - 5 V
//    ADMUX |= (0<<REFS0) | (0<<REFS1);                 // VCC used as Volt. Ref., discon. from PB0 (AREF).

    // einma warm werden lassen ...
    ADCSRA |= (1<<ADSC);               // single converson
    while ( ADCSRA & (1<<ADSC) );      // warten bis fertig
    spannung = ADCW;                    // spannung auslesen
    spannung = 0;                        // wegschmeissen    

while (1)
    {
    ADMUX = ADC3_PB3;
    spannung = 0;
    ADCSRA |= (1<<ADSC);                // single conversion
    while ( ADCSRA & (1<<ADSC) );      // warten bis fertig
    spannung += ADCW;                    // spannung auslesen
    ana_wert = spannung * 5.0 / 1024;    // Spanungswert errechnen
    if (ana_wert <= 1) PORTB &= ~(1<<PB2);    // PB2 aus bei unter 2V
    if (ana_wert > 1) PORTB |= (1 << PB2);    // PB2 an bei über 2V   
    _delay_ms(500);                        // Kaffeepause

    ADMUX = ADC2_PB4;
    spannung = 0;
    ADCSRA |= (1<<ADSC);                // single conversion
    while ( ADCSRA & (1<<ADSC) );      // warten bis fertig
    spannung += ADCW;                    // spannung auslesen
    ana_wert = spannung * 5.0 / 1024;    // Spanungswert errechnen
    if (ana_wert <= 1) PORTB &= ~(1<<PB1);    // PB1 aus bei unter 2V
    if (ana_wert > 1) PORTB |= (1 << PB1);    // PB1 an bei über 2V   
    _delay_ms(500);                        // Kaffeepause
    }
}

Download Quellcode und Schaltplan (zip)

 


DS1621 Temp. / AVR GCC

Auslesen des Temperatursensor DS1621 mit ATMEGA32
Liest die Temperatur ständig aus und sendet diese ohne Nachkommastelle
über Seriell 9600baud/8N1.
Benötigt werden die i2cmaster.h und
die twimaster.c von Peter Fleury http://jump.to/fleury

Verwendet die Hardwarepins für I2C (PC0 und PC1) sowie für Ser. (PD0 und PD1)
Download Quellcode (zip)

 

DS1621 Temp. / AVR GCC (Neuer Versuch mit LCD und RS232)

ds1621_lcd_rs232

Download Quellcode komplettes AVR Studio Projekt  (zip)

Download Schaltplan im JPG-Format

Download Schaltplan im SPLAN-Format

SPLAN Viewer kostenlos downloaden

 

ATMEGA32 Analogeingang ADC

Auslesen Analogwandler ADC und senden über RS232.
Kleines Testprogramm mit Auswertung der Spannung 0-5V

Download Quellcode (zip)
Download Delphi-Testprogramm (zip)


Kurzbeschreibung

Nachdem das High– und das LowByte über RS232 empfangen wurde muss es natürlich noch ausgewertet werden.
D.h. die beiden 8-Bit-Werte High– und LowByte müssen in eine 16-Bit-Variable bugsiert werden.
Der Analogwandler sendet ein 10-bit-Wert, die ersten acht Bits stehen im LowByte,
die beiden höherwertigen Bits stehen im HighByte.

Also nehme man sich eine >= 16-bit Variable (im Beispiel „k“), lade sie mit dem HighByte und schiebe die Bits der
Variablen „k“ um 8 Stellen nach links. Dann lade man das LowByte und ver-Oder es mit der Variablen „k“.
Anschliessend muss man „k“ noch mit der Ref-Spannung (im Beispiel 5V) multiplizieren und durch 1023 teilen.



Beispielroutine in Pascal:


procedure TForm3.SerialPortNGRxClusterEvent(Sender: TObject);
var i : Integer;
s : string;
lowbyte, highbyte : integer;
k : extended;
begin
if SerialPortNG1.NextClusterSize >= 2 then
s := SerialPortNG1.ReadNextClusterAsString;
if length(s) >= 2 then
begin
lowbyte := ORD(s[1]);
highbyte := ORD(s[2]);
highbyte := highbyte shl 8;
highbyte := highbyte OR lowbyte;
k := highbyte * 5 / 1023;
end;
label1.Caption := floattostr(k);
ProgressBar1.Position := trunc(k*10);
end



Ansteuerung des LCD Powertip PG-12864F mit dem Toshiba T6963C - Contoller

Noch lange nicht fertig, aber man sieht schon etwas ... ;-)

Im Grossen und Ganzen aufgebaut auf den Routinen von http://en.radzio.dxp.pl/t6963/

Im Projekt die Belegung des ATMEGA32 angepasst auf andere Ports.
Eine Besonderheit dieses LCD ist, dass es für den Kontrast eine negative Spannung benötigt.
Da gerade, aus einem anderen Projekt, ein Max232 auf dem Steckbrett glänzte,
habe ich diesen zur Negativspannungserzeugung missbraucht (danke für den Tip!).
Poti eingestellt auf ca. Minus 2.6V am Pin4 (Kontrast).

Download des Schaltplan im SPLAN-Format: http://www.grilec.com/download/LCD_T6963C_Toshiba.spl

Download des AVR-Studio-Projekt: http://www.grilec.com/download/lcd_t6963c.zip

Damit das Projekt kompiliert werden kann, müssen die Source-Files graphic.c und t6963c.c ins Projekt eingebunden werden.








 

Wettervorhersage