Hallo an alle...
Zuerst:
Controller: ATmega8
Compiler: AVR-GCC
Taktrate: 8 Mhz
Ich verwende zur Ansteuerung eines Displays diese lib:
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Programmierung
Das hat immer wunderbar funktioniert. Doch jetzt macht auf einmal die
set_curosor() - Funktion Probleme. Sobald diese irgendwo im Code
aufgerufen wird zeit das LCD in der ersten Zeile nur die schwarzen
Blöcke an. Allerdings sind diese nicht wirklich schwarz, eher kaum zu
erkennen. Für mich sieht es so aus als würde das LCD ständig gelöscht
und dann die Balken geschrieben werden.
Hab ich im code nirgends die set_cursor() - Funktion drin funzt das
Display einwandfrei...
Hat jemand eine Idee woran das liegen könnte?
Danke schonmal im Voraus
>Hab ich im code nirgends die set_cursor() - Funktion drin funzt das>Display einwandfrei...
Welcher Code? Vieleicht legt dein Code ne Bauchlandung
wegen Stacküberlauf hin. Aber das kann man nicht beurteilen
solange man ihn nicht kennt.
>>Naja, da ist nicht mehr drin außer die main ;)
Och das würde ich so nicht sagen ;)
temperature = gettemp();
gettemp() fehlt.
> dtostrf(temperature, 2,2, temp);
Muss temperature float sein?
Wie groß ist das temp Array?
Fragen über Fragen.
@Rush,
Ein Tipp.
Gewöhne dir das _CLI() / _SEI() in der ISR ab, denn ...
A) das macht schon der Compiler.
B) es kann Probleme machen wenn du es zusätzlich selbst
machst (rätselhaft Abstürze etc.).
C) Sind in <avr/interrupt.h> definiert als sei() / cli().
P.S. Schrecklich - Hinweis mit zwei P schreiben zu müssen (grusel).
Zumal für uns Franken, da gibt es diesen Buchstaben nicht ;-)
Übersetzung P -> B; T -> D
P.P.S. Und "delay" in einer ISR ... noch mehr Gruseln + Schaudern.
Die Funktion fehlt, stimmt ;-)
Die gettemp() gibt einen uint_16 zurück.
Da ich diesen Wert aber noch durch 4 teilen muss brauche ich doch einen
float, sonst komme ich nicht an die Kommastellen rein.
Was den Code angeht: Ich habe testweise einfach den aus dem Tutorial
verwendet
1
//
2
// Anpassungen im makefile:
3
// ATMega8 => MCU=atmega8 im makefile einstellen
4
// lcd-routines.c in SRC = ... Zeile anhängen
5
//
6
#include<avr/io.h>
7
#include"lcd-routines.h"
8
9
intmain(void)
10
{
11
lcd_init();
12
13
lcd_data('T');
14
lcd_data('e');
15
lcd_data('s');
16
lcd_data('t');
17
18
set_cursor(0,2);
19
20
lcd_string("Hello World!");
21
22
while(1)
23
{
24
}
25
26
return0;
27
}
Der funktioniert auch nicht. Aber auf einem Mega16 per JTAG geflasht
läuft er komischerweise.
Den neusten Compiler habe ich auch schon installiert, ohne Erfolg :-(
@Werner B.
Ich habe doch garkein delay in der ISR drin.
und was _CLI und _SEI angeht, meinste ich soll das einfach weglassen,
oder sei() und cli() benutzen?
Rush wrote:
> Ich habe doch garkein delay in der ISR drin.
Doch, in den LCD-Funktionen.
> und was _CLI und _SEI angeht, meinste ich soll das einfach weglassen,> oder sei() und cli() benutzen?
Komplett weglassen.
>Der funktioniert auch nicht. Aber auf einem Mega16 per JTAG geflasht>läuft er komischerweise.
Also wenn dein Minicode (ohne Interrupt) schon nicht
funktioniert wird es wohl an etwas anderem liegen.
Hast du den Code auch für einen ATMega8 neu compiliert?
Oder vieleicht die falsche HEX-Datei erwischt?
alles neu kompiliert, im AVR-Studio auch ein anderes Device angelegt,
die Taktraten angepasst und direkt ausm AVR-Studio draufgeflasht. Tut
sich nichts.
Eben habe ich es mit einem zweiten Mega8 probiert, ebenfalls nichts.
Da der mega8 kein JTAG hat starte ich das Programm mit "Built and Run"
im Simulator. Um das Proggi zu flashen wähle ich dann kein HEX-File
sondern nehme die Option "Use current Simulator/Emulator Flash memory".
Und ich flashe auch das Flash und schreibe nicht ins EEPROM.
Hast du vieleicht ne Wackelkontakt/Lötbrücke am Mega8 Baord die nur
schaden bei diesem Speziellem Befehl erzeugt? Vieleicht geht der Mega8
auch in Reset. Ich würd das mal prüfen das du ne LED am Anfang des
Programms einschaltest und nach dem Setcursor aus.
Wenn die LED ausbleibt dan hängt das LCD sonst resetet vermutlich der
AVR.
der erste wert steht für die stelle in der zeile und der zweite eben für
die zeile.
Also (0,2) wäre in dem Fall die erste Stelle in der zweiten zeile.
(1,2) wäre die zweite Stelle in der zweiten Zeile. Wobei ich das mal
testweise versucht habe und es klappt.... Schreibt dann in die zweite
Zeile aber auch in die zweite Stelle. Also akzeptiert die funktion die 0
nicht, nur warum ?
Vieleicht hat dein Display ein etwas anderes Speicherlayout als das
welches Im Tutorial verwendet wird. Einige Controller haben da ihre
eigene Ansichten (Datenblatt zu dem auf dem Display verwendeten
Controller kann darüber aufschluß geben).
Kannst natürlich die Funktion auch das +1 überlassen ;)
1
voidset_cursor(uint8_tx,uint8_ty)
2
{
3
uint8_ttmp;
4
5
switch(y){
6
case1:tmp=0x80+0x00+x+1;break;// 1. Zeile
7
case2:tmp=0x80+0x40+x+1;break;// 2. Zeile
8
case3:tmp=0x80+0x10+x+1;break;// 3. Zeile
9
case4:tmp=0x80+0x50+x+1;break;// 4. Zeile
10
default:return;// für den Fall einer falschen Zeile
Das seltsame ist ja dass die Funktion schon mit dem Display was ich in
diesem Fall verwende immer einwandfrei funktioniert hat. Nur eben jetzt
komischerweise nicht.
das mit dem +1 wäre ja machbar, dann verliere ich aber immer die 1.
Stelle der Zeile, bei set_cursor(1,2) wird der Text erst ab der zweiten
Stelle des LCD dargestellt.
lcd_command(0xC0) geht auch nicht,
lcd_command(192) geht auch nicht,
set_cursor(1,2); set_cursor(2,2); set_cursor(3,2) bis set_cursor(15,2)
funktioniert, ich kann nur nicht die erste Stelle in der Zeile
ansprechen.
Die Funktion an sich wird auch durchlaufen, denn danach lasse ich eine
LED aufleuchten und die leuchtet auch.
>lcd_command(0xC0) geht auch nicht,
Jetzt wirds aber ziemlich unheimlich.
Also dein Display funktioniert auf ATMega16.
Hast du nach dem umstellen des Prozessors mal
ein "Rebuild all" oder "make clean" gemacht?
Nicht das die LCD Routinen noch als Objektfile
vom ATMega16 gelinkt werden.
Ich habe diesen minicode in einem eigenständigen Projekt geschrieben,
also nicht einfach das Projekt vom mega16 genommen und den Controllertyp
gewechselt. Make clean, Rebuild all... hab ich alles schon probiert.
Ich habe geschrieben das selbe Display mit einem mega16 funzt.
Vielleicht habe ich mich etwas falsch ausgerückt...
Mit "das selbe Display" meine ich ein vom Typ identisches, hatte damals
6 Stück bei ebay gekauft. Also eins habe ich am mega16 hängen, das
andere in meiner Schaltung an der ich rumdoktor....
PS: habe die Schaltung zum x-ten mal durchgemessen... alles OK.
Kann es sein das das Display aus welchem Grund auch immer einen Schaden
hat, dass es mit den ersten stellen der Zeilen nicht klar kommt ?
>Kann es sein das das Display aus welchem Grund auch immer einen Schaden>hat, dass es mit den ersten stellen der Zeilen nicht klar kommt ?
Das sieht zumindest so aus. Kannst du die Displays nicht
mal durchtauschen? Das wär das erste was ich machen würde.
Das ist das letzte was ich machen würde bzw. wohl muss :(
Die Sch****e ist nur das die Lötstellen jetzt nur schwer zugänglich sind
da die Schaltung schon komplett aufgebaut ist :-(
Das ist seltsam, das Teil lief ja schonmal ohne Probleme, dann lag es ne
zeit lang rum ohne dass ich was dran gemacht hatte. Bis ich dann auf die
Idee kam die Software umzugestalten, dann gings auf einmal nicht.
>Aber ist doch komisch, wenn ich doch auf die 2. Stelle einer Zeile>springen kann, kann es doch auch nicht kaputt sein ?!
Zumindest nicht ganz kaputt. Vieleicht doch noch
irgendwo am Code gefummelt? Poste das fehlerhafte
Projekt doch mal komplett als ZIP.
So, hier das komplette Projekt als Zip.
In der lcd-routines.c habe ich die Zeit in der lcd_enable() Funktion auf
90ms gesetzt.
So sehe ich bei Ausführung des angehängten codes wie die erste Zeile
dargestellt wird und anschließend das LCD wieder gelöscht wird. Die LED
zum Schluss des Programms geht an!
Info an alle hier Beteiligten...
Das LCD hat einen Schlag.... hab es eben mal ausgetauscht und siehe da
es funzt auf Anhieb..
Einene derartigen Defekt habe ich jetzt garnicht erwartet.
Vielen Dank für eure Bemühungen
Gruß, Konrad