Wasserlauf mit Atmega328 steuern

Der chaotische Hauptfaden

Moderatoren: Heaterman, Finger, Sven, TDI, Marsupilami72, duese

Name vergessen
Beiträge: 3261
Registriert: Mo 12. Aug 2013, 19:47

Re: Wasserlauf mit Atmega328 steuern

Beitrag von Name vergessen »

Aha, also kommt der Pixelsalat vom AVR (das dürfte IMO schon nicht passieren). Und das Abschalten kommt vom Display. Langsam habe ich den Verdacht, daß die Bibliothek die Ansteuerung vom Display vermurkst und irgendwo etwas einstellt oder vergißt, das zu dem Verzögerten Abschalten des Displays führt. Natürlich könnte der Displaycontroller auch einfach kaputt sein. :(

Daß die Blink-LED erst nach dem Text blinkt, will mir nicht einleuchten... eigentlich dürfte gar kein Text ausgegeben werden, denn das Blink-Beispiel müpte den vorigen Code vollständig überschreiben, bzw. umgekehrt... da liegt also auch noch irgendwas im Argen. Hast Du die beiden Beispiele irgendwie im selben Projekt liegen? Nicht, daß der Blink-Code die Clock vom Display toggelt oder sowas? Oder durch welchen Code blink die LED?
Benutzeravatar
Jch
Beiträge: 216
Registriert: Do 2. Jul 2015, 22:14

Re: Wasserlauf mit Atmega328 steuern

Beitrag von Jch »

Doofe Frage am Rande, VSS GND und Minus(0V) sind doch alle das gleiche Potential oder?

Code: Alles auswählen

#include "U8glib.h"

U8GLIB_UC1611_DOGM240 u8g(U8G_I2C_OPT_NONE);

void setup() 
{ 
  u8g.setFont(u8g_font_unifont);
  u8g.setColorIndex(1);                   // Instructs the display to draw with a pixel on. 
pinMode(8, OUTPUT);
}

void loop() 
{    
  u8g.firstPage();
  do 
  {  
    draw();
  } 
  while(u8g.nextPage() );
  delay(10);  
  digitalWrite(8, HIGH);  
  delay(200);              
  digitalWrite(8, LOW);    
  delay(200);  
}
  
void draw()
{
  u8g.drawStr( 20, 20, " H");
}
Dies ist mein Code. Passt der so, wie DU es dir vorgestellt hast oder hattest Du einen anderen Gedankengang?

Andere Idee, was hälst Du davon, wenn ich auf SPI (3-Wire oder 4-Wire) umbaue?
Die Verdrahtung auf dem Steckbrett wäre auch nicht so wild.

Die Bibliothek ist die gleiche, der constructor wäre ein anderer.
SW SPI
u8g_dev_uc1611_dogm240_sw_spi
U8GLIB_UC1611_DOGM240(sck, mosi, cs, a0 [, reset])

HW SPI
u8g_dev_uc1611_dogm240_hw_spi
U8GLIB_UC1611_DOGM240(cs, a0 [, reset])
so viel steht dazu in den devices zu UC1611 EDIT: Ich sehe gerade, dass bei dem Linkt C++Constructor steht. Kann dass der Fehler sein??



EDIT:

Was hat es damit auf sich? Dies ist in der install.txt von der Bibliothek drin:
Install instructions for the Chipkit (Arduino) environment.

1. cd <mpide-... path>/libraries
2. unzip u8glib_arduino_vX.XX.zip
3. cd <mpide-... path>///hardware/pic32/libraries
4. again: u8glib_arduino_vX.XX.zip
5. Open hardware/pic32/cores/pic32/Print.h
Remove line
#define BYTE 0
from the file, use PRINT_BYTE instead of BYTE.
Muss ich das beachten??
Es heisst ja immer PIC32 und ich nutze auf dem Arduino einen ATmel Atmega 328.
Name vergessen
Beiträge: 3261
Registriert: Mo 12. Aug 2013, 19:47

Re: Wasserlauf mit Atmega328 steuern

Beitrag von Name vergessen »

Jch hat geschrieben:Doofe Frage am Rande, VSS GND und Minus(0V) sind doch alle das gleiche Potential oder?
Naja, meistens schon, können aber auch unterschiedlich sein. Das kommt dann auf den Einzelfall an, ob die verbunden sind, werden müssen, oder nicht dürfen. GND und 0V / Minus sind meistens dasselbe, aber müssen es nicht sein. VSS ist gerade bei OPs gern mal eine negative Versorgungsspannung, die nur unter bestimmten Umständen auf GND gelegt werden kann. Bei dem Dogm240-6 steht es allerdings dabei, daß es dasselbe ist.

Na, ich hatte mir vorgestellt, die beiden Beispiele getrennt zu lassen, Du hast die jetzt gemischt (was aber das zuletzt geschilderte Verhalten z.T. erklärt). Immerhin, wenn die LED damit öfter als einmal blinkt, dann heißt das, daß der Loop zwar ordentlich durchlaufen wird, aber die draw-Geschichte nur beim ersten Mal gemacht wird, oder nur beim ersten Mal funktioniert. da könnte man jetzt ansetzen, indem man schreibt:

Code: Alles auswählen

#include "U8glib.h"

U8GLIB_UC1611_DOGM240 u8g(U8G_I2C_OPT_NONE);

void setup() 
{ 
  u8g.setFont(u8g_font_unifont);
  u8g.setColorIndex(1);                   // Instructs the display to draw with a pixel on. 
pinMode(8, OUTPUT);
}

void loop() 
{    
  u8g.firstPage();
  do 
  {  
    draw();
    digitalWrite(8, HIGH);
    delay(200);
    digitalWrite(8, LOW);
    delay(200);
  } 
  while(u8g.nextPage() );
    digitalWrite(7, HIGH);
    delay(200);
    digitalWrite(7, LOW);
    delay(200);
}
  
void draw()
{
  u8g.drawStr( 20, 20, " H");
}
Beachte, daß ich im unteren Teil "digitalWrite()" die "7" genommen habe, ohne auf den konkreten Aufbau einzugehen, da müßtest Du halt einen freien Pin nehmen und da eine zweite LED dranmachen, wie an Pin 8.
Auf diese Weise sieht man jetzt, ob und wie oft die do...while-Schleife durchlaufen wird (jedes Mal blinkt die LED an Pin 8 einmal), und ob / wie oft / wann der äußere Loop durchlaufen wird. Das sollte immer dieselbe Sequenz sein; wenn sie beim erstan Mal anders ist als danach, stimmt mit dem ganzen u8g-Gedöns was nicht.
Jch hat geschrieben:Andere Idee, was hälst Du davon, wenn ich auf SPI (3-Wire oder 4-Wire) umbaue?
Naja, im Prnzip sollte das egal sein, und die Kommunikation funktioniert ja soweit. Ich würde da jetzt eher keine Besserung erwarten, aber Versuch macht kluch...
Jch hat geschrieben:so viel steht dazu in den devices zu UC1611 EDIT: Ich sehe gerade, dass bei dem Linkt C++Constructor steht. Kann dass der Fehler sein??
Das ist dann ein Problem, wenn Du den gcc im C-Modus benutzt, denn da gibt es keine Konstruktoren. Ob der den dann ignoriert oder anmeckert, KA. Wenn der gcc im C++-Moduls benutzt wird, ist das OK.
Jch hat geschrieben:Was hat es damit auf sich? Dies ist in der install.txt von der Bibliothek drin:
Install instructions for the Chipkit (Arduino) environment.
5. Open hardware/pic32/cores/pic32/Print.h
Remove line
#define BYTE 0
from the file, use PRINT_BYTE instead of BYTE.
Also zumindest würde das nichts ändern, wenn Du das genau so machst, der pic-Code wird ja nicht benutzt. Ob es im avr-Code nötig ist bzw. überhaupt so eine Zeile existiert, weiß ich leider nicht; die Bibliothek habe ich noch nie benutzt.
Benutzeravatar
Jch
Beiträge: 216
Registriert: Do 2. Jul 2015, 22:14

Re: Wasserlauf mit Atmega328 steuern

Beitrag von Jch »

Ich denke ich bin dem Übel auf die Schliche gekommen.
Soviel wie ich mitbekommen habe, sind die 4 4,7uF Kondensatoren eine Ladungspumpe, die die 4-fache Spannung erzeugen um überhaupt was sehen zu können.

Diese Kondensatoren soll man anscheinend als Keramische und nicht als Elekrolytische Version einbauen. Die werden angeblich mit einer hohen Frequenz betrieben.

Meine 4 Elkos haben zwar die Kapazität laut DMM, aber sind älter als ich. Die sind Baujahr 1993.
An diesen Elkos habe ich eine Spannung von:
Einschaltmoment: 0,xV
Anzeigemoment 1,7V
Nach-Anzeigemoment 0,xV
Das habe ich nur mit dem DMM gemessen auf die schnelle. Wenn ich Zeit habe, was warscheinlich nicht vor Montag der Fall ist, werde ich diese mit dem Oszi nachmessen und evtl auf andere Kondensatoren umsteigen.

Ich werde Berichten...
Name vergessen
Beiträge: 3261
Registriert: Mo 12. Aug 2013, 19:47

Re: Wasserlauf mit Atmega328 steuern

Beitrag von Name vergessen »

Na dann, hoffen wir mal, daß es das wäre. Zwar habe ich schon öfters Spannungspumpen mit Elkos gesehen, aber wenn das extra drinsteht, hat das sicher seinen Grund. 1993 ist jetzt nicht übermäßig alt, aber low ESR und viele der heute gängigen Belastungsarten gab es damals noch nicht. Zwar kann ein normales DMM keine zuverlässige Aussage treffen, andererseits ändert sich ja schon etwas, und das sollte eigentlich nicht so sein, insofern ist es ein Indikator.
Benutzeravatar
Jch
Beiträge: 216
Registriert: Do 2. Jul 2015, 22:14

Re: Wasserlauf mit Atmega328 steuern

Beitrag von Jch »

Also viel hat sich nicht getan.

Ich habe den Electronic Assembly Vertrieb angeschrieben. Diese meinen, dass es ein Softwareproblem ist. Aber sie bestätigen auch, dass die Keramischen Kondensatoren besser sind als die Elkos.

@ name vergessen:

Den geänderten Programmcode habe ich getestet. Nach Spannung-AN kommt für ein paar Sekunden Pixelsalat, danach blinken die 2 LEDs immer schön abwechselnd weiter.

Als Spannungsversorgung habe ich auch mal eine 9V Blockbatterie (neu) genommen und ein 20A 13,8V Netzteil. Beides brachte keinen nennenswerten Unterschied.
Anse
Beiträge: 2307
Registriert: Mo 12. Aug 2013, 21:30
Wohnort: Bühl (Baden)

Re: Wasserlauf mit Atmega328 steuern

Beitrag von Anse »

Schau mal mit dem Oszi auf dem i2C Bus, ob sich da was im Moment des Textverschwindens was tut, evtl. sogar die Daten decodieren.
Benutzeravatar
Jch
Beiträge: 216
Registriert: Do 2. Jul 2015, 22:14

Re: Wasserlauf mit Atmega328 steuern

Beitrag von Jch »

Hier ist ein kleines Video

Am 0:43 ist es mit for(;;);­ um die Bildschleife zu unterbrechen.
Vorher ohne, also "normaler" Code.

Es wird ja erst gesendet und dann bleibt der I2C Pegel auf High und 1,5Sek. danach verschwindet erst der Text. Also kann doch vom Bus kein "Text verschwinde" Signal kommen oder?
Ladungspumpenkondensator C1
Ladungspumpenkondensator C1
Ladungspumpenkondensator C2
Ladungspumpenkondensator C2
Ladungspumpenkondensator C3
Ladungspumpenkondensator C3
Ladungspumpenkondensator C4
Ladungspumpenkondensator C4
Das ende der Ladungspumpe am C1. In diesem Moment verschwindet der Text
Das ende der Ladungspumpe am C1. In diesem Moment verschwindet der Text
Anse, bitte nicht sauer sein auf meinem Beitrag im Arduino-Leitfaden. Ich bin nur von mir selbst ausgeganen und habe auf andere Leute geschlossen:
Im Carhifi-forum lese ich auch manche Beiträge nicht, wenn es z.B. um die Auswahl vom Autoradio geht, dafür schaue ich eben andere Threats intensiever an. Auch gibt es dort einen "Laberthread" wo jeder mal ein kleines Problem hat und auch seinen eigentlichen Thread verlinken kann.
Der Gedanke ist folgender: Im eigentlichen Threadtitel steht nix von einem Displayproblem, nur dass es um einen Wasserlauf mit AVR geht. Wenn jemand den Arduino-Leitfaden verfolgt und liest, dass es ums eigentliche Display geht, könnte dieser Nutzer eventuell auch auf meinen Thread hier stoßen obwohl er diesen sonst nicht gelesen hätte obwohl er sich damit vielleicht auskennt.
Ich habe dieses Prinzip nur aus meinem anderen Forum übernommen. Bitte um Entschuldigung, falls es hier nicht so sein sollte. Ich will ja den anderen Thread damit nicht vollmüllen.
Anse
Beiträge: 2307
Registriert: Mo 12. Aug 2013, 21:30
Wohnort: Bühl (Baden)

Re: Wasserlauf mit Atmega328 steuern

Beitrag von Anse »

Mein Hinweis im Arduinofaden war in keiner Weise böse gemeint. War nur ein Tipp und gibt meine Meinung wieder ;)

Zum Problem, auf dem Oszi kann ich nicht wirklich was erkennen, da der Wert für Div/s zu gering ist. Mit anderen Worten, stelle ihn mal so ein, das einzelne Bits erkennbar sind. Dazu noch den Trigger auf fallende Flanke. So wie es jetzt ist, sieht man es nur Zeitversetzt.
Noch eine Idee: wenn der Text erschienen ist, mal die Datenleitungen abstecken. Die Pullups aber dran lassen. Wenn das Display und Beschaltung ok sind müsste der Text dann stehen bleiben.
Benutzeravatar
Jch
Beiträge: 216
Registriert: Do 2. Jul 2015, 22:14

Re: Wasserlauf mit Atmega328 steuern

Beitrag von Jch »

Hallo,
Die Idee mit dem Bus abstecken ist so einfach aber doch genial.
Nach 5 Sekunden erfolgreicher Anzeige habe ich mich aber zu früh gefreut und nach weiteren 5 Sekunden kam die Enttäuschung...

Wie gesagt, normalerweisse habe ich nur ca 2-3 Sekunden eine Anzeige. Wenn ich die 2 Leitungen abziehe nachdem der Text steht, dann hält die Anzeige 10-11 Sekunden. Klingt komisch, ist aber so.
Ich hatte auch keine Messgeräte angeschlossen, welche das Ergebnis verfälschen könnten.

Die Oszibilder reiche ich nach. Die Div/s Einstellung hatte ich mit absicht so gewählt. ich wollte ja sehen ob ein Signal vom Bus kommt um einen Clear Screen oder ähliches zu befehlen.

EDIT:
Eine Weitere Erkenntniss: Wenn ich den Resettaster vom Arduino drücke, dann blinkt ja die grüne LED auf der Platine für ein paar Augenblicke. Wenn ich während dieses Blinkens den Resettaster vom Display drücke, dann kommt mein Text auch wieder für ca 5 Sekunden.
Die Anzeigezeiten schwanken zwischen 5 und 11 Sekunden.
I2C Bus am Anfang
I2C Bus am Anfang
Sieht ziemlich grausam aus, aber es geht anscheinend.
Anse
Beiträge: 2307
Registriert: Mo 12. Aug 2013, 21:30
Wohnort: Bühl (Baden)

Re: Wasserlauf mit Atmega328 steuern

Beitrag von Anse »

Also das Oszillogramm sieht echt nicht gut aus. Stell mal sicher ob da nicht ein Alias-Effekt deine Messung stört.
Wenn nicht ist es ein Wunder, das doch noch was am Display ankommt. Probiere mal ob Du die Busfrequenz senken kannst.
Benutzeravatar
Bastelbruder
Beiträge: 11560
Registriert: Mi 14. Aug 2013, 18:28

Re: Wasserlauf mit Atmega328 steuern

Beitrag von Bastelbruder »

Solche Fehler fallen eigentlich nicht in mein Ressort, aber es gibt auch in Hersteller-Datenblättern "vergessene" Details.

Das Display hat einen Sleepmodus, ist der korrekt deaktiviert? Nicht daß Sleep=aktiv beim Beschreiben für kurze Zeit von "Display schreiben" (oder so) überstimmt wird...

Schonmal probiert, das Display (den Bus) durch regelmäßiges Lesen irgendeines (fremden) Registers wach zu halten?
Benutzeravatar
ferdimh
Beiträge: 9429
Registriert: Fr 16. Aug 2013, 15:19

Re: Wasserlauf mit Atmega328 steuern

Beitrag von ferdimh »

Das Display in meiner Karre zeigte auch genau dieses Verhalten. Lösung: Regelmäßig den Text neu einfüttern...
Benutzeravatar
Jch
Beiträge: 216
Registriert: Do 2. Jul 2015, 22:14

Re: Wasserlauf mit Atmega328 steuern

Beitrag von Jch »

Hallo,
den Alaisingfehler möchte ich ausschließen.

Ich mach mich mal schlau, wie ich die Busfrequenz senken kann.

zum Sleepmodus kann ich leider auch nichts sagen, da ich die Bibliothek nicht geschrieben habe und mich im Quelltext nicht auskenne.

Ich habe festgestellt, dass der Bus aktiv ist.

Der Text sollte eigentlich(!!!) regelmäßig aktualisiert werden.

Vermutlich liegt die Busfrequenz bei 100kHz
Schon aktive Schaltung aber ohne Anzeige, dann beim LowPegel wurde Resetet (gleichzeitig kommt der Text) und wenn es wieder HighPegel ist ist der Text immernoch da.
Schon aktive Schaltung aber ohne Anzeige, dann beim LowPegel wurde Resetet (gleichzeitig kommt der Text) und wenn es wieder HighPegel ist ist der Text immernoch da.
Bus ist irgendwie aktiv, aber kein Text mehr leserlich.
Bus ist irgendwie aktiv, aber kein Text mehr leserlich.
Hereingezoomt bei nicht leserlichem Text.<br />Zoomstelle ist der Triggerpfeil im oberen Bild
Hereingezoomt bei nicht leserlichem Text.
Zoomstelle ist der Triggerpfeil im oberen Bild
Vermutlich liegt die Busfrequenz bei 100kHz????
Name vergessen
Beiträge: 3261
Registriert: Mo 12. Aug 2013, 19:47

Re: Wasserlauf mit Atmega328 steuern

Beitrag von Name vergessen »

Also mit dem Zoom sieht der Bus ja eigentlich ganz gut aus, wird wohl wirklich Aliasing gewesen sein. Das Vieh-Deo wollte Google leider trotz gelockerter Sicherheitseinstellungen nicht herausrücken, so daß ich nur raten kann.

Das mit dem Sleepmode könnte natürlich sein, besonders, wenn schon andere genau dieselbe Erfahrung gemacht haben, und würde dazu passen, daß anscheinend der DC die Ladungspumpe einfach abschaltet. Wenn man also extern eine passende Spannung erzeugt und damit das Display an dieser Stelle zwangsbesaftet... ABER nur, wenn das Signal am Ende der LP nicht gepulst ist, sondern eine Dauerspannung ergibt (bis sie abgeschaltet wird natürlich nur).

Da der Code "eigentlich" den Text immer neu schreiben sollte, muß man evtl. zu härteren Mitteln greifen: eine Idee wäre, in dem "draw" den Text zu ändern. Evtl. findet der DC, daß er bei neu geschriebenen, aber nicht geänderten Daten auch nichts zu tun bräuchte...

also in draw mal...

Code: Alles auswählen

void draw()
{
bool t=false;
if(t)
  u8g.drawStr( 20, 20, " H");
else
 u8g.drawStr( 20, 20, " HA");
t=!t;
}
Jetzt sollte der Text stehen bleiben, evtl. blinkt dann das A, oder es ist nur halb so dunkel wie das H, aber das wäre ja erstmal egal. Ansonsten tippe ich mittlerweile fast auf die Library als Problem. Vielleicht gibt's da eine Alternative, oder man muß sich die Mühe machen, zumindest mal was ganz rudimentäres nach Datenblatt selbst zu stricken. :(
Benutzeravatar
Jch
Beiträge: 216
Registriert: Do 2. Jul 2015, 22:14

Re: Wasserlauf mit Atmega328 steuern

Beitrag von Jch »

Hallo,
ich bin mal wieder da.

Ich habe im Datenblatt des Displaycontrollers nachgelesen und da steht drin, dass man für Pin 29 (Vlcd) 3,3M Ohm bis 10M Ohm verbauen kann und 0,1µF bis 0,5µF.

Da laut EA Datenblatt 10M Ohm und 0,47µF verbaut werden sollen, habe ich jetzt genau die anderen Werte, also die kleinstmöglich angegebenen benutzt.
Ich habe den Widerstand auf 3,3 M Ohm und 0,1µF verbaut. Dann verkürzte sich die Anzeigedauer auf ca 1 Sekunde.

Also habe ich weiter experimentiert und selbst 2,5MOhm und 4,7µF bringen keine deutliche Besserung. Also immernoch 2-3Sekunden.

Aber nach dem "schönen" Rechteckimpuls kommt noch ein kleines Dreieck welches manchmal schon nach 100ms oder erst nach bis zu 700ms ansteigt. Diese Zeit ist veränderlich. Das kleine Dreieck direkt vor dem anstieg des Rechteckimpulses scheint eine feste Zeit zu haben.
Dies ist jetzt mit 2 Mohm und 4,7µf Keramischen Kondi
Dies ist jetzt mit 2 Mohm und 4,7µf Keramischen Kondi
Den code habe ich geändert und es zeigt dauerhaft "HA" an. Mit dauerhaft meine ich 2-3 Sekunden ;-)

Dies habe ich zum Thema Ladungspumpe gefunden.
Das sieht jetzt stark nach einem Hardwareproblem aus oder? Weil die Software kann ich durch die Temperatur nicht beeinflussen.
Ich habe meine Schaltung gefönt und dann zeigte es ca 0,5 Sekunden was an.
Danach wanderte alles in den Kühlschrank => 7 Sekunden. Jetzt liegt das Zeug in der Gefriertruhe.
19 Sekunden bei -18°C
19 Sekunden bei -18°C
das Dreiecksignal beim einschalten bei -18°C
das Dreiecksignal beim einschalten bei -18°C
Ausschaltmoment bei -18°C
Ausschaltmoment bei -18°C
Bei dem Link habe ich ja auch am Ende ein Bild angehängt. Da sieht man auch das der Dreieckimpuls vor dem Rechteck sehr nahe am Rechteck dran ist, aber nach dem Rechtecksignal KEIN weiteres Dreieck kommt. Komisch oder?
Name vergessen
Beiträge: 3261
Registriert: Mo 12. Aug 2013, 19:47

Re: Wasserlauf mit Atmega328 steuern

Beitrag von Name vergessen »

Hm. Solche Dreiecke (oder Spitzen, je nachdem wie man sie zerrt) ganz kurz vor (bzw. schon in der Flanke vom) Hauptpuls hab ich auf den Datenleitungen vom Druckerport auch mal gesehen, das scheint irgendwie normal zu sein, evtl. durchwandert da ein Transistor einen Punkt, an dem er sich über den plötzlich einsetzenden Strom erschreckt oder so. Der Peak nach dem Abschalten ist... naja, komisch, aber ob das auch ein Symptom oder Zufall ist, KA. Ich nehme an, daß diese fast 15V die Kontrastspannung sind (klingt ja nach dem verlinkten Post so)?

Also ich könnte mir vorstellen, daß Dir da die EU in die Suppe gespuckt hat. IOW: daß das tempabhängig ist, klingt nach einer kalten Lötstelle, die durch den bleifrei-Mist halt deutlich häufiger vorkommen. Eine Lösung wäre dann wohl, den Krempel von Hand nachzulöten, falls man an die Pins rankommt. Falls nicht, bliebe der Backofen, dabei wäre mir aber Blei am wenigsten suspekt, eher die ganzen giftigen Substanzen, die schon bei geringen Temperaturen aus dem Plastikkram ausdampfen.

Das würde ich aber nur machen, wenn da Rücknahme ausgeschlossen ist, ansonsten lieber einschicken. Also ja, wenn ich den anderen mit betrachte, Hardwarefehler. Schön wäre natürlich ein zweites zum Vergleichen, aber evtl. kannst Du ja auch mal die 15V extern anlegen und schauen, ob das dann anständig funktioniert. Und die miesen Signale auf dem Bus können gleich mit durch denselben Fehler verursacht werden, man stelle sich nur vor, daß die VCC nicht ordentlich kontaktiert wird (wo eine kalte Löstelle ist, sind auch noch mehr), wie sollen dann z.B. Pullups vernünftig wirken. Kannst das ja mal als Idee dem anderen posten, da ich dort keinen Account habe.

Klar, Ausschuß gibt's immer und so, wenn da keine 100%-Tests gemacht werden, aber es ist natürlich besonders toll, wenn man gerade beim ersten Projekt was Defektes geliefert bekommt und dann glaubt, einfach zu doof zu sein. :( Zum Glück hast Du nicht einfach den ganzen Krempel in die Ecke geschmissen. :)
Benutzeravatar
Jch
Beiträge: 216
Registriert: Do 2. Jul 2015, 22:14

Re: Wasserlauf mit Atmega328 steuern

Beitrag von Jch »

Name vergessen hat geschrieben: das scheint irgendwie normal zu sein,... naja, komisch, aber ob das auch ein Symptom oder Zufall ist,
Das habe ich mir auch schon gedacht.
Name vergessen hat geschrieben:Ich nehme an, daß diese fast 15V die Kontrastspannung sind (klingt ja nach dem verlinkten Pos
genau!
Name vergessen hat geschrieben:daß das tempabhängig ist, klingt nach einer kalten Lötstelle,
Meine Frage an den Technischen Support von EA:
bei niedrigen Temperaturen (-18°C) blieb mein Text sogar 22 Sekunden lang stehen. Woran könnte dies liegen?
Antwort von EA:
Dieser Effekt ist bekannt und normalerweise störend. Die Reaktionszeit der Flüssigkristallmoleküle ist temperaturabhängig. Bei niedrigen Temperaturen reagieren die Moleküle träger.
Diese Antwort finde ich sehr toll. Dass das Display träge wird kenn ich von meinem Auto im Winter, da ich dann den durchscrollenden Text nicht mehr lesen kann. Aber bei meinem Autoradio verschwindet der Text nicht :D :D Aber auf mein Problem gehen die nicht konkret ein.
Name vergessen hat geschrieben:Eine Lösung wäre dann wohl, den Krempel von Hand nachzulöten
geht nicht, da der Mist oben mit einer Kunststoffmasse vergossen ist. Backofen fällt raus, da das Teil nicht wärmer als 85°C werden soll.
Ein Schulkollege hat mal gesagt:"ein guter Elektroniker muss 350°C aushalten"
Name vergessen hat geschrieben: aber evtl. kannst Du ja auch mal die 15V extern anlegen und schauen, ob das dann anständig funktioniert.
ANGST: Der Kerl im Mikrocontrollerforum hat es gemacht, aber ich will nix kaputt machen :? :?
Name vergessen hat geschrieben: Wenn man also extern eine passende Spannung erzeugt und damit das Display an dieser Stelle zwangsbesaftet... ABER nur, wenn das Signal am Ende der LP nicht gepulst ist, sondern eine Dauerspannung ergibt (bis sie abgeschaltet wird natürlich nur).
Name vergessen hat geschrieben:wie sollen dann z.B. Pullups vernünftig wirken. Kannst das ja mal als Idee dem anderen posten, da ich dort keinen Account habe.
Meinst Du damit jetzt die Idee der gebrochenen Lötstellen?
Name vergessen hat geschrieben:aber es ist natürlich besonders toll, wenn man gerade beim ersten Projekt was Defektes geliefert bekommt und dann glaubt, einfach zu doof zu sein. :( Zum Glück hast Du nicht einfach den ganzen Krempel in die Ecke geschmissen. :)
Ich will ja nur einmal den Text dauerhaft da stehen haben. Dass ich zu doof bin, mein imaginäres Layout auf anhieb aufs Display zu zaubern ist mir klar. Aber "Hello World" ohne Zeitbegrenzung wäre ja der erste richtige Erfolg. Den Kram in die Ecke zu donnern wäre ja auch sinnlos. Davon brechen noch mehr Lötstellen...

Ich habe auf SPI 4 Draht umgebaut und die Anzeigezeit ist gleich geblieben. Die Bussignale habe ich noch nicht nachgemessen. Bilder folgen.
Name vergessen
Beiträge: 3261
Registriert: Mo 12. Aug 2013, 19:47

Re: Wasserlauf mit Atmega328 steuern

Beitrag von Name vergessen »

Jch hat geschrieben:
Dieser Effekt ist bekannt und normalerweise störend.
Na, bis hierher stimmt die Antwort noch. :lol:

Ich bezweifle aber, daß die Kristalle derart träge werden, daß sie 10s zum Wechseln brauchen (was sie ja müßten, um den Effekt zu erklären). Dann wäre aber noch immer die Frage nach dem Grund des Abschaltens der Spannungspumpe unbeantwortet.
Jch hat geschrieben:geht nicht, da der Mist oben mit einer Kunststoffmasse vergossen ist. Backofen fällt raus, da das Teil nicht wärmer als 85°C werden soll.
Hmm, naja, man könnte versuchen, das mit einer Heißluftpistole "gezielt" zu machen, aber wenn der Chip unter einem Plastikklecks ist, ist das vermutlich ohnehin direkt auf die Platine gebondet, da hilft Hitze dann auch nicht. Auch da kann natürlich was schiefgegangen sein, läßt sich aber nicht reparieren, ohne den Klecks aufzulösen und dann mikrometergenau nachzuarbeiten.
Jch hat geschrieben:ANGST: Der Kerl im Mikrocontrollerforum hat es gemacht, aber ich will nix kaputt machen :? :?
Name vergessen hat geschrieben: Wenn man also extern eine passende Spannung erzeugt und damit das Display an dieser Stelle zwangsbesaftet... ABER nur, wenn das Signal am Ende der LP nicht gepulst ist, sondern eine Dauerspannung ergibt (bis sie abgeschaltet wird natürlich nur).
Das mit dem Pulsen war so eine Vorsichtsmaßnahme, denn die Backplane von LCDs wird fast immer in verschiedenen Spannungsstufen gepulst, und die Pixel durch ein passend teil-gegenphasiges Signal gemultiplext (brauchen immer wechselnde Polarität), und ich war nicht sicher, ob das nicht evtl. dieses Signal sein könnte. Wenn das allerdings bei dem anderen funktioniert hat, und bei Dir das Signal genau bis zum Verschwinden des Textes konstant anliegt und dann wegbricht, wird das wohl wirklich die Kontrastspannung sein. Allerdings würde ich die Spannungspumpe vorher abbauen und einen Widerstand (mal mit 100K anfangen, runtergehen kann man immernoch) zur Katastrophenverhinderung in die 15V-Zuleitung legen. Leider steht da ja nicht explizit, daß man extern an Pin29 was anlegen kann, und eine Innenbeschaltung gbt es auch nicht im DB, also bleibt tatsächlich ein Restrisiko. :(
Jch hat geschrieben:
Name vergessen hat geschrieben:wie sollen dann z.B. Pullups vernünftig wirken. Kannst das ja mal als Idee dem anderen posten, da ich dort keinen Account habe.
Meinst Du damit jetzt die Idee der gebrochenen Lötstellen?
Ja, wobei das ja jetzt eher nach fehlerhaftem Bonding klingt, was aber auf's selbe rauskommt. Dessen Display wäre dann halt noch schlechter kontaktiert als Deins.
Jch hat geschrieben:Ich habe auf SPI 4 Draht umgebaut und die Anzeigezeit ist gleich geblieben. Die Bussignale habe ich noch nicht nachgemessen. Bilder folgen.
Übertragungsfehler kann man dann also erstmal ausschließen, zumindest gäbe ein anderer Bus auch andere Fehler.
Benutzeravatar
Zabex
Beiträge: 633
Registriert: Di 2. Jul 2013, 08:45
Wohnort: Aldenhoven
Kontaktdaten:

Re: Wasserlauf mit Atmega328 steuern

Beitrag von Zabex »

Mit EA-Displays hatte ich mal Probleme, sobald die Verbindung von Prozessor zum Display länger war als 10cm. Das Fehlerbild passt nicht ganz zu deinem Problem, aber vielleicht ist dieser Hinweis trotzdem nützlich. Kürze also ggf. mal die Leitungen.

Gruß,
Zabex
Benutzeravatar
Jch
Beiträge: 216
Registriert: Do 2. Jul 2015, 22:14

Re: Wasserlauf mit Atmega328 steuern

Beitrag von Jch »

Also, ich habe mal den Support von EA gefragt ob ich da einfach auf Pin 29 meine 14,3V anlegen darf. Mal schauen ob die Antworten.

@ Zabex. Ich hatte die Drähte schonmal auf ca 5cm gekürzt, sodass Arduino und Display direkt benachbart waren. Hat auch nix gebracht. Und SPI ist auch nicht erfolgreicher.


Ich habe nun das Programm aufs Minimum gekürzt und folgendes Festgestellt:

Code: Alles auswählen

#include "U8glib.h"
U8GLIB_UC1611_DOGM240 u8g(13, 11, 10, 9);  // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
void setup() {}
void loop()
{
  u8g.begin();
  delay(500);
}

Alle 500ms versucht es einen Neustart der Ladungspumpe hinzubekommen.
Kuerzestes Programm.jpg
Benutzeravatar
Jch
Beiträge: 216
Registriert: Do 2. Jul 2015, 22:14

Re: Wasserlauf mit Atmega328 steuern

Beitrag von Jch »

Hallo,
Ich hab jetzt ein Evaluierungsboard von Pollin und den AVRISP mkII mit AVR Studio4.

Jetzt könnte ich ja auch die Initialisierungsdateien vom Hersteller nutzen oder? Initialisierungsbeispiel für DOGL240-6
Also komplett ohne U8glib. Nur um die Ladungspumpe zu testen.
Muss ich da was beachten wegen dem R8C25? Irgendwas auskommentieren oder so?

Warum gibt es jeweils eine main.c, main.h, LCD_SPI.c und LCD_SPI.h??

Ich hab mal alle 4 Datein zum AVR Studio hinzugefügt, dass ich die inkludieren kann.
Leider fehlt mir der Faden.

Grüße
Benutzeravatar
Nicki
Beiträge: 3128
Registriert: So 11. Aug 2013, 20:16
Wohnort: wo Mosel und Rhein sich treffen

Re: Wasserlauf mit Atmega328 steuern

Beitrag von Nicki »

Jch hat geschrieben: Warum gibt es jeweils eine main.c, main.h, LCD_SPI.c und LCD_SPI.h??
Damit du sie austauschen kannst, ohne alles neu schreiben zu müssen.
Name vergessen
Beiträge: 3261
Registriert: Mo 12. Aug 2013, 19:47

Re: Wasserlauf mit Atmega328 steuern

Beitrag von Name vergessen »

Naja, komplett vergessen mußt Du das nicht, aber das ist ein völlig anderer Prozessor, und ich hab jetzt auf die Schnelle nicht gefunden, wie in AVR Studio 4 der passende Include wäre. Denn allermindestens müßtest Du statt
#include "sfr_r825.h"
irgendwas avr-spezifisches inkludieren, aber AVRs scheinen eher Einzeldateien zu haben; leider dürfte das für den AVR passende Beispiel (EA DOGM128-6) ziemlich stark von Deinem Display abweichen und daher ebenfalls wenig nützen. Und da ich diese Displays nicht kenne, kann ich da auch kaum bei helfen. Evtl. hat ja hier jemand schon mit den Teilen Erfolg gehabt und kann jetzt, wo Du nicht mehr auf die Lib angewiesen bist, Minimalcode posten.

@ 4 Dateien: Nicki hat schon Recht; leider trägt diese Modularisierung zur Komplexität bei, weil man sich im Prinzip dauernd durch die Dateien klicken muß, um den Überblick zu bekommen. Bei so einem kleinen Projekt ist es zudem unnötig, bei größeren Projekten macht es aber schon Sinn, nicht alles in einer kilometerlangen Datei zu haben, da findet man die Sachen sonst noch schlechter wieder. Hat auch den Vorteil, daß man nicht immer alles neu kompilieren muß, das kann bei langen Dateien durchaus lange dauern.
Benutzeravatar
Jch
Beiträge: 216
Registriert: Do 2. Jul 2015, 22:14

Re: Wasserlauf mit Atmega328 steuern

Beitrag von Jch »

Hallo,
die Frage nach den 4 Datein war etwas ungünstig formuliert. Ich kenne es nur so, dass es eine main.c Datei gibt, aber keine .c Dateien.

Das #include "sfr_r825.h" und #include "timer.h" wurden durch AVR spezifische #include <avr/io.h> und #include <util/delay.h> ersetzt.

Der Code sollte hoffentlich passen, da dieser doch für genau mein Display DOGM240-6 gemacht ist. Eventuell hast Du die Falsche Datei angeklickt.
Da es aber für den anderen Prozessor geschrieben ist muss ich die Pins ändern. Ich habe das wie folgend verdrahtet.

Funktion vom Display=Pin am ATmega
SI=PB5(MOSI)
CLK=PB7(SCK)
CS=PB4(SS) ist ja das gleiche, aber mit anderem Namen
CD=PB3 müsste ja frei vergebbar sein oder? Die alternative Funktion wird ja da nicht gebraucht
RES=PB2 müsste ja auch frei vergebbar sein.

In der lcd_spi.h ist dann der jeweilige PIN definiert. Hier der alte Zustand für den R8C25 Prozessor

Code: Alles auswählen

#define SI		p1_4
#define[b] dd[/b]SI	pd1_4
#define SCLK	p1_6
#define [b]dd[/b]SCLK	pd1_6
#define CS		p3_3
#define ddCS	pd3_3
#define CD		p6_3
#define ddCD	pd6_3
#define RES		p1_5
#define ddRES	pd1_5
Das wollte ich nun ändern, aber was hat es mit dem dd vor SI, CLK usw auf sich? In einem Kommentar vor der Initialisierung in der lcd_spi.c heisst es (dd-> datadirection register; 1 output, 0 input)

Dann wollte ich das auf meinen ATmega ändern:

Code: Alles auswählen

#define SI		PORTB.PIN5            // passt das so und was mache ich in der nächsten Zeile bei ddSI???
#define ddSI	pd1_4
#define SCLK	p1_6
#define ddSCLK	pd1_6
#define CS		p3_3
#define ddCS	pd3_3
#define CD		p6_3
#define ddCD	pd6_3
#define RES		p1_5
#define ddRES	pd1_5

Muss ich sonst noch etwas ändern? Mir ist beim durchschauen nichts weiteres aufgefallen außer die Taktfrequenz. Aber da kann ich doch einfach die 20MHz durch meine jetzigen 16MHz ersetzen oder?


Leider findet Google NIEMANDEN der im Netz zugibt, dass er solch ein Display besitzt bzw zum laufen gebracht hat.

Das Display hat ja eine Betriebsspannung von 2,7 bis 3.3V. Die Ausgänge des µC haben 5V. Ist das eigentlich schlimm? Ist das Display für diese Ausgangsspannung der BUS-Pins vom µC ausgelegt?
Anse
Beiträge: 2307
Registriert: Mo 12. Aug 2013, 21:30
Wohnort: Bühl (Baden)

Re: Wasserlauf mit Atmega328 steuern

Beitrag von Anse »

Jch hat geschrieben:Das Display hat ja eine Betriebsspannung von 2,7 bis 3.3V. Die Ausgänge des µC haben 5V. Ist das eigentlich schlimm? Ist das Display für diese Ausgangsspannung der BUS-Pins vom µC ausgelegt?
Wenn in dem Dabla was steht von Eingänge sind 5V tolerant dann geht das schon wenn nicht, dann halt nicht.

Könntest Du mal den geänderten C Code posten? dd heißt beim AVR DDRx. Für x den Port eintragen. z.B DDRB.
Benutzeravatar
Jch
Beiträge: 216
Registriert: Do 2. Jul 2015, 22:14

Re: Wasserlauf mit Atmega328 steuern

Beitrag von Jch »

Anse hat geschrieben:Wenn in dem Dabla was steht von Eingänge sind 5V tolerant dann geht das schon wenn nicht, dann halt nicht.
Fuck. Im Dabla heisst es Maximum Digital Input Voltage: VDD+0,5V und mein VDD ist 3,3V
Anse hat geschrieben:dd heißt beim AVR DDRx. Für x den Port eintragen. z.B DDRB.
Das weiss ich, aber leider nicht wie ich damit umgehen soll. Dass man mit DDRB = 0b00000001 Pin0 als Ausgang definiert weiss ich, aber nicht wie ich das bei der PIN deklaration das hinschreiben soll.

Meine änderungen habe ich mit //***** markiert.

Code: Alles auswählen

//-----------------------------------------------------
//File: lcd_spi.h
//Auth: ELECTRONIC ASSEMBLY JM
//DATE: 05-13-2014
//-----------------------------------------------------
#ifndef LCDSPI_H
#define LCDSPI_H

//#define LED1 PORTC.PIN6
//--- Port definitions ---
#define SI		PORTB.PIN5 //****** Darum habe ich gefragt. da stand vorher "p1_4" und das wollte ich nun auf meinen AVR ändern. Wenn ich es richtig verstehe,
//wird da der Pin 5 vom Port B mit dem "Namen" SI benannt, sodass man im späteren Programmablauf nicht mehr PORTB:PIN5 schreiben muss sondern nur noch SI oder?
#define ddSI	pd1_4         // Und warum wird hier p[b]d[/b]1_4 benutzt. Ich habe dazu auf die schnelle im Netz nix gefunden? Das ganze müsste ich auch für die //nächsten 8 Zeilen ändern, weiss aber nicht so recht wie ich das machen soll.
#define SCLK	p1_6
#define ddSCLK	pd1_6
#define CS		p3_3
#define ddCS	pd3_3
#define CD		p6_3
#define ddCD	pd6_3
#define RES		p1_5
#define ddRES	pd1_5


//--- Standard definitions for LCD UC1611S---
#define TOPVIEW		0x04
//#define BOTTOMVIEW	0x02   ****Da habe ich eins auskommentiert, da das Display sonst nicht weiss in welcher Ausrichtung, dass es betrieben wird.
	

void LCD_init(unsigned char contrast, unsigned char view);

void LCD_contrast	(unsigned char contr);
void LCD_view		(unsigned char view);

void LCD_position(unsigned char column, unsigned char page);
void LCD_clear	(void);
void LCD_string	(unsigned char column, unsigned char page, unsigned char *str);

void LCD_command	(char cmd);
void LCD_data		(char *data, unsigned int len);

#endif

Code: Alles auswählen

//-----------------------------------------------------
//File: main.h
//Auth: ELECTRONIC ASSEMBLY JM
//DATE: 08-07-2012
//-----------------------------------------------------
#ifndef MAIN_H
#define MAIN_H

void main(void);

void externClock (void);

#endif

Code: Alles auswählen

//-----------------------------------------------------
//File: main.c
//Auth: ELECTRONIC ASSEMBLY JM
//DATE: 08-28-2013
//-----------------------------------------------------

/*used microcontroller:
Renesas R8C25 with 20MHz external clock to DOGXL240-7 (UC1611C) ***** Falscher µC
UC1611S EA DOGM240-6 (240x64 dots)
Connection 4 Wire 8-Bit SPI Mode
Display is initialized, cleared and a short String is shown.
CD-Line is idle high -> write data; to send commands set this line to low

uC-Pin(R8C)	Disp-Pin	      Function             ATmega-PIN                *************neue PINBELEGUNG
10 (VSS)	        31		  	GND                  11
12 (VCC)	        30		  	VDD (3.3V)        10
24 (p1_4)	        39		 	SI                     6 PB5(MOSI)
23 (p1_6)	        38	 	 	CLK                  8 PB7(SCK)
 3 (p3_3)	         36  		        CS                    5 PB4(SS)
37 (p6_3)	        34		  	CD                    4 PB3
23 (p1_5)	        37	 	 	RES                   3 PB2

*/

//---Includes---
#define F_CPU 16000000UL    //******meine Prozessorgeschwindigkeit
//#include "sfr_r825.h           "******vermutlich nur für R8C
#include "main.h"
//#include "timer.h"              ****vermutlich nur für R8C
#include "lcd_spi.h"

#include <avr/io.h>          //****AVR LIB
#include <util/delay.h>     //****AVR LIB

//definitions


//--- module global varibles ---

//-----------------------------------------------------
//Func: main()
//Desc: main function with main loop, show a sample screen
//-----------------------------------------------------
void main(void)
{
	unsigned char len, data;
	externClock();
	initTimerRA();
	asm("FSET I");	//Interrupt enable

	
	LCD_init(0xB7, BOTTOMVIEW); 	//init display with contrast 0x8F standard value
	
	LCD_string(63,0,"ELECTRONIC ASSEMBLY");
	LCD_string(0,2,"EA DOGM240-6");
	LCD_string(0,3,"- 240x64 dots");
	LCD_string(0,4,"- Controller UC1611S");	

	LCD_string(0,6,"Tel:    +49(0)8105/77 80 90");
	LCD_string(0,7,"E-Mail: technik@lcd-module.de");

	
	while(1)
	{
		
	}

}

//-----------------------------------------------------
//Func: externClock()
//Desc: switch to external clock no devision (20MHz)*************Hab 16MHZ
//-----------------------------------------------------
void externClock (void)
{
	asm("FCLR I");	//Interrupt disable

	prcr = 1;		//Protect off

	cm13 = 1;		//Xin Xout
	cm15 = 1;		//XCIN-XCOUT drive capacity select bit : HIGH
	cm05 = 0;		//Xin on
	cm16 = 0;		//Main clock = No division mode 20MHz              *************Da muss ich doch nichts ändern außer den Kommentar auf 16Mhz
	cm17 = 0;		//Main clock = No division mode
	cm06 = 0;		//CM16 and CM17 enable

	//Waitting for stable of oscillation
	asm("nop");
	asm("nop");
	asm("nop");
	asm("nop");

	ocd2 = 0;		//Main clock change

	prcr = 0;		//Protect on
}

Code: Alles auswählen

//-----------------------------------------------------
//File: lcd_spi.c
//Auth: ELECTRONIC ASSEMBLY JM
//DATE: 05-13-2014
//-----------------------------------------------------


//---Includes---
//#include "sfr_r825.h" //Port definitions for R8C25 microcontroller             "******vermutlich nur für R8C
//#include "timer.h"    //Delay_ms function                                                 "******vermutlich nur für R8C

#include <avr/io.h>          //****AVR LIB
#include <util/delay.h>     //****AVR LIB
#include "lcd_spi.h"
#include "font_6x8.h"


//--- module global varibles and functions ---
static void   SPI_put 		(unsigned char byte);

//-----------------------------------------------------
//Func: LCD_init()
//Desc: inits Display and SPI-interface
//-----------------------------------------------------
void LCD_init(unsigned char contrast, unsigned char view)
{
	unsigned char i;

//----------Microcontroller specific initialisation----------
//Please adopt to your system
	//Port init (dd -> datadirection register; 1 output, 0 input)   ***********Hier ist mein Problem aus dem letzten Beitrag wieder zu finden. Kann mir das jemand erklären?
        //***** Was ist der unterscheid zwischen SI und ddSI? Wird ja anscheinend alles als Ausgang deklariert.
	SI = 1;
	ddSI = 1;
	SCLK = 1;
	ddSCLK = 1;
	CS = 1;
	ddCS = 1;
	CD = 1;
	ddCD = 1;
	RES = 1;
	ddRES = 1;

	//SPI mode: rising edge, MSB first, clock idle high
	u0mr = 0x01; //synchronous serial mode, internal clock, 1 stop bit, no parity
	 u0c0 = 0x80; //f1, CMOS output, rising edge, MSB first
	u0c1 = 0x13; //enable trans, disable rec, dis cont rec
//	u0brg = 0x81; //baud: 1200 u0brg = (f/(BitRate x 16)-1; f= 20MHz/8 -->u0c0 f8
	u0brg = 0x0A; //baud: 115200 u0brg = (f/(BitRate x 16)-1; f= 20MHz/1 -->u0c0 f1    //************was muss ich da ändern?


//----------Display specific initialisation----------
	//Perform a display reset
	RES = 0;
	Delay_ms(2);
	RES=1;
	Delay_ms(150);

	//init Display
	LCD_command(0xF1); //last COM electrode
	LCD_command(0x3F); //64-1 = 63
	LCD_command(0xF2); //Display start line
	LCD_command(0x00); //0
	LCD_command(0xF3); //Display end line
	LCD_command(0x3F); //0
	
	LCD_contrast(contrast);
	LCD_view(view);
	
	LCD_command(0xA3); //9.4K per second line rate
	LCD_command(0xE9); //Bias ratio to 10
	LCD_command(0xA9); //Enable Display
	LCD_command(0xD1); //in Black and white mode

	LCD_clear();
}

//-----------------------------------------------------
//Func: LCD_contrast
//Desc: Sets contrast 0..255
//-----------------------------------------------------
void LCD_contrast(unsigned char contr)
{
	LCD_command(0x81); //Set Contrast
	LCD_command(contr); //Standard value
}

//-----------------------------------------------------
//Func: LCD_view
//Desc: view bottom view(0x02), top view (0x04)
//-----------------------------------------------------
void LCD_view(unsigned char view)
{
	LCD_command(0xC0);
	LCD_command(view);
}

//-----------------------------------------------------
//Func: LCD_position
//Desc: set column (0..239) and page (0..15) adress in display
//-----------------------------------------------------
void LCD_position(unsigned char column, unsigned char page)
{
	LCD_command(0x10 + (column>>4)); 	//MSB adress column
	LCD_command(0x00 + (column&0x0F));	//LSB adress column
	LCD_command(0x70); 					//MSB adress page
	LCD_command(0x60 + (page&0x0F)); 	//LSB adress page	
}

//-----------------------------------------------------
//Func: LCD_clear
//Desc: clear display ram
//-----------------------------------------------------
void LCD_clear (void)
{
	unsigned int i=240*8; //column * pages

	LCD_position(0,0);
	
	CD = 1;
	CS = 0;	
	while(i--)
		SPI_put(0x00);
	CS = 1;

}

//-----------------------------------------------------
//Func: LCD_string
//Desc: shows ascii character on screen
//-----------------------------------------------------
void LCD_string(unsigned char column, unsigned char page, unsigned char *str)
{
	unsigned int pos_array;
	
	LCD_position(column, page);
	
	while(*str != 0)
	{	
		//calculate positon of ascii character in font array
		//bytes for header + (ascii - startcode) * bytes pro char)
		pos_array = 8 + (unsigned int)(*str++ - font_6x8[2]) * font_6x8[7];
	
		LCD_data(&font_6x8[pos_array], font_6x8[4]); //Argument 1: Data to send; Argument 2: len = width of char
	}
}

//-----------------------------------------------------
//Func: LCD_command(instruction)
//Desc: sends instruction to display
//-----------------------------------------------------
void LCD_command(char cmd)
{
	CD = 0;
	CS = 0;
	SPI_put(cmd);
	CS = 1;
}

//-----------------------------------------------------
//Func: LCD_data(data)
//Desc: sends data to display
//-----------------------------------------------------
void LCD_data(char *data, unsigned int len)
{
	CD = 1;
	CS = 0;
	while(len--)
		SPI_put(*data++);
	CS = 1;
}

//-----------------------------------------------------
//Func: SPI_put()
//Desc: waits till data is sent over the spi interface
//-----------------------------------------------------
static void SPI_put (unsigned char byte)
{
	u0tb = byte;
	while(ti_u0c1 == 0);
	while(txept_u0c0 == 0);
}
Anse
Beiträge: 2307
Registriert: Mo 12. Aug 2013, 21:30
Wohnort: Bühl (Baden)

Re: Wasserlauf mit Atmega328 steuern

Beitrag von Anse »

Hab Dir jetzt mal ein geändertes Programm als ZIP angehängt.
font_6x8.h <---Diese Datei muss noch in den Ordner. Vielleicht weißt Du wo her Du sie bekommst.
Das SPI Interface hab ich auf AVR Umgeschrieben. Muss nicht stimmen. Kann es gerade nicht testen. Die Pin Nr. hab ich von dir übernommen. Bitte prüfen:
SET= Bit setzen, CLE= Bit löschen.

Code: Alles auswählen

#define SETSI             PORTB|=(1<<5);//PORTB.PIN5 //****** Darum habe ich gefragt. da stand vorher "p1_4" und das wollte ich nun auf meinen AVR ändern. Wenn ich es richtig verstehe,                 //wird da der Pin 5 vom Port B mit dem "Namen" SI benannt, sodass man im späteren Programmablauf nicht mehr PORTB:PIN5 schreiben muss sondern nur noch SI oder?
#define CLESI             PORTB&=~(1<<5);

#define SETddSI           DDRB|=(1<<5);    //pd1_4         // Und warum wird hier p[b]d[/b]1_4 benutzt. Ich habe dazu auf die schnelle im Netz nix gefunden? Das ganze müsste ich auch für die //nächsten 8 Zeilen ändern, weiss aber nicht so recht wie ich das machen soll.
#define CLEddSI           DDRB&=~(1<<5);

#define SETSCLK           PORTB|=(1<<7);//p1_6
#define CLESCLK           PORTB&=~(1<<7);//p1_6

#define SETddSCLK         DDRB|=(1<<7);//pd1_6
#define CLEddSCLK         DDRB&=~(1<<7);//pd1_6

#define SETCS             PORTB|=(1<<4);      //p3_3
#define CLECS             PORTB&=~(1<<4);      //p3_3

#define SETddCS           DDRB|=(1<<4);//pd3_3
#define CLEddCS           DDRB&=~(1<<4);//pd3_3

#define SETCD             PORTB|=(1<<3);      //p6_3
#define CLECD             PORTB&=~(1<<3);      //p6_3

#define SETddCD           DDRB|=(1<<3);   //pd6_3
#define CLEddCD           DDRB&=~(1<<3);   //pd6_3

#define SETRES            PORTB|=(1<<2);     // p1_5
#define CLERES            PORTB&=~(1<<2);     // p1_5

#define SETddRES          DDRB|=(1<<2);   //pd1_5
#define CLEddRES          DDRB&=~(1<<2);   //pd1_5
[Edit]:Fehler im Code behoben
Dateianhänge
LCD_test.zip
(4.9 KiB) 60-mal heruntergeladen
Zuletzt geändert von Anse am Sa 19. Sep 2015, 18:45, insgesamt 1-mal geändert.
Benutzeravatar
xoexlepox
Beiträge: 4815
Registriert: So 11. Aug 2013, 19:28
Wohnort: So etwa in der Mitte

Re: Wasserlauf mit Atmega328 steuern

Beitrag von xoexlepox »

Dir ist aber klar, daß du mit "|=" Bits nur auf 1 setzen kannst? Zum Setzen auf 0 brauchst du "&=~".
Anse
Beiträge: 2307
Registriert: Mo 12. Aug 2013, 21:30
Wohnort: Bühl (Baden)

Re: Wasserlauf mit Atmega328 steuern

Beitrag von Anse »

xoexlepox hat geschrieben:Dir ist aber klar, daß du mit "|=" Bits nur auf 1 setzen kannst? Zum Setzen auf 0 brauchst du "&=~".
Danke war ein Denkfehler. Ist mir natürlich klar ;)
Benutzeravatar
Jch
Beiträge: 216
Registriert: Do 2. Jul 2015, 22:14

Re: Wasserlauf mit Atmega328 steuern

Beitrag von Jch »

Schonmal ein dickes fettes DANKE!!

Hast du bei deinem Edit mehr geändert als die Zeilen von
#define SETSI PORTB|=(1<<5);
bis
#define CLEddRES DDRB&=~(1<<2); //pd1_5
??

Ich habe die Dateien nämlich schon vor deinem Edit runtergeladen und im Programm eingebunden.

Ich habe noch die Datei LCD_test.c in main.c umbenannt.

Die font_6x8 Datei habe ich von Electronic Assembly aus dem Netz geladen. Müsste hoffentlich kompatibel sein.

Natürlich hat das Compilieren nicht geklappt und ich google schon seit Stunden. Scheint ein Fehler mit den .o Objektdateinen zu sein.
Build started 19.9.2015 at 20:04:09
make: *** No rule to make target `../../../../Vorm', needed by `lcd_spi.o'. Stop.
Build failed with 1 errors and 0 warnings...
bevor ich dein Edit übernommen habe standen ober halb von make:***... noch 2 weitere Zeilen.

Was hat es mit diesem Vorm auf sich? Wie beseitige ich die nichtsaussagende Fehlermeldung?
Anse
Beiträge: 2307
Registriert: Mo 12. Aug 2013, 21:30
Wohnort: Bühl (Baden)

Re: Wasserlauf mit Atmega328 steuern

Beitrag von Anse »

Jch hat geschrieben:Hast du bei deinem Edit mehr geändert
Ja, nehm den Code aus der zip Datei, ich hab ihn neu hochgeladen.

Welchen Compiler verwendest Du?
Benutzeravatar
Jch
Beiträge: 216
Registriert: Do 2. Jul 2015, 22:14

Re: Wasserlauf mit Atmega328 steuern

Beitrag von Jch »

rm -rf lcd_spi.o main.o Display_SPI_C.elf dep/* Display_SPI_C.hex Display_SPI_C.eep Display_SPI_C.lss Display_SPI_C.map
Build succeeded with 0 Warnings...
make: *** No rule to make target `..//C/Users/Jan/Desktop/Neuer', needed by `lcd_spi.o'. Stop.
Build failed with 1 errors and 0 warnings...
OK, habe nochmal alles getauscht.
Jetzt habe ich wider die gleiche Liste wie vor dem Edit.

Compiler ist der GNU AVRgcc
Anse
Beiträge: 2307
Registriert: Mo 12. Aug 2013, 21:30
Wohnort: Bühl (Baden)

Re: Wasserlauf mit Atmega328 steuern

Beitrag von Anse »

Lege mal ein neues Projekt an.
Benutzeravatar
Jch
Beiträge: 216
Registriert: Do 2. Jul 2015, 22:14

Re: Wasserlauf mit Atmega328 steuern

Beitrag von Jch »

OK, neues Projekt anlegen war erfolgreich.
Build started 19.9.2015 at 23:39:44
avr-gcc -mmcu=atmega32 -Wall -gdwarf-2 -std=gnu99 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT DisplaySPI2.o -MF dep/DisplaySPI2.o.d -c ../DisplaySPI2.c
avr-gcc -mmcu=atmega32 -Wall -gdwarf-2 -std=gnu99 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT lcd_spi.o -MF dep/lcd_spi.o.d -c ../lcd_spi.c
In file included from ../lcd_spi.c:13:
c:/winavr-20100110/lib/gcc/../../avr/include/util/delay.h:85:3: warning: #warning "F_CPU not defined for <util/delay.h>"
../lcd_spi.c: In function 'LCD_init':
../lcd_spi.c:27: warning: unused variable 'i'
../lcd_spi.c: In function 'LCD_string':
../lcd_spi.c:152: warning: pointer targets in passing argument 1 of 'LCD_data' differ in signedness
../lcd_spi.c: In function 'SPI_put':
../lcd_spi.c:189: warning: unused variable 'foo'
../lcd_spi.c: At top level:
../font_6x8.h:261: warning: 'ptr_font_6x8' defined but not used
avr-gcc -mmcu=atmega32 -Wall -gdwarf-2 -std=gnu99 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT main.o -MF dep/main.o.d -c ../main.c
../main.c: In function 'main':
../main.c:57: warning: pointer targets in passing argument 3 of 'LCD_string' differ in signedness
../main.c:58: warning: pointer targets in passing argument 3 of 'LCD_string' differ in signedness
../main.c:59: warning: pointer targets in passing argument 3 of 'LCD_string' differ in signedness
../main.c:60: warning: pointer targets in passing argument 3 of 'LCD_string' differ in signedness
../main.c:62: warning: pointer targets in passing argument 3 of 'LCD_string' differ in signedness
../main.c:63: warning: pointer targets in passing argument 3 of 'LCD_string' differ in signedness
../main.c:49: warning: unused variable 'data'
../main.c:49: warning: unused variable 'len'
avr-gcc -mmcu=atmega32 -Wl,-Map=DisplaySPI2.map DisplaySPI2.o lcd_spi.o main.o -o DisplaySPI2.elf
avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature DisplaySPI2.elf DisplaySPI2.hex
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 --no-change-warnings -O ihex DisplaySPI2.elf DisplaySPI2.eep || exit 0
avr-objdump -h -S DisplaySPI2.elf > DisplaySPI2.lss

AVR Memory Usage
----------------
Device: atmega32

Program: 2080 bytes (6.3% Full)
(.text + .data + .bootloader)

Data: 1478 bytes (72.2% Full)
(.data + .bss + .noinit)

Build succeeded with 13 Warnings...
Leider wird gar kein einzigstes Bit gesendet. Egal auf welchem Pin ich messe.

Ich habe die Betriebsspannung vom µC auf ca. 3,2V reduziert.
Anse
Beiträge: 2307
Registriert: Mo 12. Aug 2013, 21:30
Wohnort: Bühl (Baden)

Re: Wasserlauf mit Atmega328 steuern

Beitrag von Anse »

Jch hat geschrieben:Leider wird gar kein einzigstes Bit gesendet. Egal auf welchem Pin ich messe.
Es wird auch nur ein mal was gesendet ganz am Anfang.
Der Pin SCK sollte danach auf Dauer high sein.
Wenn nicht schau dir mal im Dabla das Kapitel über das SPI Interface an. Wahrscheinlich hab ich was übersehen bei der Initialisierung.
Name vergessen
Beiträge: 3261
Registriert: Mo 12. Aug 2013, 19:47

Re: Wasserlauf mit Atmega328 steuern

Beitrag von Name vergessen »

Jch hat geschrieben:Leider wird gar kein einzigstes Bit gesendet. Egal auf welchem Pin ich messe.

Ich habe die Betriebsspannung vom µC auf ca. 3,2V reduziert.
Mit welcher Geschwindigkeit läuft der denn jetzt? Bei 3,3V geht der IIRC nur bis max. 8MHz, drüber nur mit >4,5V.

Hast Du mit der geänderten Spannung den alten Code nochmal getestet? Nicht, daß das Display sich aus Sicherheitsgründen abgeschaltet hat? An diese Spannungsschei*e hab ich gar nicht gedacht. :(
Benutzeravatar
Jch
Beiträge: 216
Registriert: Do 2. Jul 2015, 22:14

Re: Wasserlauf mit Atmega328 steuern

Beitrag von Jch »

Ans e hat geschrieben:Es wird auch nur ein mal was gesendet ganz am Anfang.
Es wird auch am Anfang nichts gesendet.
Name vergessen hat geschrieben:Mit welcher Geschwindigkeit läuft der denn jetzt? Bei 3,3V geht der IIRC nur bis max. 8MHz, drüber nur mit >4,5V.
Puh keine Ahnung. Ich ahbe die ISP Geschwindigkeit auf 16kHz eingestellt. Aber was ist IIRC? Finde im Netz auch nichts über die bezeichnung.
Name vergessen hat geschrieben:Hast Du mit der geänderten Spannung den alten Code nochmal getestet? Nicht, daß das Display sich aus Sicherheitsgründen abgeschaltet hat? An diese Spannungsschei*e hab ich gar nicht gedacht. :(
Ich habe nochmal das Arduino ausgepackt und versucht "Hello World" mit reduzierter Spannung auszugeben. Leider tut sich jetzt gar nichts mehr. Die Ladungspumpe springt nur ganz kurz an, sodass sie die 15V nichtmal aufbauen kann. Ich denke, dass das Display kaputt ist. Ich habe mehrere alte Programme getestet. SPI und I2C und bei beiden geht nichts.

Ich bin eh von Montag bis Mittwoch nicht zu Hause. Dann gehe ich das am Donnerstag nochmal in ruhe an weil ich gerade so gefrustet bin weil gar nichts geht. Und im AVR Studio mache ich jedesmal mehr Fehlermeldungen.
Benutzeravatar
Bauteiltöter
Beiträge: 254
Registriert: So 11. Aug 2013, 17:37

Re: Wasserlauf mit Atmega328 steuern

Beitrag von Bauteiltöter »

Jch hat geschrieben:

Code: Alles auswählen

../main.c:57: warning: pointer targets in passing argument 3 of 'LCD_string' differ in signedness
../main.c:58: warning: pointer targets in passing argument 3 of 'LCD_string' differ in signedness
../main.c:59: warning: pointer targets in passing argument 3 of 'LCD_string' differ in signedness
../main.c:60: warning: pointer targets in passing argument 3 of 'LCD_string' differ in signedness
../main.c:62: warning: pointer targets in passing argument 3 of 'LCD_string' differ in signedness
../main.c:63: warning: pointer targets in passing argument 3 of 'LCD_string' differ in signedness

Diese ganzen Warnungen kommen daher, das die Funktionssignator von LCD_string nicht stimmt.

Code: Alles auswählen

void LCD_string   (unsigned char column, unsigned char page, unsigned char *str);
Ein Zeichen ist immer vom Datentyp "char", nicht "unsigned char" und auch nicht "signed char". Einfach nur "char". Ob Zeichen jetzt Vorzeichenbehaftet sind oder nicht ist beim Programmieren egal, das interessiert nur den Compiler und der sucht sich schon das Richtige aus wenn man ihm sagt das es sich um ein Zeichen handelt (Datentyp "char").

Also:
  • "char" für Zeichen
  • "unsigned char" zum Rechnen im Bereich 0...255 (besser: "uint8_t")
  • "singed char" zum Rechnen im Bereich -128 ... +127 (besser: "int8_t")
und die Warnungen verschwinden.

Generell gilt: Warnungen immer beachten. Manchmal ist es ok wenn man eine Warnung ignoriert wie zum Beispiel
Jch hat geschrieben:

Code: Alles auswählen

../lcd_spi.c:189: warning: unused variable 'foo'
Jedoch darf man Warnungen nur Ignorieren, wenn man weiß warum sie auftauchen und was sie zu bedeuten haben. Eine Warnung die man nicht versteht darf man auf keinen Fall ignorieren, Warnungen werden vom Compiler generiert um zu Helfen, nicht um zu Ärgern. Oft machen sie auf Bugs aufmerksam. Daher rate ich auch immer dazu mit -Wall -Wextra zu Compilieren.
Name vergessen
Beiträge: 3261
Registriert: Mo 12. Aug 2013, 19:47

Re: Wasserlauf mit Atmega328 steuern

Beitrag von Name vergessen »

Hmm, also daß es kaputt ist, will ich noch nicht glauben. Immerhin lief (läuft?) es ja mit 5V "irgendwie", und es hat sich an dem Zustand ja auch nichts verschlechtert. Insofern glaube ich jetzt mal eher, daß Dein Problem die Kombination aus niedriger Spannung und hoher Taktfrequenz ist. Daß das ISP mit 16KHz läuft, ist dabei egal, denn im Normalbetrieb läuft der ganz sicher schneller.

Ich habe nur einen Arduino, und der hat einen 16 MHz Quarz drauf. Der würde also ganz sicher nicht mit 3,2V laufen. Und Deiner wohl auch nicht, also kann der weder irgendwas senden, noch das Display irgendwas ansteuern. Daß die Ladungspumpe kurz angeht, liegt wohl daran, daß das Display eine Änderung der Pegel bemerkt, oder einfach selber erst booten muß.

Also, erstmal ganz wichtig: Quarz auf maximal 8MHz ändern (alles drunter geht, sogar 32 KHz Uhrenquarze sollen funktionieren, halt nur laaaaaaaaangsam). Eventuelle Variablen im Programm müssen natürlich angepaßt werden. Erst, wenn die Frequenz der Spannung angepaßt ist, kannst Du überhaupt erst anfangen, irgendwas zu testen.

Wenn Du den Quarz nicht selbst aufgelötet oder viel Erfahrung mit dem Löten in durchkontaktierten Platinen hast, solltest Du das aber lieber lassen. Eine Alternative wäre, die Pegel des Busses anzupassen, dafür gibt es spezielle Pegelkonverter. Man kann das auch mit Transistoren und Widerständen machen, wird bei bidirektionalen Signalen aber etwas knifflig. Spannungsänderungen sind halt immer ganz großer Mist. :(

Das mit dem "IIRC" tut mir leid, das war kein Bezug auf Hard- oder Software, sondern nur das Akronym für "If I Remember Correctly". Erst jetzt fällt mir auf, daß das auch ein Register sein könnte, die ja sehr ähnliche Bezeichnungen haben. :)

@ Warnings: Bauteiltöter hat vollkommen Recht, Warnings sind keine Drohung oder Schikane, sondern gut gemeinte Hinweise auf Dinge, die zwar in der Programmiersprache zulässig, aber dafür bekannt sind, erheblich öfter Produkte von Fehlern zu sein als vom Programmierer gewollt. Auch ich stelle mir immer die maximal möglichen Warnings ein, und gebe erst dann Ruhe, wenn alle fort sind. (Daß Zeichen char sind, geht mir allerdings auch auf den Keks ^^).

BTW, "unbenutzte Variablen" sind genauso kritisch zu beäugen wie Vorzeichenänderungen, denn es deutet darauf hin, daß man an irgend einer Stelle entweder eine falsche Variable verwendet hat, oder sich durch Vererbung oder sonstige Sprachkonstrukte (implizite Deklarationen oder namespaces z.B.) eine zweite Variable erschaffen hat, die die erste überdeckt. Also brandgefährlich.

BTW: signedness- oder Typisierungswarnings einfach wegzucasten ist keine Lösung, damit wird dem Compiler nur der Mund verboten, der (potentielle) Fehler besteht aber weiter. C++ hat deshalb verschiedene Casts, die man ganz bewußt einsetzen muß, also darüber nachdenkt, was man tut, statt einfach reflexartig "(char *)" davorzukloppen. In Deinem Fall wäre die Verwendung von "static_cast <char *>" möglich. Wäre die Variable jetzt aber keine sinnvoll zu char* Konvertierbare (z.B. ein struct), könnte der Compiler immerhin einen Fehler melden, denn jetzt weiß er, daß Du was anderes meinst als Du geschrieben hast. Klar kann man auch ein struct so bauen und benutzen, daß ein gültiger String entsteht, aber irgendwer schrieb mal, "man kann auch mit einem Mikroskop Nägel einschlagen". Geht alles, kann mal nötig sein, wenn alle Stricke reißen, aber dann sollte man zumindest einen passenden Kommentar dranschreiben. :)
Anse
Beiträge: 2307
Registriert: Mo 12. Aug 2013, 21:30
Wohnort: Bühl (Baden)

Re: Wasserlauf mit Atmega328 steuern

Beitrag von Anse »

Die unused variable kommt übrigens von dieser Funktion

Code: Alles auswählen

static void SPI_put (unsigned char byte)
{
   SPDR = byte;
   while(!(SPSR&(1<<SPIF)));
  uint8_t foo=SPDR;//Dummy read um das SPIF Bit zurück zu setzen(Anse)
}
So wie ich das Datenblatt interpretiere muss um das SPIF Bit zurück gesetzt werden. Laut Datenblatt geht das durch einen Lesezugriff auf das SPI Datenregister.
Ob es auch wie üblich bei Interrupt flags geht eine 1 rein zu schreiben weiß ich jetzt nicht. vielleicht hängt das Programm sich auch in der Schleife auf und es kommt deshalb keine Daten raus.
Benutzeravatar
Jch
Beiträge: 216
Registriert: Do 2. Jul 2015, 22:14

Re: Wasserlauf mit Atmega328 steuern

Beitrag von Jch »

Jch hat geschrieben:Name vergessen hat geschrieben:
Mit welcher Geschwindigkeit läuft der denn jetzt? Bei 3,3V geht der IIRC nur bis max. 8MHz, drüber nur mit >4,5V.
Ich hatte standartmäßig:
interne Clock, 1 MHz, 6 Clock Cycles Start-Up Time, 64 ms additional Clock delay default eingestellt
Das heisst aber auch, dass das Programm so nicht laufen konnte, weil dieses warscheinlich auf 16Mhz eingestellt war
Bauteiltöter hat geschrieben:Ein Zeichen ist immer vom Datentyp "char", nicht "unsigned char" und auch nicht "signed char". Einfach nur "char". Ob Zeichen jetzt Vorzeichenbehaftet sind oder nicht ist beim Programmieren egal, das interessiert nur den Compiler und der sucht sich schon das Richtige aus wenn man ihm sagt das es sich um ein Zeichen handelt (Datentyp "char").

Also:

"char" für Zeichen
"unsigned char" zum Rechnen im Bereich 0...255 (besser: "uint8_t")
"singed char" zum Rechnen im Bereich -128 ... +127 (besser: "int8_t")

und die Warnungen verschwinden.

Ich weiss nicht wiso dass da unsigned und signed chars verwendet werden. Ich habe diesen Code ja nicht geschrieben, ich versuche nur, diesen zum laufen zu kriegen. (Was ich warscheinlich nichtmal bis Weinachten schaffe)

Habe ich irgendwo geschrieben, dass ich Warnungen ignoriere? Ich weiss schon, dass die nicht umsonst dastehen.

Was ist an -Wall -Wextra anders als am GCC? Ich vermute, dass wir in der Schule dann auch den GCC verwenden werden.
Name vergessen hat geschrieben:Hmm, also daß es kaputt ist, will ich noch nicht glauben. Immerhin lief (läuft?) es ja mit 5V "irgendwie",
Jetzt läuft es aber auch nicht an 5V vom Arduino. Die Ladungspumpe kommt gerade mal auf 6,5V für ein paar ms. Ohne Programm geht sie gerademal auf 1,8V, was warscheinlich nichts zu sagen hat.
Name vergessen hat geschrieben:Eine Alternative wäre, die Pegel des Busses anzupassen, dafür gibt es spezielle Pegelkonverter. Man kann das auch mit Transistoren und Widerständen machen, wird bei bidirektionalen Signalen aber etwas knifflig. Spannungsänderungen sind halt immer ganz großer Mist. :(
Warum kann ich nicht einfach die Betriebsspannung des µC reduzieren? ist das nicht der einfachste weg?
Name vergessen hat geschrieben:Erst, wenn die Frequenz der Spannung angepaßt ist, kannst Du überhaupt erst anfangen, irgendwas zu testen.
Woher weiss ich, dass es richtig angepasst ist?
Benutzeravatar
Fritzler
Beiträge: 12603
Registriert: So 11. Aug 2013, 19:42
Wohnort: D:/Berlin/Adlershof/Technologiepark
Kontaktdaten:

Re: Wasserlauf mit Atmega328 steuern

Beitrag von Fritzler »

uint8_t foo=SPDR;//Dummy read um das SPIF Bit zurück zu setzen(Anse)
dadrunter ein (void)foo; oder (void)&foo; und der Compiler hält die Klappe.
Name vergessen
Beiträge: 3261
Registriert: Mo 12. Aug 2013, 19:47

Re: Wasserlauf mit Atmega328 steuern

Beitrag von Name vergessen »

Jch hat geschrieben:
Name vergessen hat geschrieben:Eine Alternative wäre, die Pegel des Busses anzupassen, dafür gibt es spezielle Pegelkonverter. Man kann das auch mit Transistoren und Widerständen machen, wird bei bidirektionalen Signalen aber etwas knifflig. Spannungsänderungen sind halt immer ganz großer Mist. :(
Warum kann ich nicht einfach die Betriebsspannung des µC reduzieren? ist das nicht der einfachste weg?
Doch, klar, kann man. Ich bin halt von einem fertigen Board ausgegangen, und da sind halt Quarze drauf. Aber wo Du's schreibst fällt mir ein, daß man den RC-Oszillator ja auch benutzen kann, wenn außen ein Quarz dran ist, also ginge selbst das ohne zu Löten.
Jch hat geschrieben:
Name vergessen hat geschrieben:Erst, wenn die Frequenz der Spannung angepaßt ist, kannst Du überhaupt erst anfangen, irgendwas zu testen.
Woher weiss ich, dass es richtig angepasst ist?
Im Datenblatt des jeweiligen Prozessors steht, welche Frequenz bei welcher Betriebsspannung maximal möglich ist. Leider finde ich gerade nur das vom 48/88/168P:
ATmega48P/88P/168P: 0 - 10 MHz @ 2.7 - 5.5V, 0 - 20 MHz @ 4.5 - 5.5V

Also geht der erst ab 4,5V mit voller Geschwindigkeit. Wenn Du aber nur mit 1MHz fährst, dann paßt das in jedem Fall, war also nicht das Problem. :(
Jch hat geschrieben:Habe ich irgendwo geschrieben, dass ich Warnungen ignoriere? Ich weiss schon, dass die nicht umsonst dastehen.
OK, können wir aber nicht ahnen. Da Du ja offensichtlich gerade erst mit C angefangen hast, muß man davon ausgehen, daß Dir sowas ggfs. eben nicht unbedingt bewußt ist.
Zuletzt geändert von Name vergessen am So 20. Sep 2015, 18:29, insgesamt 1-mal geändert.
Benutzeravatar
Bauteiltöter
Beiträge: 254
Registriert: So 11. Aug 2013, 17:37

Re: Wasserlauf mit Atmega328 steuern

Beitrag von Bauteiltöter »

Jch hat geschrieben: Ich weiss nicht wiso dass da unsigned und signed chars verwendet werden. Ich habe diesen Code ja nicht geschrieben, ich versuche nur, diesen zum laufen zu kriegen. (Was ich warscheinlich nichtmal bis Weinachten schaffe)

Habe ich irgendwo geschrieben, dass ich Warnungen ignoriere? Ich weiss schon, dass die nicht umsonst dastehen.

Was ist an -Wall -Wextra anders als am GCC? Ich vermute, dass wir in der Schule dann auch den GCC verwenden werden.
Vermutlich hatte der Author selber zu wenig Ahnung - wer veröffentlicht bitte Code der nicht ohne Warnung compiliert?! aber gut. Wollte dir auch keinen Vorwurf machen sondern vor allem sagen wo das her kommt.

-Wall -Wextra sind Schalter für den GCC. -Wall hast du schon drinn, -Wextra nicht. -Wall aktiviert viele Warnungen (man kann jede Warnung getrennt ein/ausschalten), -Wextra aktiviert nochmal mehr Warnungen als -Wall (das "all" ist also Irreführend). -Pedantic müsste noch eine Stufe weiter gehen, -Wextra sollte aber eigentlich reichen.

Du musst also nicht den Compiler wechseln, nur in der IDE (oder im Makefile wenn du eins verwndest) -Wextra als Compilerparameter aufnehmen.
Benutzeravatar
Jch
Beiträge: 216
Registriert: Do 2. Jul 2015, 22:14

Re: Wasserlauf mit Atmega328 steuern

Beitrag von Jch »

Name vergessen hat geschrieben:OK, können wir aber nicht ahnen. Da Du ja offensichtlich gerade erst mit C angefangen hast, muß man davon ausgehen, daß Dir sowas ggfs. eben nicht unbedingt bewußt ist.
Ich habe schon ein Schuljahr C hinter mir. Da haben wir in C gerechnet, mit for-, while-, do-Schleifen gespielt, If, If else, arrays, links- und rechtsshift, mit ASCII spielen, arrays bzw. Deren Werte sortieren, eigene Funktionen mit und ohne Rückgabewerte, Prozotypen und deren Aufrufe.

Kann sein, dass ich was vergessen habe, aber es drehte sich alles um Konsolenprogramme. Dies lief alles in CodeBlocks ab und nicht im AVR Studio. Ich dachte am Anfang von dem Projekt, dass es einfacher wird.

Träumen an:
-Display mit Controller raussuchen (abgehakt)
-Bibliothek finden (check)
-Bibliothek auf meine Bedürfnisse anpassen (anscheinend Utopischer Gedanke)
-Alles zum laufen bringen (wenn Schweine fliegen können)
-restliche Hardware zusammenbauen. Also Stromüberwachung Pumpe, Helligkeitsüberwachung für die Beleuchtung, Spannungskontrolle der Batterie und Spannungsregelung für die Platine mit Mikrocontroller und Display (fast abgehakt)
-alles anbauen und Inbetriebnahme
Träumen aus.
Vermutlich hatte der Author selber zu wenig Ahnung - wer veröffentlicht bitte Code der nicht ohne Warnung compiliert?! 
Kommt auf den Code drauf an. Der Code vom Hersteller ist ja für einen ganz anderen Controller gemacht und wurde von Anse freundlicherweise überarbeitet.
Der U8glib Code sollte ja für 10000 Displays sein für AVR. Warum dass das nicht läuft ist mir ein rätsel.

Wenn jemand aus der nähe der schönen Fränkischen Schweiz kommt, könnten wir uns ja mal treffen

Wextra werde ich dann am Donnerstag suchen. Wall soll ja schon an sein.
Benutzeravatar
Jch
Beiträge: 216
Registriert: Do 2. Jul 2015, 22:14

Re: Wasserlauf mit Atmega328 steuern

Beitrag von Jch »

Das Problem hat sich erledigt. :D :D
Es war doch ein Softwarefehler. Dank Anse bin ich jetzt glücklich.

Der ATmega läuft nun mit 5V und neben meinem Display sind 5 Spannungsteiler, welche 3,1V produzieren für die Displayansteuerung.
:D
Benutzeravatar
ferdimh
Beiträge: 9429
Registriert: Fr 16. Aug 2013, 15:19

Re: Wasserlauf mit Atmega328 steuern

Beitrag von ferdimh »

Darf man erfahren, wo der Fehler lag? (Ich habe hier eifrig mitgelesen und keinen gefunden...)
Anse
Beiträge: 2307
Registriert: Mo 12. Aug 2013, 21:30
Wohnort: Bühl (Baden)

Re: Wasserlauf mit Atmega328 steuern

Beitrag von Anse »

Es war ein Software Problem. Das Beispielprogramm in C musste auf einen Atmega32 portiert werden. Blöd nur wenn man übersieht, das AVRs getrennte Adressräume haben. Einen Pointer im Flash kann halt nicht wie einer im RAM behandelt werden...
Benutzeravatar
Jch
Beiträge: 216
Registriert: Do 2. Jul 2015, 22:14

Re: Wasserlauf mit Atmega328 steuern

Beitrag von Jch »

Ich habe mal den PA0 als Analogeingang eingerichtet. Läuft auch so weit, dass er mir Werte zwischen 70 und 900 ausspuckt (die restlichen fehlenden Werte sind vermutlicht dem alten Trimmerpoti zu verdanken)

Ich wollte nun 5V auf den Aref Eingang als Referenzspannung legen, aber dann ist mir gekommen, dass die internen 2,56 V sinvoller sein könnten oder?

Ich benötige für die Shuntmessung meiner Pumpe (Nennstrom ca 950mA) eine Spannungsmessung an einem Analogeingang. Ich habe einen 0,1Ohm Widerstand hier liegen. Sprich ich habe ca 100mV Spannungsabfall an diesem Shunt.
Wenn ich mit 10 Bit messe, dann habe ich eine Auflösung von 2,5mV bei 2,56V Interner Referenzspannung. Somit hätte ich bei 100mV Spannungsabfall den ADC-Wert 40. Relativ gering oder?

Wenn ich den Gain x10 aktiviere und mit 8 Bit messe, dann hätte ich den ADC-Wert von 100. Ist ja schonmal besser oder?

Gibt es eine bessere Vatiante als den x10Gain um diesen geringen Spannungsabfall relativ genau zu messen?

Da ein Pumpenstrom von 700mA schon sehr viel Luft zieht (annähernd leerlauf) und ein Pumpenstrom von 1050mA Verstopfung im Schlauch bedeutet, sollte die Messung relativ genau sein.

Was würdet Ihr mir vorschlagen? Ein größerer Shuntwiderstand wäre sehr schade, da ich die Pumpenspannung möglichst nicht senken möchte.

Grüße
Antworten