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!
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:

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)
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.