PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Messwerte über ADC im LCD anzeigen



newbie1982
03.07.2008, 00:29
Hi,
wie der Name verrät, bin ich etwas unerfahren mit den Mikrocontrollern. Ich hätte eine kleene Frage/Bitte.
ich hatte ein Schaltung zur Messung des Stroms erstellt, und sie ist mit einem Tiny 45 bestückt.
Ich bekomme an einem Pin des Controllers PB4 Spannungen von 0-5V, mein Ziel ist es diese als Strom von 0-50A an einem LCD anzuzeigen.
Hat jemand Erfahrung damit, oder gibts Codes die sich um das selbe Thema kümmern.
Bedanke mich im Voraus

Grandalf
03.07.2008, 08:28
hallo

ich arbeite mit einem atmega16 und kenne den tiny jetzt nicht aber ich glaube außer takt speichergröße und pinbenennung ist da nicht viel anderss was den ADC angeht oder? (siehe datenblätter)

naja demzufolge könnte es dir glaub ich weiterhelfen wenn du eine ADC-funktion vllt auf deinen tiny umbaust (sprich eingänge ändern etc)
hier findest du meine funktion zum ADC
https://www.roboternetz.de/phpBB2/viewtopic.php?p=383152#383152

dazu hier meine LCD-funktion die nur eingefügt werden muss

LCD_8bit.h


void enable(void);
void init_8bitlcd(void);
void bild_loeschen(void);
void cursor_auf_startpos(void);
//-------------------------------------------------------------------------------------------------

// I_D => Curserposition Inkrement(1)/dekrement(0) (schreibrichtung festlegen)
// S => Displayinhalt fest(1)/weiterschieben(0)
void modus(int I_D, int S);
//-------------------------------------------------------------------------------------------------

// D => Display an(1)/aus(0)
// C => Cursor an(1)/aus(0)
// B => Cursor blinken an(1)/aus(0)
void display_und_cursor_optionen(int D, int C, int B);
//einfach diese datei und die dazugehörige codedatei einbinden und die funktionen je nach wunsch im main aufrufen.


//-------------------------------------------------------------------------------------------------

// S_C => Displayinhalt schieben(1)/Cursor bewegen(0)
// R_L => S_C nach rechts(1)/nach links(0) schieben
void cursor_oder_display_schieben(int S_C, int R_L);
//-------------------------------------------------------------------------------------------------

// DL => 8bit-Interface(1)/4bit-Interface(0)
// N => zweizeilig(1)/einzeilig(0)
// F => 5x10-Font(1)/5x7-Font(0)
void funktionen(int DL, int N, int F);
//-------------------------------------------------------------------------------------------------

//adresse => CGRAM-Adresse (6stellig)
void CGRAM(int adresse);
//-------------------------------------------------------------------------------------------------

//adresse => DDRAM-Adresse (7stellig)
void DDRAM(int adresse);
//-------------------------------------------------------------------------------------------------

//adresse => CG-/DDRAM-Adresse (7stellig)
//BF => ist beschäftigt(1)/Kann Kommandos annehmen(0)
void adresse_oder_status_lesen(int adresse, int BF);
//-------------------------------------------------------------------------------------------------

//zeichen => Dezimalzahl des zu schreibenden Zeichens nach ASCII-Tabelle
void daten_schreiben(int zeichen);
//-------------------------------------------------------------------------------------------------

// *text => Zeiger auf ein char array mit den anzugeigenden Zeichen (länge egal)
void text_schreiben(char *text);
//-------------------------------------------------------------------------------------------------



LCD_8bit.c


//einfach diese datei und die dazugehörige header datei einbinden und die funktionen je nach wunsch im main aufrufen.

#ifndef F_CPU
#define F_CPU 4000000L //Controllerfrequenz für die util/delay.h
#endif
//------------------------------------//------------------------------------
//Ausgänge festlegen:
#define datenposition DDRA
#define datenwerte PORTA
#define D0 PA0
#define D1 PA1
#define D2 PA2
#define D3 PA3
#define D4 PA4
#define D5 PA5
#define D6 PA6
#define D7 PA7
#define steuerungsposition DDRB
#define steuerwerte PORTB
#define E PB0
#define R_W PB1
#define RS PB2
//------------------------------------
#include <avr/io.h>
#include <avr/iom16.h>
#include <util/delay.h>
#include <inttypes.h>
#include "LCD-8bit.h"
volatile int zaehler = 0;
//------------------------------------
int _D = 1; //Display an(1)/aus(0)
int _C = 0; //Cursor an(1)/aus(0)
int _B = 0; //Cursor blinken an(1)/aus(0)
int _N = 1; //zweizeiliges(1)/einzeiliges(0) Display
int _F = 0; //5x10-Font(1)/5x7-Font(0)
int _BF = 0; //ist beschäftigt(1)/Kann Kommandos annehmen(0)
int LCD_stellen = 16; //anzahl der möglichen Zeichen pro zeile
//------------------------------------

void enable(void)
{
steuerwerte |= (1<<E);
_delay_ms(1);// kurze pause
steuerwerte &= ~(1<<E);
_delay_ms(1);// kurze pause
}

void init_8bitlcd(void)
{
datenposition = 0xFF;
datenwerte = 0x00;
steuerungsposition = (1<<E)|(1<<R_W)|(1<<RS);
steuerwerte = 0x00;
_delay_ms(16);
funktionen(1,0,0);
_delay_ms(5);
funktionen(1,0,0);
_delay_ms(1);
funktionen(1,0,0);
modus(1,0);
display_und_cursor_optionen(1,0,0);
bild_loeschen();
cursor_auf_startpos();
}

void bild_loeschen(void)
{
steuerwerte &= ~((1<<RS)|(1<<R_W));
datenwerte = 0;
datenwerte |= (1<<D0);
enable();
}

void cursor_auf_startpos(void)
{
steuerwerte &= ~((1<<RS)|(1<<R_W));
datenwerte = 0x00;
datenwerte |= (1<<D1);
enable();
zaehler = 0;
}


// I_D => Curserposition Inkrement(1)/dekrement(0) (schreibrichtung festlegen)
// S => Displayinhalt fest(1)/weiterschieben(0)
void modus(int I_D, int S)
{
steuerwerte &= ~((1<<RS)|(1<<R_W));
datenwerte = 0x00;
datenwerte |= (1<<D2);
if(I_D==1)
datenwerte |= (1<<D1);
if(S==1)
datenwerte |= (1<<D0);
enable();
}


// D => Display an(1)/aus(0)
// C => Cursor an(1)/aus(0)
// B => Cursor blinken an(1)/aus(0)
void display_und_cursor_optionen(int D, int C, int B)
{
steuerwerte &= ~((1<<RS)|(1<<R_W));
datenwerte = 0x00;
datenwerte |= (1<<D3);
if(D==1)
datenwerte |= (1<<D2);
if(C==1)
datenwerte |= (1<<D1);
if(B==1)
datenwerte |= (1<<D0);
enable();
}


// S_C => Displayinhalt schieben(1)/Cursor bewegen(0)
// R_L => S_C nach rechts(1)/nach links(0) schieben
void cursor_oder_display_schieben(int S_C, int R_L)
{
steuerwerte &= ~((1<<RS)|(1<<R_W));
datenwerte = 0x00;
datenwerte |= (1<<D4);
if(S_C==1)
datenwerte |= (1<<D3);
if(R_L==1)
datenwerte |= (1<<D2);
enable();
}


// DL => 8bit-Interface(1)/4bit-Interface(0)
// N => zweizeilig(1)/einzeilig(0)
// F => 5x10-Font(1)/5x7-Font(0)
void funktionen(int DL, int N, int F)
{
steuerwerte &= ~((1<<RS)|(1<<R_W));
datenwerte = 0x00;
datenwerte |= (1<<D5);
if(DL==1)
datenwerte |= (1<<D4);
if(N==1)
datenwerte |= (1<<D3);
if(F==1)
datenwerte |= (1<<D2);
enable();
}


//adresse => CGRAM-Adresse (6stellig)
void CGRAM(int adresse)
{
steuerwerte &= ~((1<<RS)|(1<<R_W));
datenwerte = 0x00;
datenwerte |= (1<<D6);
enable();
}


//adresse => DDRAM-Adresse (7stellig)
void DDRAM(int adresse)
{
steuerwerte &= ~((1<<RS)|(1<<R_W));
datenwerte = 0x00;
datenwerte |= (1<<D7);
enable();
}


//adresse => CG-/DDRAM-Adresse (7stellig)
//BF => ist beschäftigt(1)/Kann Kommandos annehmen(0)
void adresse_oder_status_lesen(int adresse, int BF)
{
steuerwerte |= (1<<R_W);
steuerwerte &= ~(1<<RS);
datenwerte = 0x00;
datenwerte = adresse;
if(BF==1)
datenwerte |= (1<<D7);
enable();

}

//zeichen => Dezimalzahl des zu schreibenden Zeichens nach ASCII-Tabelle
void daten_schreiben(int zeichen)
{
if(zaehler<=(LCD_stellen - 1))
zaehler = zaehler + 1;
if(zaehler==LCD_stellen)
cursor_oder_display_schieben(1,0);
steuerwerte |= (1<<RS);
steuerwerte &= ~(1<<R_W);
datenwerte = 0x00;
datenwerte = zeichen;
enable();
}


// *text => Zeiger auf ein char array mit den anzugeigenden Zeichen (länge egal)
// LCD_stellen => hier angeben wie viele Zweichen pro zeile auf dem Display angezeigt werden können
void text_schreiben(char *text)
{
while(*text)
{
daten_schreiben(*text);
text++;
}
}



da meine LCD-funktion immer nur ein einzelnes zeichen oder ein feld aus zeichen schreiben kann musst du den wert des ADCs noch auseinander nehmen um jede einzelne ziffer des ADC wertes (zb 125) zu schreiben
ziffern[0] = 1
ziffern[1] = 2
ziffern[2] = 5