LCD-Display & Schwarze Balken

Gast #2982254
Lesenswert?

Habe leider keine Zeit mehr gerade deshalb fasse ich mich kurz. Ich 
möchte mit meinem ´Mikrocontroller ein LCD - Display ansteuern aber 
leider tauschen trotz initialisierungs Befehl nur schwarze Balken auf. 
Auch wie häufig beschrieben mit Kontrast rumspielen habe ich schon 
versucht. Bin ein ziemlicher Anfänger und ich weiß, dass diese Frage 
schon oft gestellt wurde aber ich habe ncihts gefunden was mr weiter 
hilft. Jedenfalls nichts in C.
Danke! Meine verwendeten Dateien sind im Anhang...sind die aus dem 
mikrocontroller.net LCD GCC Tutorial...
Angehängte Dateien:
Gast #2982380
Lesenswert?

danke für die Seite, aber so richtig verstehe ich das nicht was das 
bedeuten soll. Vor allem Begriffe wie PD0 oder PD1...ich weiß was ein 
Port ist, aber mit diesen Begrifflichkeiten Pinx, PDx, Register und Bit 
komme ich iwie noch nicht klar. Mir ist einfach der Unterschied nicht 
klar. Ich denke das es daher eher was mit der Belegung in lcd-routines.h 
zu tun hat. Ich wäre froh wenn mir jemand die Begrifflichkeiten klar 
machen könnte und mir ein Tipp gibt, warum das LCD nicht initialisiert 
wird!
Gast #2982411
Lesenswert?

>> Auch wie häufig beschrieben mit Kontrast rumspielen habe ich schon
>> versucht.
> Wie? In deinem Schaltbild liegt die Kontrastspannung über R25 an Masse.

Wenn er schwarze Balken sieht, dürfte der Kontrast ok sein.
Gast #2982472
Lesenswert?

Schwarze Balken sind Mist.
Ich hatte vor einige Wochen auch das Problem.

Der Kontrast-Pin liegt einfach auf Masse?!
Da sollten etwa 1.0 - 1.4 Volt zu messen sein, dann verschinden die 
schwarzen Balken und erst dann wirst du erkennen ob dein Code 
funktioniert.
Gast #2982505
Lesenswert?

Also mir wurde gesagt der Poti ist für den Kontrast, was anscheinend ja 
nicht stimmt. Die Schaltung hat mein Elektrotchnik Lehrer gebastelt 
hm...anscheinend ist der ja nicht so der "bringer". Also liegt es an der 
Kontrastsache? wie könnte ich das lösen?
Oder doch etwas anderes evtl Softwaretechnisches? falsche PD iwas 
Belegung vllt oder so?
#2982512
Lesenswert?

Marcel S. schrieb:
> Also mir wurde gesagt der Poti ist für den Kontrast, was anscheinend ja
> nicht stimmt.

Da ist aber was gewaltig schief gelaufen.

grundsätzlich solltest du "mir wurde gesagt" immer selbst überprüfen. 
Rund 70% aller Fehler-Anfragen hier im Forum werden dadurch gelöst, dass 
wir eben nicht dem glauben was der Fragesteller so von sich gibt, 
sondern indem wir die Dinge selber überprüfen bzw. Schaltplan und/oder 
Code anfordern. Und dann stellen sich die Dinge erschreckend oft als 
dann doch ganz anders heraus, als sie mit Prosa beschrieben wurden.

> Die Schaltung hat mein Elektrotchnik Lehrer gebastelt
> hm...anscheinend ist der ja nicht so der "bringer". Also liegt es an der
> Kontrastsache? wie könnte ich das lösen?

Welcher Pin vom LCD ist der Kontrast-Pin?
Wo muss daher das Poti seine einstellbare Spannung abliefern?

AVR-Tutorial: LCD
#2982515
Lesenswert?

Das Poti ist definitiv für die Hintergrundbeleuchtung, die liegt auf Pin 
15,16 des LCD. Als Vorwiderstand für die Hintergrundbeleuchtung ist ein 
Widerstand, je nach gewünschter Helligkeit <100 Ohm notwendig. Da sollte 
man aber immer im Datenblatt nachsehen da sehr unterschiedlich.
Der Kontrast wird auf Pin3 des LCD eingestellt.
Nimm den R25 heraus, trenne die Verbindung vom Poti zum Pin15 und stelle 
eine Verbindung vom Poti zum Pin3 her. Dann hast du eine korrekte 
Kontrasteinstellung.
Gast #2982525
Lesenswert?

okay danke erstmal! Ich werde das ausprobieren sobald ich gegen 18 Uhr 
zuhause bin...ich hoffe in paar von euch schauen nachher nochmal vorbei! 
Ich werde aufjedenfall Rückmeldung geben ob es dann funktioniert.
Gast #2982558
Lesenswert?

Okay, Kontrast ist Pin 3 das hab ich jetzt :D
Was hat es mit dem RW auf sich und wie kann ich das Problem beheben bzw. 
kann mir da jemand noch einmal genauer ausführen was damit los ist? Ich 
soll also Pin 5 an Masse legen wenn ich das richtig verstanden 
habe...wie bewerkstellige ich das?
Gast #2982584
Lesenswert?

"SW" ist eine Abkürzung für "Software".

Die Aussage:
>Den R/W-Pin kannst du auch über die SW auf GND legen.
sollte also bedeuten, das Du den R/W-Pin auch per Software, per Programm 
auf Ground legen kannst. In den Begriffen von C bzw. Assembler ist das 
eine 0.

Die andere Möglichkeit ist: per Hardware.
Ob das nun als eine Brücke oder eine Leiterbahn realisiert ist, ist 
völlig nebensächlich. Hauptsache ist, das eine "leitende Verbindung" 
zwischen Ground und dem R/W-Pin hergestellt wird.
#2982606
Lesenswert?

1
#include <avr/io.h>
2
#include "lcd-routines.h"
3

4
int main(void)
5
{
6

7
DDRD=(1<<DDD6);
8
PORTD&=~(1<<PD6);
9
  lcd_init();
10
  lcd_data( 'T' );
11
  lcd_data( 'e' );
12
  lcd_data( 's' );
13
  lcd_data( 't' );
14
  
15
  lcd_setcursor( 0, 2 );
16
  
17
  lcd_string("Hello World!");
18
  
19
  while(1)
20
  {
21
  }
22
  
23
  return 0;
24
}
Ich nehme an das dein R/W auf PortD6 liegt.
#2982667
Lesenswert?

Marcel S. schrieb:
> alles liegt an Port D xD
> was genau hast du nun dort gemacht?
> Also was die zwei Zeilen nun genau machen ;)
> Dann kann ich das nächste  mal auch ;P


Spätestens jetzt ist der Verweis aufs AVR-GCC-Tutorial angebracht.

Dein Frage ist ungefähr so wie: Ich möchte mich in der Mathematik mit 
Trigonometrie beschäftigen, kann mir wer erklären, wie man 2 Zahlen 
miteinander multipliziert. Das soll jetzt kein Vorwurf sein oder so.

Aus gutem Grund ist das "Hallo world" der µC-Technik die blinkende LED. 
Denn dazu muss man bereits Portpins gezielt schalten können. Das ist 
sozusagen die Basis alles weiteren. LCD kommt später. Viel später.
Gast #2982786
Lesenswert?

Habe den oben stehenden Code von Hubert genommen und das hier 
durchgeführt:

Nimm den R25 heraus, trenne die Verbindung vom Poti zum Pin15 und stelle
eine Verbindung vom Poti zum Pin3 her. Dann hast du eine korrekte
Kontrasteinstellung.

Wenn ich jetzt am Poti drehe, bekomme ich in der einen Richtung voll 
aufgedreht schwarze Balken, in die andere ist der Bildschirm ganz Hell 
als wäre die Hintergrundbeleuchtung ein und solange er nicht in einer 
Richtung voll ausschlägt ändert sich rein gar nichts. Laut dem Code 
sollte ja dort eigentlich etwas stehen.

Was kann nun noch falsch sein? Bin wirklich ratlos :/
#2982800
Lesenswert?

Marcel S. schrieb:

> Wenn ich jetzt am Poti drehe, bekomme ich in der einen Richtung voll
> aufgedreht schwarze Balken, in die andere ist der Bildschirm ganz Hell

passt.
Jetzt stellst du den Regler so ein, dass die erste Zeile schwarze 
Kästchen anzeigt. Und zwar so, dass du saubere satte schwarze kleine 
Quadrate siehst und die Zwischenräume noch nicht zu dunkel sind. Die 
zweite Zeile sollte sich noch nicht geschwärzt haben.
Das ist eine Grundeinstellung für den Kontrast, mit der du etwas sehen 
müsstest (wenn dann das erste mal Zeichen aufs LCD kommen). Die genaue 
Feinabstimmung nimmst du dann vor, wenn das erste mal Text auf dem LCD 
ist.

> Richtung voll ausschlägt ändert sich rein gar nichts. Laut dem Code
> sollte ja dort eigentlich etwas stehen.

Na ja.
Noch ist ja nicht alles erledigt.
Was hast du mit dem R/W Pin vom LCD gemacht?
#2982828
Lesenswert?

Marcel S. schrieb:

>
> DDRD=(1<<DDD6);
> PORTD&=~(1<<PD6);
>
> in den Code eingefügt. Ich kann soviel drehen wie ich will da kommen
> keine Zeichen :(

Das hat auch erst mal damit nichts zu tun. Die Kontrasteinstellung ist 
nur deswegen wichtig, weil du bei grob verstelltem Kontrast nämlich gar 
nichts sehen wirst. Aber wenn der so ungefähr passt, dann reicht das 
fürs erste.

Mal eine ganz andere Frage:
Hast du eigentlich auf deinem µC schon mal irgendwas anderes laufen 
lassen? Sprich: Ist sicher gestellt, dass der µC überhaupt funktioniert 
und du Programme darauf brennen kannst?
Gast #2982830
Lesenswert?

Ich hoffe einer hat noch eine Idee! Als ich das ganze mit meinem Lehrer 
durchging meinte er, dass das LCD Display die gleiche Pin Belegung wie 
die hier in den Tutorials genannte hat. Also:

1   VSS   GND
2   VCC   +5 V
3   VEE   GND oder Poti
4   RS   PD4 am AVR
5   RW   GND
6   E   PD5 am AVR
7   DB0   nicht angeschlossen
8   DB1   nicht angeschlossen
9   DB2   nicht angeschlossen
10   DB3   nicht angeschlossen
11   DB4   PD0 am AVR
12   DB5   PD1 am AVR
13   DB6   PD2 am AVR
14   DB7   PD3 am AVR
15   A   Vorsicht! Meistens nicht direkt an +5 V abschließbar,
sondern nur über einen Vorwiderstand, der an die Daten
der Hintergrundbeleuchtung angepasst werden muss.
16   K   GND
Gast #2982835
Lesenswert?

Also zum Einstieg hatte ich einfach 8 LEDs mit denen ich rumprobieren 
konnte. Das lief auch alles. Ich programmiere in Atmel Studio 6 und 
benutze den Avr Dragen um das Programm aufzuspielen. Klappt also alles 
soweit :)
#2982846
Lesenswert?

Marcel S. schrieb:
> Ich verstehe nicht ganz genau was du meinst. Also oben ist der
> Schaltplan xD

Der hilft mir aber nix, wenn ich kontrollieren will, welcher Anschluss 
vom LCD zu welchem µC-Pin geht.

Denn kurioserweise hat dein Stecker die Beschriftung '1' (also den 
ersten Pin) dort, wo wir alle hier Bit 7 vom Port vermuten. Das kann 
natürlich so gewollt sein. Aber bei der Fehlersuche heißt es erst mal: 
Alles wird überprüft.
Gast #2982851
Lesenswert?

Also die eins bzw. der Pfeil am Stecker ist dort wo die eins steht. 
Dieser geht dann auf den gleichen Stecker am µC. Nur was genau muss ich 
jetzt tun damit wir die Infos kriegen? Bin ein wenig verwirrt sry
#2982857
Lesenswert?

Na ja.
Wenn du einen Durchgangsprüfer am LCD auf DB4 hältst und mit dem anderen 
Ende des Durchgangsprüfers am µC die Pins abfährst, bei welchem Pin am 
µC piepst es denn?


Ich will doch nur wissen, ob die Zuordnung, dass der Ausgang PORTD/PD0 
zum LCD-Anschluss DB4 auch wirklich und tatsächlich stimmt.

Weder du, noch dein murxender Lehrer haben in mir das Vertrauen 
aufgebaut, dass ich mich darauf verlassen kann, dass das auch 
tatsächlich so ist. Dein Lehrer nicht mit dem Murx den er geliefert hat 
und du nicht, weil du solche Dinge eigentlich wissen solltest, wenn du 
eine (DEINE!) Schaltung aufbaust.
#2982886
Lesenswert?

Marcel S. schrieb:
> Also mit dem 11 Pin also DB4 bekomme ich nirgends ein piepsen

Solltest du aber.
Dann musst du dem mal nachgehen, wo das alles verschwindet.
Hast du am Kabelanschluss (auf der LCD Platine) noch ein piepsen. Hast 
du am anderen Ende des Kabels noch ein Piepsen. Wenn ja, an welchem Pin? 
Dort muss eine Leiterbahn wegführen - wo geht die hin?


Mach doch bitte endlich mal ein Foto, auf dem dein kompletter Aufbau 
ersichtlich ist.
Gast #2982894
Lesenswert?

>Also mit dem 11 Pin also DB4 bekomme ich nirgends ein piepsen

Und was ist mit Pin 12? Also DB5 der an PD1 gehen müsste. Das ist der 
Pin15
am ATMega32.

Komisch das da am ATMega32 RxD und TxD vom Display
belegt werden. Keine gute Idee.
Gast #2982928
Lesenswert?

Links ist ein Quarz zu sehen.
Ich glaube nicht das der uC wie in der lcdroutines.h
angegeben mit 1MHz läuft.

Ändere das

#ifndef F_CPU
#define F_CPU 1000000
#endif

mal in

#ifndef F_CPU
#define F_CPU 16000000
#endif
#2982931
Lesenswert?

OK. Dort geht eine Bahn weg.
Wo führt die hin?
Sieht so aus als ob die zu einem Jumperfeld gehen würde. Stimmt das? Ist 
dort ein Jumper gesetzt?
Letztendes muss die Bahn bis zum µC durchgehen. Auf welchem Pin am µC 
kommt die raus.


Und mal ganz ehrlich: Deine Photos sind eine Zumutung.
Wir sollen hier für dich deine Hardware anaylsieren und deine Photos 
sind unter aller Sau.
Falls du es immer noch nicht begriffen hast: Wir hier, auf der anderen 
Seite des Bildschirms, wir arbeiten DEINE Schaltung durch - die DU 
eigentlich kennen solltest. Und du wirfst uns dann auch noch Prügel 
zwischen die Beine. Ehrlich - ich bin kurz davor alles hinzuschmeissen.
Gast #2982932
Lesenswert?

HA: Als ob ichs geahnt hätte...

Wie man am Zeitstempel sieht, überschneiden sich die unschafren 
Pixelhaufen mit meinem Posts. ;) sehr geil.

LICHT AN! Makroaufnahme aktivieren. usw. Das wird schon.

Du musst zugeben, das man nichts erkennen kann.

Axelr.
Gast #2982941
Lesenswert?

Tut mir Leid ich weiß das wirklich sehr zu schätzen das ihr mir hier 
soviel helft und finde das wirklich super! Ich bin nur wirklich 
absoluter Neueinsteiger in dieser ganzen Sache und mir ist klar das das 
sicher nerven muss wenn ich das hier nicht so kapiere :D
Ich werde bessere Fotos machen allerdings wird es ein paar mins dauern, 
da ich erst die Batterien meiner richtigen Kamera aufladen muss.
#2982951
Lesenswert?

Marcel S. schrieb:

> absoluter Neueinsteiger in dieser ganzen Sache und mir ist klar das das
> sicher nerven muss wenn ich das hier nicht so kapiere

Aber selbst dir muss klar sein, dass es eine elektrische Verbindung 
geben muss, damit Strom fliessen kann. Sonst können wir die ganze Sache 
auch gleich bleiben lassen.

Aus dem Datenblatt des Mega32 entnimmt man
http://www.atmel.com/Images/doc2503.pdf
das PD0 der Pin mit der Nummer 14 ist - also zählt man die halt einfach 
mal am realen IC ab. Den IC so hinlegen, dass die Kerbe an der 
Schmalseite in die richtige Richtung zeigt (wie im Datenblatt) und Pins 
zählen.

Und von dort muss es eine elektrische Verbindung bis zum Pin 11 des LCD 
(vulgo DB4) geben. Ob da jetzt Jumper, Kabel, Stecker, Buchsen 
dazwischen liegen, interessiert keinen, denn das sind so gesehen einfach 
nur steckbare Verbindungen. Wichtig ist das Verbindungspärchen DB4 - PD0 
und das es da einen elektrisch durchgehenden Pfad gibt. Denn genau das 
ist die Aussage der Tabelle
1
...
2
6    E   PD5 am AVR
3
7    DB0   nicht angeschlossen
4
8    DB1   nicht angeschlossen
5
9    DB2   nicht angeschlossen
6
10   DB3   nicht angeschlossen
7
11   DB4   PD0 am AVR
8
12   DB5   PD1 am AVR
9
13   DB6   PD2 am AVR
10
14   DB7   PD3 am AVR
11
...

Wenn der Mega am Pin PD0 wackelt, muss das LCD das am seinem Pin 11 
'sehen' können.
Und da das so sein muss, kann man das auch überprüfen!
#2983059
Lesenswert?

Was'n das für ein 'integrierter' 4-er Jumper Block, der um 2 Positionen 
versetzt aufgesteckt ist :-)

Auf jeden Fall sind die beiden ersten beiden Jumperpositionen nicht 
gebrückt. Logisch, dass da die beiden Datenleitungen nicht durchkommen.


(Hat mich ein wenig Puzzlearbeit gekostet, jetzt Vorderseite und 
Rückseite in übereinstimmung zu bringen. Aber: Mit diesen Photos kann 
man arbeiten :-).
Gast #2983086
Lesenswert?

Marcel S. schrieb:
> Okay das ist ja ein Fortschritt xD
> Wenn die Datenleistungen blockiert werden, muss ich den Jumper
> entfernen, ihn anders aufstecken oder gar einen anderen Port benutzen?

Die Leitungen sind nicht blockiert, sie sind unterbrochen...
Also: Jumper drauf stecken, damit die sie wieder verbunden sind.
Alle Leitungen müssen vom uC zum Display verbunden sein. Welche das 
sind, wurde ja oben schon beschrieben.
#2983097
Lesenswert?

Und dann hoffen wir mal, das das alles war.
Sicherheitshalber ALLE Leitungen dann nochmal durchklingeln. Da darf 
kein Fehler sein! Alle Verbindungen laut Tabelle müssen vorhanden sein.


Wie weiter oben schon vorgeschlagen

#define F_CPU 1000000

durch

#define F_CPU 16000000

ersetzen um pessimistisch zu arbeiten.
Dann gehts zwar etwas zu langsam, aber das ist immer noch besser als zu 
schnell.
Gast #2983111
Lesenswert?

Also ich habe den Jumper nun ganz drauf gemacht. Alle Leitungen 
durchgegangen alles piept wie es soll bis auf der Pin in der linken 
Reihe der letzte ganz unten...da tut sich gar nichts ich weiß aber auch 
nciht ob der nun wirklich wichtig ist
Anzeige des LCDs wie bisher nichts außer den Balken
#2983133
Lesenswert?

Marcel S. schrieb:
> Auf dem Quarz steht: AQ11.059F

Na dann trag mal 11.059Mhz in deiner LCD Konfiguration ein.

Den ifndef schmeisst du raus
1
...
2
////////////////////////////////////////////////////////////////////////////////
3
// Hier die verwendete Taktfrequenz in Hz eintragen, wichtig!
4

5
#define F_CPU 11059000
6

7
////////////////////////////////////////////////////////////////////////////////
8
...

> Die Leiterbahn ohne pieps führt zu dem Taster (siehe Schaltplan) dann
> die LED und abschließend zum Poti und zum letzten Pin der LCD Anzeige :/

Und der ist Masse.
Also ist die Leitung uninteressant für das LCD.
#2983159
Lesenswert?

Marcel S. schrieb:
> Wie soll ich das denn anstellen? xD

Mit einem scharfen Messer die Leiterbahn davor und danach unterbrechen. 
Mit einem Kabel dann die Masseleitung an den Pins vorbei wieder flicken. 
Die Pins danach wieder mit dem scharfen Messer voneinander trennen.


Wenn die Hardware soweit in Ordnung ist, dann ist ein nicht 
initialisierendes LCD meistens auf einen Timingfehler zurückzuführen. 
Sprich: Der µC ist zu schnell für das LCD.

Ich denke auch, dass es gut wäre in der Hauptschleife etwas zu machen, 
zb eine LED blinken zu lassen, damit auch sicher erkennbar ist, dass der 
µC überhaupt läuft (mittlerweile traue ich nix und niemandem mehr, 
solange bis es getestet wurde)
#2983185
Lesenswert?

Leuchtet die grüne LED wenn du die Taste drückst? Ist der Jumper für die 
Leitung1 auf deinem SChaltbild auch gesteckt? Wenn ja, dann ändere mal 
den Code entstprechend:
1
#include <avr/io.h>
2
#include "lcd-routines.h"
3
#include <util/delay.h>
4

5
int main(void)
6
{
7

8
DDRD=(1<<DDD6)|(1<<DDD7);
9
PORTD&=~(1<<PD6);
10
  lcd_init();
11
  lcd_data( 'T' );
12
  lcd_data( 'e' );
13
  lcd_data( 's' );
14
  lcd_data( 't' );
15
  
16
  lcd_setcursor( 0, 2 );
17
  
18
  lcd_string("Hello World!");
19
  
20
  while(1)
21
  {
22
  PORTD|=(1<<PD7);
23
  _delay_ms(500);
24
  PORTD&=~(1<<PD7);
25
  _delay_ms(500);
26
  }
27
  
28
  return 0;
29
}
Die grüne LED sollte im Sekundentakt blinken.
Gast #2983192
Lesenswert?

Mir ist grade aufgefallen, dass jemand an zwei Ports ein "D" geschrieben 
hat. Wenn ich es in den anderen Stecke, leuchtet sie im Sekundentakt. 
Allerdings war das auch schon vorher so. Jumper ist komplett drauf 
allerdings ist das ja nun ein anderer Port
Gast #2983207
Lesenswert?

Der Mikrocontroller kommt aus dem Labor unserer Schule und jemand hat 
diesen einmal verwendet und zwei Ports mit einem Filzstift als "Port D" 
gekennzeichnet. Nun ist mir das gerade aufgefallen und habe mal auf den 
anderen "Port D" umgesteckt. Dort blinkt die LED im Sekundentakt, was 
sie allerdings auch schon vor deinem Code getan hat. Jedoch ist das der 
einzige Port auf dem sie blinkt. Das ist der neue Port. Mit dem alten 
Port meine ich der Port auf dem ich es den ganzen Tag also bisher laufen 
lies. Dort blinkt die LED nicht. Sie leuchtet aber, wenn man den Taster 
drückt.
Gast #2983217
Lesenswert?

Nach einer Zeit hat er nun aufgehört zu blinken...
Auf welchen Pin von dem Kontroller bist du drauf wenn die LED blinkt?
Welcher Pin? Ich hätte verstanden wenn du Port meinst aber was für ein 
Pin?
wie zählt man die dinger eig...? in einer reihe oder immer so 
voreinander?
Gast #2983231
Lesenswert?

Was für einen Schaltplan suchst Du im Datenblatt?

Dort steht an welchem Pin welches Bit von welchem Port hängt.

Ach und ein "Pin" ist ein Anschluss des Prozessors.

P.S. Und bitte höre auf Dich zu entschuldigen. Die ersten drei mal nimmt 
man das noch zur Kenntniss. Danach nervts nur noch.
Gast #2983234
Lesenswert?

Ich halte den Kontroller so, dass die Kerbe oben ist. In der Zeichnung 
ist sie auch oben. Ich bin also bei den "PC0-7" Dingern. Der PD7 scheint 
da ja auch noch hinzugehen :/ Könnte das der Grund sein, dass die LED 
geht=?
Gast #2983271
Lesenswert?

Sag mal hast Du sie noch alle? Wer glaubst Du wer Du bist?

Du sollst hier nicht Deine Begriffssystem uns erklären damit wir Dich 
verstehen, sondern die allgemein anerkannten und von uns verwendeten 
Begriffe und Erklärungsmuster benutzen, damit wir Dich verstehen. Da Du 
etwas von uns willst wirst Du Dich an UNS anpassen müssen, nicht 
umgekehrt.
Gast #2983287
Lesenswert?

Sag mal ich lass hier nicht so mit mir reden. Ich kenne diese ganzen 
Begrifflichkeiten noch nicht und das, was ich dort erklärt habe kann ich 
auch noch nicht im Moment mit Begriffen wie Pin oder sonst etwas 
erklären. Ehrlich gesagt finde ich das echt schade, da sich einige Leute 
wirklich um mein Problem bemühen, aber ich werde mir glaube ich wirklich 
noch einmal gründlich überlegen, ob ich hier noch einmal eine Frage 
stelle. Ich weiß auch deine Hilfe zu schätzen, aber SO, hat hier meiner 
Meinung nach niemand mit mir zu reden. Und SO, wirst du eher das 
Gegenteil erreiche...
Gast #2983298
Lesenswert?

Das ganze klingt tatsächlich etwas komisch ^^
Beim Laden geht alles klar keine Fehler ...
Kontroller habe ich ATmega32 ausgewählt...hat bisher immer funktioniert, 
also die richtigen Programme waren anschließend drauf
Gast #2983310
Lesenswert?

@Werner
Wenn ich wüsste wie man das sagt :)
@Hubert
Wenn ich alles lösche blinkt es nicht mehr. Scheint wohl was im Programm 
nicht zu stimmen. Schau nochmal vorbei irgendwann :P Gute Nacht :)
Gast #2983580
Lesenswert?

Marcel S. schrieb:
> Wenn ich wüsste wie man das sagt :)

Dafür gibt es die Flash Fuse Bits (s. Datenblatt im Abschnitt Clock 
Sources)

Prüfen kann man die Taktfrequenz z.B., indem man ein kleines Programm 
schreibt, dass eine LED an einem Port-Pin mit vorgegebener Frequenz 
blinken läßt und die tatsächliche Frequenz damit vergleicht.

Weiter viel Spaß
Gast #2983974
Lesenswert?

Eine Frage hätte ich noch. Ich versuche nun auf dem LCD Spannungen 
auszugeben, welche ich mit dem ADC eingelesen habe. Jedoch bin ich mir 
nicht ganz sicher wie ich das umrechne. Er zeigt mir eine Zahl auf dem 
Display an
immer so etwas: Spannung: 03123232
Drehe ich am Poti, der am ADC Port angeschlossen ist, verändert sich 
diese "Spannung" auch. Entweder stimmt was mit der Umrechnung 
nicht...habe die Formel -> Vin = ADC * Vref/1024 gefunden. Die 
Referenzspannung ist mir allerdings nicht bekannt. Gibt es nicht einen 
relativ einfachen Weg diese herauszufinden? Das ganze kann ja 
wahrscheinlich auch etwas mit der Komma Setzung zu tun haben. Bestimmt 
habt ihr da Erfahrung dürfte nichts weltbewegendes sein :)

Der Quellcode:
http://pastebin.com/DETcsc3f
Gast #2984405
Lesenswert?

Also ich habe nun auf verschiedenen Seiten weiter nachgelesen und die 
Ausgabe nun mit sprintf gelöst. Bekomme ich dasselbe wie mit utoa. Ist 
ja auch egal :) Jedenfalls bekomme ich nun akzeptable Werte zwischen 0 & 
3680mV. Ich habe im Internet recherchiert und bin zum Entschluss 
gekommen, die 5V als Vref anzunehmen. Das einzige was mir jetzt noch 
Bauchschmerzen bereitet ist, dass wenn ich den Poti am ADC drehe, die 
Spannung erst auf 1000mV absinkt und dann plötzlich auf 9000mV ansteigt 
und dann wieder absinkt bis schließlich null?!
Außerdem kann ich mir nicht sicher sein, ob die Werte stimmen. Hab es 
schon mit nachmessen probiert an den passenden Pins. Leider konnte ich 
da nichtmal 1mV messen. Habe auch schon im Internet geschaut und finde 
kein geeignetes Verfahren.

Der neue Quellcode:
http://pastebin.com/mwSTxpD3

PS: Ich wäre echt froh über eine kurze Bestätigung, dass ich das richtig 
in eine Spannung umgerechnet habe! :)
Gast #2984469
Lesenswert?

Denkst du das weiß ich nicht? Ich habe nur einfach keinen Durchblick in 
dieser Materie und ich habe echt das Gefühl, als müsste ich hier 
anscheinend alles schon verstehen bzw. wissen. Weißt du ich habe 
versucht die Formel zu verstehen und das ganze in meinem Code dann 
schließlich zu verwirklichen. Da ich mir aber nicht sicher bin ob das, 
was ich getan hab soweit richtig ist, frage ich lieber noch einmal nach. 
Nur leider bekomme ich im Moment anscheinend nur solche komischen 
Kommentare, die mir nicht im geringsten weiterhelfen...
Gast #2984517
Lesenswert?

Irgendwo hier im Forum hatte ich gelesen das das etwas mit den 
Kommastellen auf sich hat. Daher konnte man statt 5 die 5000 schreiben 
uns erhält am Ende das ganze in Millivolt. Falls ich das richtig 
verstanden habe ;)
#2984578
Lesenswert?

Zum heutigen Abschluß:
5000/1024=4  Der Kontroller berechnet keine Kommastellen. Lass dir was 
einfallen dazu.

Schau mal ins Datenblatt was du hier einstellst:
     ADMUX = (1<<REFS1) | (1<<REFS0);

Schau mal ins Datenblatt ob diese Einstellung richtig sein kann:
ADCSRA = (1<<ADPS1) | (1<<ADPS0);

Du gibst am LCD z.B. 2576 mV aus.
Dann verstellst du die Eingabe auf 30   mV was zeigt das Display an? 
Zeigt es 30   mV oder zeigt es 3076mV an?
Du löscht keine Stellen, sie werden nur überschrieben, die nicht 
überschriebenen bleiben stehen.
Gast #2984603
Lesenswert?

Okay danke für die Gedankenanstöße. Ich melde mich wieder wenn ich mich 
damit beschäftigt habe morgen ist erstmal mein Geburtstag angesagt :)
Ach ja und @Eumel
Diese Art Kommentare helfen mir einfach nicht weiter ja? Wenn dir nicht 
passt was ich sage dann hat das doch hier eigentlich nichts zu suchen. 
Ich werde mich natürlich um das Datenblatt bemühen, aber nicht jeder 
kann das alles aufs erste Mal...
Gast #2984611
Lesenswert?

Marcel S. schrieb:
> aber nicht jeder
> kann das alles aufs erste Mal

Du musst auch nicht viel können sondern nur lesen. Dann musst du nicht 
lange auf irgendwelchen Seiten im Internet rumsuchen was jetzt die Bits 
in ADMUX und ADCSRA bedeuten sondern schaust halt schnell im Datenblatt 
nach.
Ja, das Datenblatt ist groß aber du musst das ja nicht am Stück 
durchlesen sondern nur die Passagen die für die interessant sind. Also 
das Kapitel über den ADC. Also hör auf die alles vorkauen zu lassen und 
benutz dein eigenes Hirn.
Gast #2984628
Lesenswert?

Ich verstehe was du meinst, aber mir vorzuwerfen ich würde mein eigenes 
Hirn nicht benutzen...langsam finde ich das hier nicht mehr witzig und 
ich fühle mich schlichtweg beleidigt. Wie auch immer...im Moment hab ich 
echt genug ich bin erstmal raus...
Gast #2985063
Lesenswert?

C hatte ich jetzt 1 Jahr in der SChule und liegt mir sehr gut. Ich habe 
immerhin Programme mit Umfang 1000 Zeilen geschrieben ... leider ist das 
hier doch noch ein bisschen was anderes. Das habe ich jedenfalls im 
Gefühl. Gerade mit diesen Bits un Bytes und den Hexadezimalzahlen aber 
wenn ich mich da nochmal richtig reinhänge...Ich behaupte nun einfach 
das ich C Fortgeschrittener Anfänger bin :P
Gast #2985206
Lesenswert?

Okay wie gesagt ich werde es nochmal intensiv durchgehen. Was mich noch 
interessieren würde ist, ob diese Berechnung mit den 5000/1024 nun 
wirklich stimmt :) Und ich wäre noch froh wenn du mir kurz sagen 
würdest, was ich mir unter einem Register vorstellen kann. Dieser 
Begriff will sich einfach nicht vor mir auflösen :) Dienen diese einfach 
dazu, um bestimmte Pins auf Eingang oder Ausgang zu setzen?
Gast #2985216
Lesenswert?

Marcel S. schrieb:
> Und ich wäre noch froh wenn du mir kurz sagen
> würdest, was ich mir unter einem Register vorstellen kann. Dieser
> Begriff will sich einfach nicht vor mir auflösen :) Dienen diese einfach
> dazu, um bestimmte Pins auf Eingang oder Ausgang zu setzen?

Einfach ein Byte. Also 8 einzelne Bits zu einer größere logischen 
Einheit zusammengefasst. Man könnte auch Speicherzelle sage. Welche 
Funktion das Register hat ist aber dadurch nicht fetgelegt. Ein Register 
im RAM ist z.b. "nur" ein Datenspeicher in dem dein Programm Daten 
speichern und wieder lesen kann. Andere Register deines Mikrocontrollers 
haben spezielle funktionen. So kannst du z.b. durch die DDRX Register 
bestimmen welcher Pin eines Ports ein Eingang oder ein Ausgang sein 
soll. Andere Register, z.b. die des ADC haben andere Funktionen. Du 
steuerst die einzelnen Komponenten deines Controllers (ADC, Timer, I/O 
Ports) in dem du bestimmte Werte in die entsprechenden Register 
schreibst. Welche Register das genau sind und welche Werte was bewirken 
entnimmst du dem Datenblatt.
Stell dir ein Register einfach als 8 Schalter die du auch "Null" oder 
"Eins" setzen kannst vor. Mehr ist es nicht.
#2985251
Lesenswert?

Marcel S. schrieb:
> Was mich noch
> interessieren würde ist, ob diese Berechnung mit den 5000/1024 nun
> wirklich stimmt

Nein, sie stimmt in diesem Fall nicht. Es werden standardmäßig keine 
Stellen nach dem Komma berechnet. Fließkommaberechnungen sind zwar 
möglich, sollte man aber aufgrund großer notwendiger Rechenleistung 
vermeiden.
Das Ergebnis der Rechnung ist, wie ich schon mal geschrieben habe, 4 und 
daher sicher nicht das gewünschte Ergebnis.
Wenn du allerdings den ADC-Wert *5000 und dann /1024 rechnest, hast du 
ein brauchbares Ergebnis.
Dazu musst du AREF aber noch auf VCC einstellen.
Gast #2985533
Lesenswert?

Hubert G. schrieb:
> ADMUX = (1<<REFS1) | (1<<REFS0);

Da das ganze auf 5V, also Vcc laufen soll, habe ich nun das daraus 
gemacht:
ADMUX |= (1<<REFS1);
ADMUX &= ~(1<<REFS0);

Hubert G. schrieb:
> Schau mal ins Datenblatt ob diese Einstellung richtig sein kann:
> ADCSRA = (1<<ADPS1) | (1<<ADPS0);

Hier bin ich mir nicht ganz sicher. Im Datenblatt habe ich die Default 
Clock Source gefunden, welche normalerweise auf 1MHz steht. Bei dem 
Quarz (11,059MHz) würde ich auf einen Teilungsfaktor im Bereich 55 bis 
220 kommen...Was kannst du mir in diesem Fall raten? Quarz oder Default 
setting? Was ist hier eher anzunehmen?

Hubert G. schrieb:
> Du gibst am LCD z.B. 2576 mV aus.
> Dann verstellst du die Eingabe auf 30   mV was zeigt das Display an?
> Zeigt es 30   mV oder zeigt es 3076mV an?
> Du löscht keine Stellen, sie werden nur überschrieben, die nicht
> überschriebenen bleiben stehen.

Hier habe ich mir überlegt alles neu auf das Display zu schreiben, bzw. 
die Variable nach jedem Durchlauf wieder auf 0 zu stellen, was jedoch 
keine Veränderung bringt. Du hast recht, die Messmethoden sind copy & 
past aber ich bin sie nun noch einmal durchgegangen und ich glaube ich 
habe sie nun größtenteils verstanden bis auf:
ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F);
Ich komme nicht dahinter was ich tun muss, um die Stellen richtig zu 
erhalten. Im Moment bekomme ich mit der neuen Vref Werte bis -200000.
Hier der aktuelle Quellcode:
http://pastebin.com/GUYNMY0n
#2985581
Lesenswert?

Marcel S. schrieb:

> Hier bin ich mir nicht ganz sicher. Im Datenblatt habe ich die Default
> Clock Source gefunden, welche normalerweise auf 1MHz steht. Bei dem
> Quarz (11,059MHz) würde ich auf einen Teilungsfaktor im Bereich 55 bis
> 220 kommen...Was kannst du mir in diesem Fall raten? Quarz oder Default
> setting? Was ist hier eher anzunehmen?

Den Quarz und die Quarz Fuses lässt du in Ruhe.
Statt dessen stellst du die den Teiler für den ADC so ein, dass du in 
den Frequenzbereich kommst, den du haben solltest. Wobei du eher auf der 
langsamen Seite bleibst als auf der Schnellen (zumindest solange, 
solange du keinen guten Grund dafür hast, die schnellere ADC 
Taktfrequenz zu verwenden)

> Hier habe ich mir überlegt alles neu auf das Display zu schreiben, bzw.
> die Variable nach jedem Durchlauf wieder auf 0 zu stellen, was jedoch
> keine Veränderung bringt.

Die Variable ist nicht dasselbe wie das was auf dem LCD steht. Auf dem 
LCD stehen einfach nur Buchstaben (die aus dem Inhalt der Variablen 
generiert werden). Und so wie du mit dem Belistift auf einem Blatt 
Papier zwar auch über etwas drüber schreiben kannst, genauso bleibt auf 
dem Papier alles das stehen, was du eben nicht überschreibst.

Ich denke du hast schon 1 Jahr C programmiert? Hast du da nicht gelernt 
welche Formatiermöglichkeiten man mit printf bzw. sprintf hat und dass 
man sprintf anweisen kann, Zahlen zb immer 4 stellig zu formatieren? Und 
sei es nur dewegen, weil eine Zahl wie 35 mit 2 Leerzeichen links auf 4 
stellig "aufgepumpt" wird. 4-stellig ist 4-stellig. Und wenn ich den 
4-stelligen Text " 386" mit dem 4-stelligen Text "  78" überschreiben 
lasse, dann steht dann nachher auch 78 auf dem LCD und nicht 378, weil 
die 3 nie überschrieben wurde. Sie wurde überschrieben, und zwar mit dem 
Leerzeichen, mit dem sprintf den Text für 78 linksbündig aufgeblasen 
hat, um ihn 4-stellig zu machen.

> erhalten. Im Moment bekomme ich mit der neuen Vref Werte bis -200000.

Du brauchst nur richtig umrechnen und die Basisregeln zur Auswertung von 
Ausdrücken in C beachten. Nichts was einen 1-jährigen C-Programmierer 
groß vor Probleme stossen sollten.

int dividiert durch int wird als Integer-Division ausgefhrt und liefert 
wieder einen int.

Und der Rest ist
1024 Äpfel kosten 5000 Cent (also 5.0 Euro)
wieviel kosten 768 (weil der ADC zb 768 geliefert hat) Äpfel?

Rechnen auf Grundschulniveau, in späteren Schuljahren auch bekannt als 
der berühmte Dreisatz.
#2985585
Lesenswert?

Marcel S. schrieb:
> Ehrlich gesagt schon, da das 320 Seiten auf Englisch sind und ich
> vielleicht die hälfte der verwendeten Begriffe verstehe...

Und?
Was glaubst du, wie es Japaner, Chinesen und Vietnamesen geht, deren 
eigene Sprache so gut wie gar nichts mit Englisch zu hat?
Und trotzdem gilt für die genau dassselbe wie für dich: Die 
µC-spezifische Bibel heißt Datenblatt!

Ein Datenblatt ist kein Pullitzer-Preis-verdächtiges Machwerk, sondern 
eine technische Beschreibung. Mit Schulenglisch und zur Not einem 
Wörterbuch kommt man sehr weit. Manchmal hilft einem auch ein bischen 
Querverweis-Denken bzw. logisches "Macht das was ich glaube überhaupt 
Sinn" fragen.
So ein µC ist ja kein Gerät aus Hogwarts sondern ist logisch aufgebaut 
und zwar so, dass er deterministisch benutzbar ist.
#2985603
Lesenswert?

>
1
>              adcval = ADC_Read_Avg(2, 10);  // Kanal 2, Mittelwert aus 4 Messungen
2
>                adcval *= 5000;
3
>                wert = 5000/1024;
4
>                adcval *= wert;
5
>

5000 / 1024 ergibt eine glatte 4.
Warum?
Deswegen
FAQ: Datentypen in Operationen
(Was hast du egentlich in deinem 1 Jahr C Programmierung gelernt? Das 
solltest du nach den ersten 2 Monaten C Programmieren schon längst im 
Schlaf beherrschen!)

Ausserdem ist in C weniger oft mehr. Das hier ist nicht BASCOm, wo man 
alles in Einzelberechnungen aufteilen muss
1
  adcval = ADC_Read_Avg(2, 10);  // Kanal 2, Mittelwert aus 4 Messungen
2
  adcval = adcval * 5000 / 1024;



> Ich behaupte nun einfach das ich C Fortgeschrittener Anfänger bin :P
Du lügst dich selbst an.
Du bist Anfänger auf unterstem Anfängerniveau.
Ganz im Gegenteil: Wenn das mit dem 1 Jahr stimmt, dann bist du sogar 
erschreckend schwach. Aber das 1 Jahr glaub ich dir sowieso nicht (und 
auch nicht die 1000 Zeilen.)
Gast #2985650
Lesenswert?

Okay danke für den Tipp mit dem Formatierungszeichen. Ich hoffe es 
reicht nun endlich mal mit diesem blöden Datenblatt. Ich habe 
mittlerweile begriffen dass dieses wichtig ist und ich habe es auch 
vorhin benutzt um mich über ADMUX und den Takt usw. zu informieren, wie 
du sicher meinem Post entnommen hast. Also hoffe ich dass das nun mal 
geklärt ist.
Zu dem C - Problem hier:
Mir ist klar, dass ich es genauso gut so schreiben kann. Für mich waren 
und sind aber diese einzelnen Schritte erst einmal wichtig gewesen um 
das ganze besser zu verfolgen. Das kann denke ich nun erstmal jeder für 
sich entscheiden. Ich versichere dir, dass ich kein blutiger Anfänger 
bin und du das auf Grund dieses Quellcodes noch lange nicht 
verallgemeinern solltest. Falls du mir das nicht glaubst pech. Ich weiß 
in diesem Fall was ich kann.
#2985653
Lesenswert?

Marcel S. schrieb:

> Mir ist klar, dass ich es genauso gut so schreiben kann. Für mich waren
> und sind aber diese einzelnen Schritte erst einmal wichtig gewesen um
> das ganze besser zu verfolgen.

Dann schau dir doch mal GENAU an, was du eigentlich geschrieben hast.
Wenn dir klar ist, was da die Unterschiede sind, dann hast du wirklich 
was gelernt.

> Ich weiß in diesem Fall was ich kann.

Ja, du kannst
1
   i = j * 5000 * 5000 / 1024;
nicht von
1
   i = j * 5000 / 1024;
unterscheiden, wenn man es auf 2 Zeilen aufteilt :-)
Und was noch viel Schlimmer ist: dir kommt es noch nicht mal in den Sinn 
die Berechnung EXAKT zu überprüfen, wenn du auf dem LCD eine AUsgabe von 
-200000 siehst, was mit einem 16 Bit unsigned int schon mal in 
mehrfacher Hinsicht gar nicht möglich ist.
Fazit: Du hast 4 Zeilen Code selber geschrieben (der Rest ist kopiert), 
3 davon sind fehlerhaft. Das ist weit entfernt von 'fortgeschrittener 
Anfänger'
Gast #2985665
Lesenswert?

Hubert G. schrieb:
> Wenn du allerdings den ADC-Wert *5000 und dann /1024 rechnest, hast du
> ein brauchbares Ergebnis.

Mir ist schon klar was für einen Unterschied du mir aufzeigen willst. 
Meine Rechnung war auch so gewollt, wie ich sie ursprünglich 
aufgeschrieben haben.
Dann habe ich obiges Zitat wahrscheinlich fehlinterpretiert :D
Mit adcval = adcval * 5000/1024; und sprintf(val,"%u",adcval); erhalten 
ich nun immerhin mal bessere Werte 04 bis 64.

@Eumel
ist halt soo... :P xD
#2985672
Lesenswert?

Marcel S. schrieb:

> Mit adcval = adcval * 5000/1024; und sprintf(val,"%u",adcval); erhalten
> ich nun immerhin mal bessere Werte 04 bis 64.

Was hängt am ADC Eingang?
Bei einer Referenzspannung von 5V (also Vcc) und einem Poti als 
Spannungsteiler zwischen GND und VCC

      +5V (Vcc) -------+
                       |
                      +-+
                      | |
                    <----------------------o zum ADC Pin vom µC
                      | |
                      +-+
                       |
       GND ------------+

sollten da aber Werte von 0 bis 4999 rauskommen.
Gast #2985701
Lesenswert?

Er will die Bilder nicht hochladen also versuch ich es zu erklären. 3 
Stück von diesen Potis nebeneinander mit jeweils 3 Vorwiderständen bei 
Vcc

     +5V (Vcc) -------+
                       |
                      +-+
                      | |
                      | |
                      | |
                      +-+
                       |
                       |
                       |
                      +-+
                      | |
                    <----------------------o zum ADC Pin vom µC
                      | |
                      +-+
                       |
       GND ------------+

Das drei mal nebeneinander auf einer Lochrasterplatine und dann per 
Flachbandkabel rüber.
Gast #2985725
Lesenswert?

Die Widerstände haben jeweils 12kOhm
Die Potis haben jeweils 10kOhm
Ich weiß nicht ob man das Prallel nennen kann :D
Jeder der Potis hat eine eigene Leitung auf dem Flachbandkabel für Vcc 
und Masse usw. Also 3 mal das hier hinereinander ohne eine Verbindung...

      +5V (Vcc) -------+
                       |
                      +-+
                      | |
                      | |
                      | |
                      +-+
                       |
                       |
                       |
                      +-+
                      | |
                    <----------------------o zum ADC Pin vom µC
                      | |
                      +-+
                       |
       GND ------------+
#2986093
Lesenswert?

Und warum kannst den nicht hier posten?
Entweder einfach als File anhängen oder in den Text einfügen
1
#include <avr/io.h>
2
#include "lcd-routines.h"
3
#include <util/delay.h>
4
#include <stdint.h>
5
 
6
 
7
void ADC_Init(void) {
8
 
9
  uint16_t result;
10
 
11
  ADMUX |= (1<<REFS1);
12
  ADMUX &= ~(1<<REFS0);
13
 
14
  ADCSRA = (1<<ADPS1) | (1<<ADPS0);    
15
  ADCSRA |= (1<<ADEN);                  
16
 
17
  ADCSRA |= (1<<ADSC);                
18
  while (ADCSRA & (1<<ADSC) ) {        
19
  }
20
  result = ADCW;
21
}
22
 
23
uint16_t ADC_Read(uint8_t channel)
24
{
25
        ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F);
26
        ADCSRA |= (1<<ADSC);
27
        while (ADCSRA & (1<<ADSC) ) {
28
        }
29
        return ADCW;
30
}
31
 
32
uint16_t ADC_Read_Avg(uint8_t channel, uint8_t nsamples)
33
{
34
  uint32_t sum = 0;
35
 
36
  for (uint8_t i = 0; i < nsamples; ++i) {
37
    sum += ADC_Read(channel);
38
  }
39
 
40
  return (uint16_t)(sum / nsamples);
41
}
42
 
43
 
44
int main(void)
45
{
46
        uint16_t adcval;
47
        char val[100] = "";
48
 
49
        DDRD=(1<<DDD6)|(1<<DDD7);
50
        PORTD&=~(1<<PD6);
51
        lcd_init();
52
        ADC_Init();
53
       
54
        lcd_setcursor(0, 1);
55
        lcd_string("Spannung:");
56
        lcd_setcursor(0, 2);
57
        lcd_string("     mV");
58
       
59
        while(1)
60
        {              
61
                adcval = ADC_Read_Avg(2, 10);  // Kanal 2, Mittelwert aus 4 Messungen
62
                adcval = adcval * 5000/1024;
63
                sprintf(val,"%u",adcval);
64
                lcd_setcursor(0, 1);
65
                lcd_string(val);
66
        }
67
       
68
        return 0;
69
}
Gast #2986284
Lesenswert?

Natürlich habe ich ins Datenblatt geschaut. Das war dann leider ein 
Übertragungsfehler...Im Endeffekt zeigt mir das LCD immer noch dasselbe 
an.

#include <avr/io.h>
#include "lcd-routines.h"
#include <util/delay.h>
#include <stdint.h>
#include <stdio.h>


void ADC_Init(void) {

  uint16_t result;

  ADMUX |= (1<<REFS0);
  ADMUX &= ~(1<<REFS1);

  ADCSRA = (1<<ADPS1) | (1<<ADPS0);
  ADCSRA |= (1<<ADEN);

  ADCSRA |= (1<<ADSC);
  while (ADCSRA & (1<<ADSC) ) {
  }
  result = ADCW;
}

uint16_t ADC_Read(uint8_t channel)
{
  ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F);
  ADCSRA |= (1<<ADSC);
  while (ADCSRA & (1<<ADSC) ) {
  }
  return ADCW;
}

uint16_t ADC_Read_Avg(uint8_t channel, uint8_t nsamples)
{
  uint32_t sum = 0;

  for (uint8_t i = 0; i < nsamples; ++i) {
    sum += ADC_Read(channel);
  }

  return (uint16_t)(sum / nsamples);
}


int main(void)
{
  uint16_t adcval;
  char val[100] = "";

  DDRD=(1<<DDD6)|(1<<DDD7);
  PORTD&=~(1<<PD6);
  lcd_init();
  ADC_Init();

  lcd_setcursor(0, 1);
  lcd_string("Spannung:");
  lcd_setcursor(0, 2);
  lcd_string("     mV");

  while(1)
  {
    adcval = ADC_Read_Avg(2, 4);  // Kanal 2, Mittelwert aus 4 Messungen
    adcval = adcval * 5000/1024;
    sprintf(val,"%4u",adcval);
    lcd_setcursor(0, 2);
    lcd_string(val);
  }

  return 0;
}
#2986318
Lesenswert?

Marcel S. schrieb:
> Natürlich habe ich ins Datenblatt geschaut. Das war dann leider ein
> Übertragungsfehler...Im Endeffekt zeigt mir das LCD immer noch dasselbe
> an.

Na dann.
Multimeter raus und mal die Spannung direkt am µC-Pin (welchem?) 
gemessen.
ADC Wert ohne Umrechnung direkt ausgeben.

Zeig doch mal ein bischen Eigeninitiative, wie man Problemen auf den 
Grund gehen kann. Grundsätzlich wird ALLES kontrolliert. Software wie 
Hardware!
Gast #2986634
Lesenswert?

Ich verstehe nicht was das soll. Der hat jetzt schon so viel Hilfe 
beansprucht und min. 4 User angepöbelt.
Nachher geht er zum Lehrer und zeigt ihm was "er" tolles programmiert 
hat.

@Marcel S.

Ich will dich nicht beleidigen aber so lernst du überhaupt nix. Wenn du 
kein Datenblatt lesen kannst, kannst du dieses Hobby/diesen Beruf 
sowieso vergessen, also würde ich möglichst früh damit anfangen.
Gast #2986775
Lesenswert?

Moin Leute,

ich verfolge diesen Thread auch schon längere Zeit.
Ich möchte mal bezweifeln das der TO sich der Tragweite seines Unwissens 
bewußt ist. Ob er URI(UZI) kennt?
Bei allem würde mich nur interessieren den wievielten Geburtstag Marcel 
schon gefeiert hat!

Gruß
Andi
Gast #2987004
Lesenswert?

Ich werde das ganze nun an dieser Stelle abbrechen.

Electronics'nStuff schrieb:
> Der hat jetzt schon so viel Hilfe
> beansprucht und min. 4 User angepöbelt.

Genau jetzt solltest du dich fragen, warum ich, der nicht auf Streit aus 
ist, so etwas tut. Denk darüber nach.

Electronics'nStuff schrieb:
> Ich will dich nicht beleidigen

Das scheinen wohl viele hier nicht zu wollen. Da bin ich mir nur leider 
nicht ganz so sicher wie du.

Andreas G. schrieb:
> Ob er URI(UZI) kennt?

Natürlich kenne ich das. Ich habe nicht umsonst 1 1/2 Jahre 
Elektrotechnik gehabt, was genau der Zeit entspricht, die ich noch in 
diesem Bereich vor mir habe.

Ich möchte mich auf jeden Fall noch einmal abschließend bei:
Karl Heinz Buchegger &
Hubert G.
für die unermüdliche Hilfe bedanken. Der große Rest der Beiträge waren 
wie ich es empfunden habe eher blöde Bemerkungen und Feststellungen wie 
viel ich doch weiß und wie schlau ich doch eigentlich bin. Solche 
Kommentare kann & will ich nicht einfach hinnehmen.
Ich bin dann nun raus aus diesem Forum & wenn jemand Lust hat, kann er 
ja wie anscheinend üblich seine freundliche Meinung hierrunter posten. 
Ansonsten ist  dieser Thread es hoffentlich Wert, gelöscht zu werden...
Tschüss & viel Glück weiterhin
Gast #2987012
Lesenswert?

Marcel S. schrieb:
> Genau jetzt solltest du dich fragen, warum ich, der nicht auf Streit aus
> ist, so etwas tut. Denk darüber nach.

Bin ich doch auch nicht.

Marcel S. schrieb:
> Das scheinen wohl viele hier nicht zu wollen. Da bin ich mir nur leider
> nicht ganz so sicher wie du.

Ich wollte dich keinesfalls beleidigen.
Aber es ist besser du hörst es von einem anonymen aus irgend einem Forum 
als von deinem zukünftigen Vorgesetzten.

Marcel S. schrieb:
> Natürlich kenne ich das. Ich habe nicht umsonst 1 1/2 Jahre
> Elektrotechnik gehabt, was genau der Zeit entspricht, die ich noch in
> diesem Bereich vor mir habe.

Na dann solltest du erst recht in das technische englisch reinknien um 
zumindest die Belegungen von Bauteilen aus einem DB rauslesen können.

Marcel S. schrieb:
> Der große Rest der Beiträge waren
> wie ich es empfunden habe eher blöde Bemerkungen und Feststellungen wie
> viel ich doch weiß und wie schlau ich doch eigentlich bin. Solche
> Kommentare kann & will ich nicht einfach hinnehmen.

Naja.. eigentlich schon. Du willst was also musst du dir das anhören.
#2987023
Lesenswert?

> Ich wollte dich keinesfalls beleidigen.
Ich auch nicht.

>> Natürlich kenne ich das. Ich habe nicht umsonst 1 1/2 Jahre
>> Elektrotechnik gehabt, was genau der Zeit entspricht, die ich noch in
>> diesem Bereich vor mir habe.

Du LERNST ganz offiziell Elektrotechnik und ICH (gelernter Chemiker) 
muss dir erklären, wie man eine Leiterbahn von A nach B verfolgt, bzw. 
du findest nicht von dir aus den nicht gesetzten Jumper?
Jetzt bin ich sprachlos. Ich bin eigentlich davon ausgegangen, du wärst 
Mittelschüler. So irgendwas um die 14, 15 Jahre alt und gehst vielleicht 
in ein Gymnasium.
Gast #2987308
Lesenswert?

Karl Heinz Buchegger schrieb:
> Ich bin eigentlich davon ausgegangen, du wärst
> Mittelschüler. So irgendwas um die 14, 15 Jahre alt und gehst vielleicht
> in ein Gymnasium.

Ich möchte mich nur hier einklinken weil ich nicht der Typ bin der 
andere Menschen runtermachen möchte.

Ich wollte gerne wissen wie alt der TO ist weil ich wie Karl Heinz (den 
ich wirklich schätze) angenommen habe das er in der Pubertät und 
zwischen 14-17 Jahre alt ist.
Das hätte seine doch sehr unreife Art und Weise erklärt mit Kritik 
umzugehen und auch warum da nicht soviel an Fachwissen rüberkam.
Die URI/UZI Frage war von mir gestellt weil der TO nicht den Hauch einer 
Ahnung hatte was da nach dem Widerstand und dem Poti überhaupt auf 
seinem ADC-Pin ankommt.

Wenn das kein Troll Thread ist dann bin ich mal bis aufs Mark 
erschüttert.
Naja, als Gast kann er sich dann als Gerd G. einloggen und die nächsten 
Fragen stellen.

Gruß
Andi
#2988513
Lesenswert?

Hallo,

mal ganz direkt.... einem Einsteiger, zu dieser Gruppe gehört der 
Erst-Poster offenbar, rate ich dringend, mit Arduinos an zu fangen. Da 
gibt es dann Verweise, wie man die dortige LCD Library prinzipiell 
einsetzt. Das Verdrahten des LCD und der erste Beispieltext.... das war 
eine Sache von wenigen Minuten.

Mein Einstieg war: http://arduino.cc/en/Tutorial/LiquidCrystal

Der Original-Poster hat wohl den Fehler gemacht, schon zu Anfang zu 
schreiben, dass er wenig Zeit hat... was bei vielen dann so ankommt wie: 
"ich bin zu faul selber nach zu denken, helft mir mal"...?!

Wenn der Thread noch aktuell und das Problem noch nicht gelöst ist, 
würde ich erst einmal dazu raten, dass Marcel mal ein Foto des 
Fehlerbildes macht.

Bye,
Thomas

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren