PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Portbelegung auf ATMega für LCD1602



HeSt
09.12.2018, 12:24
Hallo allerseits,

ich möchte nun endlich mit der Verwendung eines Displays an einem Mega8 oder/und Mega16 beginnen.
Einige Beiträge habe ich ja schon gesichtet und studiert ... bin aber noch nicht ganz schlau daraus geworden ...
Nun meine Fragen:
Kann ich für einen 4-Bit-Betrieb des LCDs nur EINEN Port nutzen, wie es mir vorschwebt (siehe unten), oder muss ich Steuer- und Datenleitungen an getrennten Ports ausgeben?
Wenn getrennt, hilft mir ja eine 4-Bit-Anwendung nichts, da ich mit den anderen 4-Port-Pins nichts steuern kann, weil ja bei der Ausgabe (einem OUT PORTx,ldc_data) ALLE PINs des PORTs angesprochen werden und somit andere Funktionen mit angesteuert würden!?.

ZB (M16):
; PC0 / 22 > + Transitor VCC to LCD
; PC1 / 23 LCD RS (register select)
; PC2 / 24 LCD RW (read/write)
; PC3 / 25 LCD E (enable)
; PC4 / 26 \
; PC5 / 27 \ > Datalines for LCD 1602
; PC6 / 28 /
; PC7 / 29 /

Gruß Heinz

seite5
09.12.2018, 12:35
Geht auf jeden Fall, wenn Du Deinen Treiber selber schreibst. Falls nicht, sollte in der Beschreibung des Treibers oder im Header-File
ein Hinweis auf Beschränkungen in der Pinbelegung zu finden sein.
(Ich würde allerdings die Daten ins lower nipple legen, spart ein paar Befehle.)
mfg
Achim

HeSt
09.12.2018, 12:58
Geht auf jeden Fall, wenn Du Deinen Treiber selber schreibst. Falls nicht, sollte in der Beschreibung des Treibers oder im Header-File
ein Hinweis auf Beschränkungen in der Pinbelegung zu finden sein.
(Ich würde allerdings die Daten ins lower nipple legen, spart ein paar Befehle.)
mfg
Achim

Danke, Achim!
Da ich bzgl. Display absoluter Neuling bin, kannst dir vorstellen, wieviel ich über Treiber weiß ... und geschweige denn was von "selber schreiben" verstehe!

Somit verstehe ich es so, dass ich Steuer- und Datenleitungen nicht auf EIN Port legen kann (auch wenn ich für die Daten die L-nipples verwende).
Dann kann ich ja gleich bei der 8-Bit Version bleiben, da ich mit den H-nipples nichts "eigenes/anderes" anfangen kann.
Aber warum verwenden dann nahezu alle die 4er Version, weil sie Pins "sparen"!?
Wie bzw. wozu kann ich dann die anderen 4 Pins verwenden, wenn jedes Mal, wenn ich auf dem Port was ausgebe, außer den Pins für das LCD auch die anderen - nicht für das LCD bestimmten Pins - Werte enthalten? Die steuern ja dann diese Funktionen ohne es in diesem Moment zu wollen!
Da hab ich ein grundsätzliches Verständnisproblem!
mfg
Heinz

seite5
09.12.2018, 15:19
Nö, da hast Du mich falsch verstanden.
Da Du den Treiber nicht selber schreiben willst/kannst, brauchst Du also eine Bibliothek/Treiber. Da gibt's dann einen Header (*.h).
Dort wird über #defines festgelegt, welcher Pin des Controllers welche Display-bezogene Funktion übernimmt.
Vielleicht ist es einfacher, wenn Du mal ansagst, welche IDE Du verwendest.
---
Habe gerade mal auf github nach LCD1602 gesucht - dort ist von I2C-Interface die Rede - dann brauchst Du eh nur 2 Leitungen ...
https://github.com/bitbank2/LCD1602

mfg
Achim

HeSt
09.12.2018, 15:41
Hab auch noch ein wenig gesucht und hab das hier gefunden:

Anschluss an den Controller
Jetzt, da wir wissen, welche Anschlüsse das LCD benötigt, können wir das LCD mit dem Mikrocontroller verbinden:
Pinnummer
LCD Bezeichnung Anschluss
1 VSS GND (beim TC1602E: VCC)
2 VCC +5 V (beim TC1602E: Gnd)
3 VEE GND , Poti oder PWM am AVR
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

Da in obigem Beispiel auch nur ein Port für alle Leitungen zum LDC verwendet wird, hab ich meine Pinbelegung umgedreht:
; PC0 / 22 \
; PC1 / 23 \ > Datalines for LCD 1602
; PC2 / 24 /
; PC3 / 25 /
; PC4 / 26 > LCD RS (register select)
; PC5 / 27 > LCD RW (read/write)
; PC6 / 28 > LCD E (enable)
; PC7 / 29 > + Transitor VCC to LC

Somit müsste es funktionieren.

IDE!? Ich hab keine IDE. Zudem versteh ich nix von C (wo dein link hinführt). Ich programmiere in Assembler.
Auch wenn es so aussieht, dass ich mehr mit AVRs mache, weil ich seit 2008 im Forum bin ...
Ich hab bislang nur ganz kleine Sachen mit dem T13 gemacht, 3 kleine mit dem M8 und eine einfache Heizungssteuerung mit dem M16 (ohne LCD!).
Jetzt möchte ich mit einem M16 einen Solartracker bauen. Der soll mit LCD ausgestattet sein, damit man Parameter, die im EEProm abgelegt werden, jederzeit über LCD anzeigen und anpassen kann.

Wo ich auch noch grüble ist, wie ich ADC-Werte in Volt umrechne und diese mit zumindest einer Kommastelle ausgeben kann - in Assembler!
Wie man für die Ausgabe Ziffern in Text umwandelt hab ich schon gefunden - allerdings auch nur in C :(

Bis ins Frühjahr, wenn die Sonne wieder kräftiger wird, sollte meine Steuerung - zumindest AVR-mäßig - fertig sein.

mfg Heinz

HeSt
09.12.2018, 18:28
Also,
nach einer Unmenge an Recherchen, abwägen und vergleichen, bin ich zur Ansicht gekommen, dass meine ursprüngliche Pinbelegung des LCD-Ports ganz normal funktionieren muss. Also kein "Treiber" selbst geschrieben werden muss. Wichtig ist nur die Reihenfolge der nibbles.
Bitte um Berichtigung, wenn ich falsch liege!

In einem englisch-sprachigen Forum habe ich (bis auf die Steuerpins) die gleiche Pinbelegung gefunden.
In meinem Fall ganz wichtig: solange mit dem Display gearbeitet wird, MUSS der Pin für die Stromversorgung IMMER 1 sein.
Daher überlege ich gerade, ob ich nicht einen Pin eines anderen Ports dazu verwende, um nicht bei jeder LCD-Routine darauf achten zu müssen.
Somit bleibt dann halt ein LCD-Port-Pin am µC unbelegt.

[edit]
; PC0 / 22 > LCD RS (register select)
; PC1 / 23 > LCD RW (read/write)
; PC2 / 24 > LCD E (enable)
; PC3 / 25 n/c
; PC4 / 26 <> LCD DB4
; PC5 / 27 <> LCD DB5
; PC6 / 28 <> LCD DB6
; PC7 / 29 <> LCD DB7
[endedit]

seite5
10.12.2018, 10:41
Hallo HeSt,
letztendlich musst Du irgendeinen Mittler zwischen Deinem Programm und der Hardware schaffen, ob man das nun Treiber nennt oder Bibliothek oder ...
Alles in Assembler - Chapeau!
Auch mit einer IDE (ich nutze AS7.0) kann man alles in Assembler machen.
Ich hab bei solchen 4-bit-"Sachen" gern die zusammenhängenden Bits (i.d.F. die Daten) ganz "unten" (Bit 0 beginnend), spart Befehle und wenn Du eh alles
selber schreibst ist es sowieso egal.
mfg
Achim

HeSt
10.12.2018, 21:07
Hi Achim,
danke für den "Hut" ;)
Ich kenne nichts außer Assembler. Hab noch nie was mit IDE, Bibliotheken oder sonstigem was gemacht.
Weiß gar nicht, wie man damit umgeht und was man alles damit machen kann.
Ich lese immer wieder was von einer Bibliothek von Fleuri.
Was kann die, wozu dient sie ...?
Ich weiß nicht, wozu ich sie brauchen könnte. Hab etwas gestöbert, kann aber damit nix anfangen.
Sie muss jedoch hilfreich sein, weil sie viele nutzen. Ich bin nur noch nicht drauf gekommen.
Aber mal weiter sehen.
LG Heinz

wkrug
11.12.2018, 05:22
Ich weiß nicht, wozu ich sie brauchen könnte. Hab etwas gestöbert, kann aber damit nix anfangen.
So ein LCD kann eine relativ komplizierte Initialisierung benötigen, die dazu auch noch in einem gewissen Zeitfenster gemacht werden muss.
Ausserdem müssen bestimmte Grundeinstellungen gemacht werden.
Alle dafür benötigten Befehle sind dann in so einer Bibliothek enthalten.
Man braucht also eigentlich nur die gewünschte Funktion z.B. initlcd aufrufen und die Bibliothek initialisiert das Display, damit es verwendet werden kann.

Ohne solche Bibliotheken müsstest Du alles was zum Funktionieren des LCD's gebraucht wird selbst programmieren, stellenweise auf Bitebene.
Aber warum was selbst programmieren, wenn es so etwas bereits debuggt zum Download gibt?

HeSt
11.12.2018, 07:46
Danke für die Unterstützung!

Dass die Ansteuerung eines LCDs eine mühsame Sache ist, hab ich schon bemerkt.
Allerdings hab ich die Init-Sequenzen bereits programmiert. Ist gut beschrieben.

Als ich vor etwa 3 Jahren mit LCD anfangen wollte, hab mir den Schmöker "Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie" von Günter Schmitt gekauft (530 Seiten). Für mich leider nicht wirklich hilfreich, da er "UNI"-mäßig geschrieben ist und viel voraussetzt. Behandelt zwar auch etwas Basis, aber eben sehr wissenschaftlich. Und das ist mir zu hoch und zu umständlich.
Ich benötige kurze verständliche Beispiele. Zudem sind die Programmbeispiele sehr verschachtelt und greifen immer wieder auf irgendwelche Routinen aus Bibliotheken zu. Es ist einfach zu unübersichtlich und zu mühsam sich da durchzuarbeiten und es zu verstehen.
Ich finde z.B. nirgendwo einen Hinweis darauf, ob und wie man den "auto cursor" - also die automatische Weiterschaltung des Cursors - während einer Routine ab- und wieder einschalten kann.
In meinem Gedankengang brauche ich es dazu, wenn ich Ziffern verändern will.
Also z.B. einen 3-stellig Wert. Diesen will ich mit einer Taste verändern. Da es aber mühsam ist, sich z.B. von 50 auf 210 hoch zu tippen. Da ist es einfacher, immer nur eine Stelle (H,Z,E) verändern zu können. Dazu soll "auto cursor" off sein. Danach wieder ein. Ob das in diese Form sinnvoll ist, weiß ich noch nicht. Derzeit sieht es danach aus.

So gibt es noch viele Dinge, die ich erst finden und behirnen muss, wie das geht.
Z.B. wie man Ziffern und Zahlen in Text umwandelt, damit man diese auf dem LCD ausgeben kann. Einige Routinen hab ich gefunden, aber noch nicht kapiert.
Das braucht halt auch seine Zeit. Und wenn ich nicht weiß, wie die Routinen in den Bibliotheken ticken, wie Werte übergeben werden müssen usw. hab ich einfach ein Problem damit.
Wenn ich selber codiere, weiß ich wie was funktioniert - und vor allem - dann hab ich's kapiert.

HaWe
11.12.2018, 11:02
ich will dich ja nicht missionieren, aber gerade als asm Programmierer müsste doch C(99) ideal für dich sein: C wird ja oft als asm mit lesbareren Wrappern beschrieben, welches durch den C Compiler in Maschinencode übersetzt wird, der compiliertem asm Code ebenbürtig ist in Kompaktheit, Effizienz und Schnelligkeit.
Aber C ist ja noch viel mächtiger als asm:
Warum wird/wurde das Multiuser-Multitasking-Betriebssystem UNIX nicht weiterhin (wie anfangs versucht) in asm programmiert, und auch nicht in irgendeiner anderen damals verfügbaren Programmiersprache, sondern warum wurde eigens dafür zunächst C entwickelt, um mit diesem "Tool" dann das Unix OS effizient entwickeln zu können?
Vorteil: Plattformübergreifende Portierbarkeit, und gerade bei MCUs wie AVRs oder ARMs oder sogar auch SoCs: Millionen von Libs, die das Arbeiten damit simplifizieren, wenn man will - oder man erfindet für sich das Rad damit auf effiziente Weise neu, wenn man es so lieber möchte.

HeSt
11.12.2018, 11:12
Aber C ist ja noch viel mächtiger als asm
Du hast schon recht!
Tatsächlich ist es bei mir aber so, dass ich immer nur dann an diese "Käfer" denke, wenn Bedarf besteht. Eine Problemlösung, die mit µC am einfachsten bewerkstelligt werden kann.
Und das kommt bei mir sehr selten vor.
Ich will mir C (noch) nicht antun, nur weil ich mit LCD grad auf Neuland gestoßen bin. Es geht nurmehr ums Display - Anzeigen und Ändern von Parametern. Alles andere (die gesamte Steuerung des Solartrackers) ist bereits soweit fertig. Somit müsste ich das in C auch neu codieren.

HaWe
11.12.2018, 11:16
Somit müsste ich das in C auch neu codieren.
jein - ;)
du kannst in C sogar auch asm Code inkludieren 8)
Aber ich verstehe deinen Standpunkt ntl-
mir ging es als C-Hobbyprogrammierer genau so in Bezug auf C++ , doch auch da bin ich gerade dabei, mich zu "überwinden" :)

wkrug
11.12.2018, 11:30
Also z.B. einen 3-stellig Wert. Diesen will ich mit einer Taste verändern. Da es aber mühsam ist, sich z.B. von 50 auf 210 hoch zu tippen. Da ist es einfacher, immer nur eine Stelle (H,Z,E) verändern zu können. Dazu soll "auto cursor" off sein. Danach wieder ein. Ob das in diese Form sinnvoll ist, weiß ich noch nicht. Derzeit sieht es danach aus.
Ich halte diese Vorgehensweise nicht für Zielführend.
Mit den veränderten Werten willst Du ja sicher auch rechnen.
Also müssen die Zahlenwerte als Integer oder Float vorhanden sein.
Ich mach das immer so, das ich immer komplette Zeilen eines LCD beschreibe.
Ich bin auch der Meinung, das man komplexere Projekte eigentlich nur noch mit viel Aufwand in Assembler schreiben kann.
C ist da wirklich besser. Was mich am Anfang bei C immer gestört hat sind tatsächlich die Bibliotheken.
Gerade bei AVR - GCC ( ist im Prinzip in AVR Studio 7 implementiert ) ist das schon etwas Gerödel.
Um einen AVR mit Interrupts und direkten Flash und EEProm Zugriffen anzusprechen bindet man schon mal 4 Standard Bibliotheken ein.
Sind die dann aber mal eingebunden wird das Ganze dann sehr einfach.
Gut ist, das der Compiler von Studio 7 schon gleich meckert, was er denn für eine Library gerne hätte.
Ausserdem ist AVR - GCC im Internet super dokumentiert auch aus verschiedenen Quellen.
Ein weiterer " Schwachpunkt " von C ist, das Quasi jedes verfügbare Sonderzeichen der Tastatur für die Syntax genutzt wird.

Wenn man mal verstanden hat, das ein C-Compiler von oben nach unten arbeitet und keine defines bzw. Variablen benutzt werden können, die nicht vorher definiert wurden hat man schon viele potetielle Fehlerquellen ausgemerzt.

Fertige Bibliotheken für C gibt's da fast für jedes IC und jedes Display, das so ein Controller ansteuern kann.
Sogar eine FAT Library für SD Karten gibt's.

Ich hab als letztes Projekt gerade ein MiDi Clock Metronom mit Soundausgabe gebastelt.
Das Erstellen und Debuggen hat in C gerade mal 1 1/2 Tage gedauert. Das hätte Ich in Assembler nicht machen wollen.

Das Einbinden von Assembler Code in ein C-Programm ist nicht gerade trivial und auch stark vom verwendeten Compiler abhängig.
Ich hab früher immer mit CodeVision AVR gearbeitet. Da war die Assembler Einbindung und die Grundeinstellungen für den Controller relativ einfach.
Das Prog würde Ich als Einstieg in C durchaus empfehlen ( Version mit beschränkten Optionen ist kostenlos ) weil wesentlich einfacher zu handeln als AVR Studio.
Ich nutze heute noch den Automatic Programm Generator um die Grundeinstellungen für den verwendeten Chip zu generieren.
Den erzeugten Code kopiere Ich dann einfach in AVR - Studio.

Meine Empfehlung ist einfach mal ausprobieren und nicht von den ersten Hürden abschrecken lassen.

HeSt
11.12.2018, 11:47
Mit den veränderten Werten willst Du ja sicher auch rechnen.
Nein. Die Werte werden ins EEPROM gesichert und dienen nur als Vergleichswert für verschiedene Aufgaben.


Also müssen die Zahlenwerte als Integer oder Float vorhanden sein.
Ich mach das immer so, das ich immer komplette Zeilen eines LCD beschreibe.
Wie kann ich "Zahlen" in das LCD schreiben? Ein LCD kennt ja keine "Ziffern" oder "Zahlen". Das sind alles nur "Zeichen". Oder liege ich mit dieser Annahme falsch?

Moppi
11.12.2018, 11:51
Bei den Assemblern MASM und TASM konnte man schon immer gut Makros einsetzen. Damit kann man so einiges anstellen. Ich habe in den 90gern für jemanden Basic in Makros umgesetzt. Der Quelltext sah nachher aus wie GW-Basic, konnte aber assembliert werden. Allerdings waren das schon fortgeschrittene Assembler. Das C wurde ja bereits in den 70gern entwickelt. Das Problem an den Assemblern war immer, dass man damit nicht sehr schnell voran kam. Programmentwicklungen dauerten wirklich sehr lange. Von daher hatte C sicher seine Berechtigung. Mittlerweile halte ich persönlich C/C++ aber für etwas rückschrittlich. Wie Du ja selbst siehst HaWe, ist es manchmal echt schwierig damit und die Sprache ist "kryptisch" gestaltet - nicht wirklich einfach zu erlernen. Für jemanden, der auf einem System Assembler beherrscht, gibt es eigentlich nichts Besseres, weil man mit Assembler wirklich alles machen kann - keine Grenze. Da ich selber 10 Jahre fast nur Assembler benutzt habe, finde ich auch, dass es für jemanden der C nicht kann / C++, es einfacher ist, sich in die Assemblerprogrammierung - bei den ATmegas zum Beispiel - einzuarbeiten.

MfG

HaWe
11.12.2018, 12:17
asm halte ich für eine absolute Sackgasse, aber jedem Tierchen sein Plaisierchen ... :roll:

... dennoch, wenn du C schon als "rückschrittlich" bezeichnest, was ist dann asm ?? :twisted:

Übrigens sind auch moderne Sprachen wie C++17 oder Frameworks wie C# oder Mono C-basiert, und selbst Java, Pascal oder Python sind per Syntax äußerst C-ähnlich (und schau mal nach, in welcher Programmiersprache die selber geschrieben worden sind...) .
Auch was das Lernen angeht, muss ich dir widersprechen:
C ist sehr einfach zu lernen, es ist extrem einfach konstruiert mit einer ganz simplen Syntax und nur knapp 20 reservierten Wörtern.
Nur wenn man alle Tricks mit Pointern, Referenzen und Objekten ausreizen will (mit Dingen, die teilw. in anderen Sprachen noch nicht einmal grundsätzlich möglich sind), muss man schon auch dazulernen wollen - aber wo ist das anders?




#include <LiquidCrystal.h>
// initialize the library by associating any needed LCD interface pin
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

void setup() {
float ftest;
ftest=millis() / 1000.0;

lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print("hello, world!");
lcd.setCursor(0, 1);
lcd.print(ftest);
}

HeSt
11.12.2018, 12:32
Hallo Freunde,
euer Eifer in Ehren, aber welche Programmiersprache die bessere ist, ist nicht Thema dieses Treads.
Hier geht's unter anderem lediglich um die Ansteuerung eines LCDs und wie man "Zahlen" raus schreibt, diese verändern und wieder als Zahl abspeichern kann.
Oder wie man den Cursor positioniert bzw. auto-cursor abschaltet.
Und das in Assembler.
Die Init-Prozedur ist fertig. Ich bin weiter am Suchen nach Lösungen zu obigen Zeilen. Einiges hab ich gefunden, versteh es aber noch nicht ...
Es dauert noch eine Weile ...

Moppi
11.12.2018, 14:58
... was ist dann asm ?? :twisted:


Der grundlegende Baustein zur Programmierung auf Hardwareebene.


Nur wenn man alle Tricks mit Pointern, Referenzen und Objekten ausreizen will...

Das geht in JavaScript mindestens genau so gut und wesentlich unkomplizierter.

Wenn der C-Compiler mal Code zur Variablentypenumwandlung mal selbst einfügen würde, anstatt immer nur zu melden, dass es hier und da und dort nicht zusammen passt, wäre es auch schon einiges einfacher - zum Beispiel.

MfG

HeSt
11.12.2018, 16:25
Hi,
bei unten stehendem Beispiel handelt es sich um ein 4*20 LCD.

Bitte was bedeuten die Steuerzeichen am Ende der letzten Zeile? Ich hab leider keinen Hinweis darauf gefunden.
0x0D ist mir klar: carriage return = cursor in Pos 1 der Zeile.
Aber 0xFE und 0xFF ???
Und sollte nach dem 0x0D nicht auch ein 0x0A = line feed = nächste Zeile kommen?
Oder impliziert 0x0D das LF in diesem Fall?

LcdTextOut:
.db "Spannung+Strom tn24",0x0D
.db "U = xx,xx V",0x0D
.db "I = xxx,x mA",0xFE,0xFF

seite5
11.12.2018, 17:44
Da Du alles selber schreibst, liegen CR, LF und andere Steuerzeichen auch in Deiner Regie, das Display versteht
sowas nicht, vermute das betrifft auch 0xFE, 0xFF.
Lerne C!
mfg
Achim

Siro
11.12.2018, 18:11
Hallo seite5,

vielleicht hilft Dir das weiter:

http://web.alfredstate.edu/faculty/weimandn/programming/lcd/ATmega328/LCD_code_asm_4f.html

Dort ist der Assemblercode für 4 Bit Ansteuerung
und auch der C-Code.
beides recht gut Dokumentiert.

Siro

Moppi
11.12.2018, 18:30
Hi,
bei unten stehendem Beispiel handelt es sich um ein 4*20 LCD.

Bitte was bedeuten die Steuerzeichen am Ende der letzten Zeile? Ich hab leider keinen Hinweis darauf gefunden.
0x0D ist mir klar: carriage return = cursor in Pos 1 der Zeile.
Aber 0xFE und 0xFF ???
Und sollte nach dem 0x0D nicht auch ein 0x0A = line feed = nächste Zeile kommen?
Oder impliziert 0x0D das LF in diesem Fall?

LcdTextOut:
.db "Spannung+Strom tn24",0x0D
.db "U = xx,xx V",0x0D
.db "I = xxx,x mA",0xFE,0xFF

https://de.wikipedia.org/wiki/Byte_Order_Mark

0x0D und 0x0A werden normalerweise beim Drucker verwendet oder anderen Ausgabegeräten -> CR+LF
Normalerweise sollte auf einen Wagenrücklauf ein Zeilenvorschub erfolgen, hierzu benötigt man beide Steuerzeichen.
Für reine Textdateien oder auch andere textbasierte Dateien kann aber auch nur eines von beidem (am ehesten CR) verwendet werden. Das ist nicht ungewöhnlich.
Ob in diesem Fall das 0xFE und 0xFF als Byte-Reihenfolge-Markierung steht, weiß ich nicht, eigentlich müsste es dann vorangestellt werden - denke ich. Es könnte auch einfach dafür verwendet werden, dass man das Textende eindeutig erkennt. Wenngleich dafür eigentlich eine "0" zuständig ist.

MfG

wkrug
11.12.2018, 18:42
Wie kann ich "Zahlen" in das LCD schreiben? Ein LCD kennt ja keine "Ziffern" oder "Zahlen". Das sind alles nur "Zeichen". Oder liege ich mit dieser Annahme falsch?
Das siehst Du genau richtig.
Du hast also im Prinzip 4 Werte ( bei einer 3 stelligen Zahl ). Also den eigentlichen Zahlenwert und den ASCII Wert der einzelnen Stellen.
Und das eine Format muss in das andere gewandelt werden ( Üblicherweise der Zahlenwert in die ASCII Zeichen ).
In Assembler kann man das so lösen, das man den eigentlichen Zahlenwert durch 10 Teilt und die Reste dann in ASCII Zeichen umwandelt ( eine Methode von mehreren ). Die Division kannst Du in Hardware machen ( falls der verwendete Controllertyp das hergibt ), oder Du musst eine Routine dafür schreiben.
Dann kannst Du noch überlegen, ob Du einfach führende Nullen mit anzeigst, oder diese durch Leerzeichen ersetzt.
Einfach den aktuellen Zahlenwert am Anfang der gewünschten Position anfangen lassen führt bei einem Übergang zu nächsten Stelle zum Springen der Stellen.
Da das Display üblicherweise nicht vollständig gelöscht wird kommen dann auch " Geisterzahlen " nach dem eigentlichen Messwert aufs Display wenn die ausgegebene Zahl wieder eine Stelle weniger hat.

Gut! Das hat jetzt eigentlich mit der ursprünglichen Fragestellung nichts zu tun, aber das werden mit ziemlicher Sicherheit Deine nächsten Probleme werden, auf Die Du stossen wirst.


.db "I = xxx,x mA",0xFE,0xFF
Eventuell ist hier auch 0xFE und 0xFF einfach ein Platzhalter ohne weitere Funktion, damit der Speicherbereich nach dem String nicht versehentlich überschrieben wird.
Kann aber natürlich auch alles andere sein.
Das kann eigentlich nur der Quellcode klären.

seite5
11.12.2018, 22:42
Hallo siro,
... wem sagst Du das, HeSt ist der ThreadOpener.
Ich selber würde nicht eine Sekunde opfern, um ein derart hässliches Display in eins meiner Projekte einzubauen.
mfg
Achim

HaWe
12.12.2018, 09:33
Ich selber würde nicht eine Sekunde opfern, um ein derart hässliches Display in eins meiner Projekte einzubauen.

das ist ja nun mal eine ganz persönliche Geschmacksache, das muss jedem selber überlassen bleiben.

muell-er
12.12.2018, 11:25
das ist ja nun mal eine ganz persönliche Geschmacksache, das muss jedem selber überlassen bleiben.
Da wären wir nun sicher so total alleine nie draufgekommen. Soll das ein nützlicher Kommentar sein - nein wirklich nicht.

HaWe
12.12.2018, 12:09
Da wären wir nun sicher so total alleine nie draufgekommen. Soll das ein nützlicher Kommentar sein - nein wirklich nicht.

warum gerade du (als jemand, der seit 2009 nur 25 Beiträge verfasst hat) dich genötigt siehst, darauf mit Zitat meines Posts zu antworten, ist jenseits meines Verständnisses . Schließlich war es an "seite5" gerichtet.

seite5
12.12.2018, 12:11
das ist ja nun mal eine ganz persönliche Geschmacksache, das muss jedem selber überlassen bleiben.

Völlig korrekt, wollte bloß mal drauf hinweisen, dass sich gerade im Display-Bereich in den letzten 30 Jahren etwas "bewegt" hat.
mfg
Achim

HaWe
12.12.2018, 12:26
Ich selber würde nicht eine Sekunde opfern, um ein derart hässliches Display in eins meiner Projekte einzubauen.

Völlig korrekt, wollte bloß mal drauf hinweisen, dass sich gerade im Display-Bereich in den letzten 30 Jahren etwas "bewegt" hat.


kann ja sein, aber es ist hier nicht zielführend, was du persönlich für schöner oder hässlicher hältst, unabhängig vom "Ton", denn es ist off-topic und löst nicht ansatzweise das TOP-Problem.

HeSt
12.12.2018, 17:23
@Achim,

Lerne C!
Ich akzeptiere, dass du in C programmierst.
Kannst du mir dafür meinen Assembler lassen? Jeder wie er will.
Wenn man keine Hilfestellung leisten kann/will, lässt man in der Regel derartige Kommentare. Zumindest würde ich es so handhaben.


@Siro,

vielleicht hilft Dir das weiter:
http://web.alfredstate.edu/faculty/weimandn/programming/lcd/ATmega328/LCD_code_asm_4f.html
Danke!! Super!
Das ist absolut fein leserlich geschrieben!
Da kann ich mir so einiges raus nehmen.


@wkrug

Das siehst Du genau richtig.
Du hast also im Prinzip 4 Werte ( bei einer 3 stelligen Zahl ). Also den eigentlichen Zahlenwert und den ASCII Wert der einzelnen Stellen.
Und das eine Format muss in das andere gewandelt werden ( Üblicherweise der Zahlenwert in die ASCII Zeichen ).
In Assembler kann man das so lösen, das man den eigentlichen Zahlenwert durch 10 Teilt und die Reste dann in ASCII Zeichen umwandelt ( eine Methode von mehreren ). Die Division kannst Du in Hardware machen ( falls der verwendete Controllertyp das hergibt ),
Hab beim Mega16 leider noch keine Divisionsinstruktion gefunden.

oder Du musst eine Routine dafür schreiben.
Wird wohl so werden - oder ich finde was im Netz ...


Dann kannst Du noch überlegen, ob Du einfach führende Nullen mit anzeigst, oder diese durch Leerzeichen ersetzt.
Ich brauche/will keine führenden Nullen.


Einfach den aktuellen Zahlenwert am Anfang der gewünschten Position anfangen lassen führt bei einem Übergang zu nächsten Stelle zum Springen der Stellen.
Da das Display üblicherweise nicht vollständig gelöscht wird kommen dann auch " Geisterzahlen " nach dem eigentlichen Messwert aufs Display wenn die ausgegebene Zahl wieder eine Stelle weniger hat.
Danke für den Hinweis.


Gut! Das hat jetzt eigentlich mit der ursprünglichen Fragestellung nichts zu tun, aber das werden mit ziemlicher Sicherheit Deine nächsten Probleme werden, auf Die Du stossen wirst.
Sieht danach aus.
Danke jedenfalls für deine ausführlichen Zeilen!

Siro
12.12.2018, 18:41
Oh sorry Achim,
die Info war natürlich für HeSt und nicht für Dich. :p

Diese (und ähnliche) Displays sind doch noch in erstaunlich vielen Anwenungen vorhanden,
jedoch meist im privaten Bereich. Sind halt super preiswert und "relativ" einfach zu handhaben.
ich hab die auch schon in verschiedenen Varianten eingesetzt.
Es gibt die ja inzwischen auch schon also OLEDs und mit diversen Beleuchtungsfarben.
Die OLED Version (zumindest die ich hatte) war übrigens "KACKE" wenn man das so sagen darf...
Je nach Pixeldichte verändert sich der Kontrast der anderen Zeichen.
Der Hersteller hatte mir das tatsächlich bestätigt und man arbeite dran....

@HeSt
Ich hoffe Du kommst mit den Informationen zurecht, ansonsten einfach nochmal fragen,
kann Dir dann bestimmt weiter helfen. Wichtig: Die Adressen der einzelnen Zeichen sind NICHT direkt hintereinander abgelegt,
das war Anfangs auch (m)eine Hürde;). Die erste Zeile beginnt bei Adresse 0, die zweite bei vielen Displays erst bei 64,
da wundert man sich zunächst...

Du kannst bei vielen Displays dann auch noch eigene Zeichen definieren, hab ich auch schon gemacht.
Viel Erfolg.

Zusatz:
Ich habe die Dinger schon in 3 Sprachen programmiert: EN,DE,FR :)
neee, in PIC-Assembler, C und in Pascal.
Jedem wie er es mag, zudem ist das ja hier das "Assembler" Forum, also bist Du hier schon ganz richtig.

Siro

HeSt
12.12.2018, 21:41
Hi Siro,

die Geschichte mit den Adressen hab ich schon mitbekommen.
Allerdings hab ich (noch) kein Datenblatt zu meinem LCD.
Ich habs beim großen C gekauft. Denke, dass ich dort auch das Datenblatt bekomme.

Die Sache mit den eigenen Zeichen lasse ich mal beiseite.
Erst muss das Ding funktionieren, dann kommen die Spielereien.

Ich hab mittlerweile ein ganzes Sammelsurium an LCD-Beispielprogrammen.
Jeder arbeitet ein bisschen anders. Aber da kann man sich viel raus holen.
Und manche haben den selben Stil wie man selbst.
Auf jeden Fall ist der Stil von Donald Weiman eine feine Sache!
So akkurat und gut dokumentiert hab ich noch kein Programmlisting gesehen.
Da tut man sich leicht, seinen Gedankengang nachzuvollziehen.

Nun hab ich, denke ich, genug Beispiele gesammelt um mein Vorhaben umsetzen zu können.
Mein LCD-Progrämmchen nimmt schön langsam auch Gestalt an, zumal ich jetzt bereits einiges behirnt hab.

Und falls ich mal wieder nicht weiter weiß, darf ich mich wieder melden.

Danke für eure Unterstützung !!!

Gruß Heinz
ps: mir reicht EINE Sprache ;)

HeSt
13.12.2018, 14:49
Drei Fragen:
1.
Eines hab ich bislang nirgendwo so konkret gefunden und weiß nicht genau:
Der Befehl $20 (RS=0) setzt den Cursor wohin?
An die 1. Stelle des LCD (Zeile 1, Position 1) oder
an die 1. Stelle der Zeile in der sich der Cursor gerade befindet?
2.
Kann ich mit dem Befehl $49 (RS=0) den Cursor direkt auf Zeile 2 Position 9 positionieren?
Zeile 2 Anfang ist bei meinem LCD @$40
3.
Wird dann an die gesetzte (curosr)@ (Position) auch das Zeichen ausgegeben, wenn ich gleich drauf ein Zeichen sende?

[edit]
Was ich auch hinterfragen möchte:
Immer wieder lese ich in diversen Programmlistings, dass bei der Init-Prozedur $30 3x hintereinander mit einem delay von ca. 4mS gesendet werden muss.
Ich hab mittlerweile 3 Datenblätter; aber in keinem ist bei der Init-Prozedur auch nur irgend ein Vermerk mit den 3x$30.
1x genügt offenbar. Die Verarbeitungszeit wird etwas unterschiedlich angegeben. Aber das war's dann.
Frage: ist 3x$30 notwendig? Dann erspart man sich eine Schleife ...
[endedit]

Danke und LG

wkrug
13.12.2018, 16:04
Ich hab mittlerweile 3 Datenblätter; aber in keinem ist bei der Init-Prozedur auch nur irgend ein Vermerk mit den 3x$30
In einem Uralt Datenblatt für den HD44780 Display Controller meine Ich wohl mal sowas gelesen zu haben.
Anscheinend haben es die Programmierer so beibehalten, da es anscheinend nicht stört und die Initialisierungsroutine üblicherweise nur einmal aufgerufen wird ( Also während des Betriebs keine Zeitverzögerung ).
In dem EA Datenblatt wird zumindest der "Function Set" für die Umschaltung von 8 auf 4 Bit Modus 3x aufgerufen.
https://cdn-reichelt.de/documents/datenblatt/A500/EA_W162-N3LED.pdf

Aber wenn Dein Display das nicht braucht und Du nie einen anderen Typ verwenden willst - Was solls dann.

Deine hex Zahlen setz ich jetzt mal nicht um.
Wenn Du aber den Curser auf die gewünschte Stelle setzt und dann ein Zeichen ausgibst wird dieses Zeichen dort angezeigt.
Wie gesagt, Ich arbeite hier lieber mit Strings und geb dann auf dem Display immer eine komplette Zeile aus.
Das vermeidet dann auch, das Zeichen von der vorherigen Ansicht irgendwo stehen bleiben.
IMHO ist es auch einfacher Zeichen in einem fertigen String zu ändern, als zu Überlegen wo denn noch welches Zeichen zu löschen ist.
Man fügt einfach mal Leerzeichen in den String ein wo der Messwert hin soll und Überschreibt dann die benötigten Stellen mit ASCII Zeichen.
Danach wird der komplette String ans Display gesendet.
Durch auto Inkrement ist dann auch keine weitere Adressangabe nötig.

Siro
13.12.2018, 16:25
Bei meinem Display sind die 3 mal 0x30 auch drin.
Ich habe das EA-W162B-BNLW mit dem Controller HD44780U

Hier meine 4 Bit Mode Initialisierung:

/* Power Up need ca. 40 ms internal Power on reset HD44780U */
Wait_us(50000);

LCD_DIR_OUTPUT; /* LCD Data Lines direction to output */
Wait_us(20);

LCD_DataOut8(0x30); /* Function set */
Wait_us(5000); /* wait > 4,1ms */

LCD_DataOut8(0x30); /* Function set */
Wait_us(200); /* wait > 100 us */

LCD_DataOut8(0x30); /* Function set */
Wait_us(200); /* wait > ??? us */


LCD_DataOut8(0x20); /* Function Set 4 BIT DL=0 */
Wait_us(200); /* wait > 26,3 us */

/* !!!! erst ab jetzt ist der 4 Bit Modus aktiv */

LCD_WaitBusy();

LCD_DataOut4(0x28); /* Function set DL=0==>4 Datalines N=1==>zwei oder vierzeiliges Display F=0==5x7 Dot*/
LCD_WaitBusy();

LCD_DataOut4(0x0F); /* Display On, Cursor blink on */
LCD_WaitBusy();

LCD_DataOut4(0x06); /* Entry Mode set Cursor auto inc 40us */
LCD_WaitBusy();

LCD_GotoXY(2,0);
LCD_Write("Hallo");
LCD_GotoXY(2,1);
LCD_Write("Display");

!!! das Busy Flag BF darf bei der initialisierung noch NICHT abgefragt werden,
das funktioniert erst nachdem der 4 Bit Modus gesetzt wurde.
Deshalb die wartefunktion Wait_us
-------------------------------------
Um deine Adresse zu setzen, wo das nächste Zeichen hin soll
must Du generell noch das Datenbit DB7 setzen
Also zweite Zeile ist 0x40
dann das 9te Zeichen
ist dann deine 49 Hex
und nun noch +128 oder OR 0x80 um das DB7 Bit zu setzen
dann erst ausgeben.
Das RS Bit muss dabei 0 sein, das ist richtig.

Ich setzte immer die Adresse mit folgender Funktion

GotoXY(x,y)

Adresse = (y * 0x40) + x + 128

Pseudocode:
a = 0
wenn y = 1 dann a = 0x40 / 2 Zeile beginnt bei 0x40
a = a + x / Spaltenposition addieren
a = a OR 0x80 / immer DB7 Bit setzen

Auf Port ausgeben dabei RS Pin Low lassen

HeSt
13.12.2018, 17:27
Ok,
danke mal euch beiden!!
werd weiter werkeln.
Möchte, wenn ich denke dass ich mit den LCD- Routinen soweit fertig bin, mit einem Tiny24 mal testen.
Den bring ich mit dem LCD auf meine kleine Steckplatine drauf.
Wird aber noch ein Weilchen dauern ...
Ich meld mich wieder.

HeSt
26.12.2018, 18:45
Hi,
hat jetzt zwar nicht direkt mit LCD was zu tun, aber letzten Endes soll das Ergebnis am LCD angezeigt werden.
Vielleicht kann mir jemand aus meinem Gedankenkreis helfen ...:
Es geht um die Umrechnung eines ADC-Wertes (den ich am LCD anzeigen möchte) mit 8Bit (adlar=1).
Ich hab zwei Konstanten:
5 (Volt Referenzspannung) und
255 (max. ADC-Wert)
Um den ADC-IST-Wert (ADCH) in die Spannung umzurechnen heißt die Formel:
U(Volt)/maxWert*Ist-Wert = UIst in Volt = 5/255*ADCH.
5/255 ergibt gerundet 0,0196. Um weiter rechnen zu können, muss ich diese Zahl mit 10.000 multiplizieren. Ergibt 196. Diese Zahl kann ich nun als Rechen-Konstante verwenden und bringe sie in jedem Register unter. Nun muss ich noch mit ADCH multiplizieren (Mega16 MUL). Das Ergebnis steht dann in R1/R0. Nun wieder eine Division durch 10.000 um den tatsächlichen Wert zu erhalten. Dieser Wert soll am LCD angezeigt werden (inklusive Rest als Nach-Kommastelle).
Ich hab in diversen Foren gesucht, auch einiges gefunden, aber leider nicht behirnt, wie ich die 10.000-Division codieren kann.
R1/R0 > XH/XL zum Rechnen, aber weiter ???

wkrug
26.12.2018, 19:28
Um keine Nachkommastellen zu bekommen, die der Controller wegschmeisst, ist es sinnvoll erst mal alle Multiplikationen auszuführen.
Ich würde auch nicht mit 5 sondern mit 50 Multiplizieren und somit eine Stelle nach dem Komma kriegen.
Bei 8 Bit machen mehr Nachkommastellen auch nicht wirklich Sinn.
Das Ergebnis ist dann das 10 Fache des eigentlichen Messwertes, das kann man dann in der Ausgaberoutine ausgleichen.
Eine Beschreibung der Möglichkeiten zur Division gibts hier: http://www.avr-projekte.de/rechnen.htm

Noch was:
Der A/D Wandler und die Referenzspannung sind niemals genau.
Ich Bastel dann immer einen Wert in die Formel mit rein der Variabel ist.
Das wäre z.B. die 5. Wenn man hier stattdessen 500 verwendet kann man diesen über ein Abgleichprogramm neu berechnen lassen und im EEPROM abspeichern.
Also bekannte Spannung anlegen und an dem Wert ( z.B. 500 ) so lange rum drehen, bis der auf dem Display angezeigte Wert mit dem mit dem Multimeter gemessenen übereinstimmt. Das Ganze noch mal mit anderen Spannungswerten wiederholen ( Nichlinearitäten ).

Die Reste kannst Du auch verwenden um die ASCII Zeichen von hinten nach Vorne zu berechnen.
Also Zahl / 10 Rest x ; x + Fix Wert für ASCII ergibt dann den ASCII Code.
Das Spielchen dann so weiter, bis die komplette Zahl zu ASCII verarbeitet ist.

Nochmal Nochmal was:
Wenn der Controller höhere Lasten treiben muss z.B. mehrere LED's schwanken die A/D Wandlerwerte je nach Belastung.
Anscheinend wird dabei die Controllerinterne GND Schiene belastet und verfälscht den A/D Wert - ( War bei mir auf jeden Fall bei einem ATMEGA 8 so ) .

HeSt
27.12.2018, 10:07
Servus!

Wahre Freaks sind offenbar auch zu den Weihnachtsfeiertagen im Forum unterwegs! ;)
Danke für deine Antwort!

Die Genauigkeit der Spannung und des Ladestroms ist bei meinem Projekt nicht tragisch. Somit bedarf es deiner vorgeschlagenen Genauigkeitsverbesserung nicht.
Aber danke, das kann ich beim nächsten Mal brauchen!
Was die Division betrifft hatte ich jetzt am Morgen eine Idee: ich brauch ja nicht durch 10.000 dividieren. 100 reicht auch:
Als Rechenkonstante dient 196 (5/255*10.000) und ist genau genug.
Der Rest dieser Division wird ignoriert.
Beispiel:
ADCH ist 148. 196*148=29008/100=290. Der Rest wird wieder ignoriert.
Ich weiß, dass ich bei dieser Zahl die letzten beiden Ziffern Nachkommastellen sind und kann somit die Anzeige entsprechend aufbereiten.
Und die Genauigkeit ist gar nicht so schlecht (255 entspricht 5V):
196*255=49980/100=499 (4,99 am LCD) - das ist mir derzeit genau genug.

Übrigens, in deinem Link wird Dividend und Divisor verwechselt! Oder sehe ich das falsch?
"Hier wird in einer Schleife gezählt, wie oft der Dividend vom Divisor abgezogen werden kann, bis ein Unterlauf auftritt."
Der Dividend ist die linke Zahl VOR dem Divisionszeichen und der Divisor die rechte NACH dem Divisionszeichen.

Das Beispiel funktioniert. Ich kann es lesen, verstanden hab ich es noch nicht ganz. Wird noch werden ...

Danke nochmals und
GUTEN RUTSCH!!

wkrug
27.12.2018, 11:29
Übrigens, in deinem Link wird Dividend und Divisor verwechselt! Oder sehe ich das falsch?
"Hier wird in einer Schleife gezählt, wie oft der Dividend vom Divisor abgezogen werden kann, bis ein Unterlauf auftritt."
Das ist aber bei großen Zahlen die langsame Variante.
Die in dem Beispiel Vorgestellte arbeitet mit Schiebeoperationen.
Es wird also 16 bzw. 32 x geschoben.

HeSt
27.12.2018, 14:04
Ich weiß nicht, welche du da meinst.
Ich hab das erste Beispiel genommen, das die Ziffern gleich in ASCII umwandelt und einzeln ausgibt:
;16Bitwert (max. 9999) in einzelne (Dezimal) Ziffern zerlegen
Das ist praktisch, weil ich damit gleich in die LCD-Routine zum Anzeigen gehen kann.
Zudem hab ich diese Variante schon nicht ganz verstanden, geschweige denn die Schiebemethoden!
Das ist mir derzeit noch alles "zu hoch".
Ob langsam oder nicht. Schnell genug ist es für mich allemal, weil ich keine zeitkritischen Abläufe hab.

Aber Dividend und Divisor sind im Text jedenfalls verwechselt.

[edit]
Bevor ich nun die Testschaltung aufbaue eine Frage:
ich hab eine LCD-Testroutine für den Tiny24 geschrieben.
Die Hex-Datei ist 3KB groß geworden. Im Datenblatt steht nur 2KB memory flash!
Das flashen brachte aber keine Fehler!!! Sollte da nicht eine Fehlermeldung kommen??
Hab erst nach dem flashen die Größe der Hex-Datei gesehen ...
[endedit]

Siro
27.12.2018, 16:40
Hallo HeSt,
die Hexdatei auf dem Rechner ist immer größer als der Code der in den Chip Programmiert wird,
weil da die Daten im Hexadezimalen Format drin stehen.
Das ist das sogennate Intel Hex Format oder Motorola Hex Format.
Die Dateigröße auf dem Rechner spielt also keine Rolle.
Somit wird das völlig okay sein, sonst würde bestimmt eine Fehlermeldung auftauchen.

Siro

HeSt
27.12.2018, 17:14
Hi Siro,
danke für die ermutigende Antwort!
Kann mir auch nicht vorstellen, dass keine Fehlermeldung kommen würde, wenn's nicht genug Platz hat ...

wkrug
27.12.2018, 17:18
Hier ist das Verschiebeprinzip erklärt:
https://www.mathetreff-online.de/wissen/mathelexikon/division-von-binaerzahlen

Passiert also im Prinzip so, wie man das auch Handschriftlich machen würde.

P.S.:
Bei C hätte Dich das gar nicht interessiert!

HeSt
27.12.2018, 17:57
Hi wkrug,

jaja, C ich weiß. Aber soll ich in meinen alten Tagen noch C lernen?
Assembler kann ich "ein wenig".
Nachdem meine Projekte eher klein sind und ich nur gelegentlich was mit µC's mache (alle 1-2 Jahre 1 kleines Projekt),
habe ich bislang mit Assembler das Auslangen gefunden.
Der Solartracker mit dem Mega16 ist mein erstes Projekt bei dem ich ein LCD verwende und darüber einige Parameter anzeigen und ändern können will.
Deshalb viele Neuheiten für mich.

Und danke für den "Mathe"-Link!
Super erklärt! Jetzt hab ich's verstanden. :)

[edit]
Es hat mir keine Ruhe gelassen.
Ich hab den T24 nochmals geflashed.
Genaue Dateigröße lt. PC: 2.534 Byte
Angegebene Größe beim Flashen mit myAVR: 888 Byte !! Deshalb auch ok bei einem Platz von 2KB.
Das ergibt einen Unterschied von 1.646 Byte !!
Somit zeigt der PC nahezu die 3-fache der tatsächlichen Größe an !!!
[endedit]

Moppi
27.12.2018, 18:58
Hallo HeSt,

Assembler ist eine tolle Sache, aber sehr mühselig. Für so kleine Projekte ist die Arduino IDE eigentlich ganz gut - leicht verständlich und C damit nicht wirklich so schwer, es geht schon. Zumal es auch viele Bibliotheken gibt, so dass Du das Rad nicht immer neu zimmern musst. Es wäre einfacher damit ;) Aber, wenn Du Spaß hast, mach so weiter.
Ach, weil ich schon gerade einmal gesucht habe, hier sogar der erste Treffer: ein Link für Atmega16 mit Arduino IDE (http://openhardware.ro/using-atmega16-with-arduino-ide/).

MfG
Moppi

oberallgeier
27.12.2018, 20:02
..
Es hat mir keine Ruhe gelassen.
Ich hab den T24 nochmals geflashed.
Genaue Dateigröße lt. PC: 2.534 Byte
Angegebene Größe beim Flashen mit myAVR: 888 Byte !! Deshalb auch ok bei einem Platz von 2KB.
Das ergibt einen Unterschied von 1.646 Byte !!
Somit zeigt der PC nahezu die 3-fache der tatsächlichen Größe an !!!
..Hallo Heinz,

ja, da fängt man an zu grübeln, ging mir auch so. Mal (m)ein Beispiel - dieser Hexfile "D02.hex" ist das Compilat aus einem laufenden Projekt:

:100000000C9434000C94BB040C9417050C94510010
:100010000C9481020C9451000C9451000C942E030A
:100020000C94B6030C9451000C9451000C945100A4
:100030000C9451000C9451000C9459010C945100F3
:100040000C9451000C9451000C9490000C94BC0042
:100050000C9451000C94CC0E0C9451000C94510053
:100060000C9451000C94510011241FBECFEFD8E026
:10007000DEBFCDBF14E0A0E0B1E0ECE3F8E202C0E7
:1000800005900D92A632B107D9F716E0A6E2B4E0CA
:1000900001C01D92AC32B107E1F70E9455120C94D9
:1000A0001C140C9400009093C5008093C40010921F
:1000B000C00086E08093C20088E98093C1008091EF
:1000C0004E0480934D048091600480935F040895F2
:1000D00090914E0480914D048927089590914E048B
:1000E00080914D049817D1F3E0914E04F0E0E35C69
:1000F000FB4FE08180914E048F5F80934E0480918E
:100100004E04803110F080E002C080914E04809354
:100110004E048091C10080688093C1008E2F0895A5
:100120001F920F920FB60F9211248F939F93EF930C
:10013000FF9390914D049F5F903108F090E0809183
:100140004E04981731F48091C1008F778093C100DD
:100150000AC0E0914D04F0E08091C600E35CFB4FE3
:10016000808390934D04FF91EF919F918F910F9019
:100170000FBE0F901F9018951F920F920FB60F92FF
:1001800011248F939F93EF93FF9390915F0480913D
:100190006004981731F48091C1008F7D8093C10075
:1001A00017C0E0916004F0E0E15BFB4F8081809339
:1001B000C600809160048F5F80936004809160042A
:1001C000803110F080E002C0809160048093600470
:1001D000FF91EF919F918F910F900FBE0F901F9005
:1001E000189590915F049F5F903108F090E08091A6
:1001F00060048927089590915F049F5F903108F013
:1002000090E0E0915F04F0E0E15BFB4F8083809140
:1002100060049817E1F390935F048091C1008062BD
:100220008093C1000895CF93DF93EC0103C0219622
:100230000E94FB0088818823D1F7DF91CF91089538
:1002400094E69093830584E180930D069093820554
:100250008093EA0590930506809304051092CC05DF
:1002600008950895EEE6F0E0808182608083109228
:100270003A04F894109264048FE78093630480E456
:100280008093620486E0809362049091630480917D
:10029000620480958923809363048FE380936304D1
:1002A0008091630490E09093890080938800789413
:1002B00008951F920F920FB60F9211242F933F9320
:1002C0008F939F93EF93FF9326B130913A0481E08F
:1002D00090E002C0880F991F3A95E2F728232093F7
:1002E000610480916104882329F080913B048F5F31
:1002F00080933B0480913C048F5F80933C048A3060
:1003000009F047C080913B04833038F0909163043A
:1003100080916204892B80936304809162048695A6
:1003200080936204809162048823E9F480916304DD
:1003300080936404E0913A04F0E080916404E15811
:10034000FA4F808380913A048F5F80933A048091C2
:100350003A04833011F410923A048FE780936304D7
:1003600080E480936204909163048091620480959C
:10037000892380936304209163048FEF90E0821BB4
:100380009109909389008093880010923C04109208
:100390003B04FF91EF919F918F913F912F910F908F
:1003A0000FBE0F901F901895E0E8F0E08081806804
:1003B0008083E1E8F0E080818160808380818061DA
:1003C000808386E191E09093870080938600EFE63A
:1003D000F0E080818D7F808380818E7F808308958F
:1003E00090938900809388000895E0E8F0E0808190
:1003F000806880830895E0E8F0E080818F778083D3
:100400000895ACE7B0E08C9186608C93EAE7F0E069
:100410008081806280838C9180648C9380818760EE
:1004200080838081886080838081806880838081F0
:100430008064808310920F0610920E06089580E06B
:1004400091E00E941301089583E091E00E9413015E
:100450000E941F0208958AE191E00E94130108950D
:1004600087E391E00E941301F89420E030E0F90165
:10047000E35CFB4F8081F901E458FB4F80832F5FE1
:100480003F4F2F30310599F7789408951F93DF93EC
:10049000CF9300D00F92CDB7DEB7182F86E491E04E
:1004A0000E9413011E3F18F080E591E016C0812FD5
:1004B00082958F708A3018F0982F995C02C0982F1F
:1004C000905D812F8F708A3010F0895C01C0805D53
:1004D00099838A831B82CE0101960E9413010F909B
:1004E0000F900F90CF91DF911F910895E8E6F0E013
:1004F000808182608083ECE6F0E08081816080838F
:1005000008951F920F920FB60F9211242F933F93CD
:100510004F938F939F9330992AC08091F5049091C7
:10052000F604892B21F580917D0590917E05843616
:100530009105E8F010927E0510927D0582E190E031
:100540009093D0058093CF058DE08093FB0580913B
:10055000F5049091F60490629093F6048093F5046C
:100560008CE08093FB05109227061092260680915E
:10057000FB0587FD45C080912606909127064B9785
:1005800024F18091260690912706CC97F4F43099B7
:1005900013C08091F5049091F6044091FB0521E091
:1005A00030E002C0220F331F4A95E2F7282B392B87
:1005B0003093F6042093F5048091FB0581508093DD
:1005C000FB0510922706109226068091FB058A30C3
:1005D000B9F48091F5049091F604892F869586955B
:1005E000869581708093F7049091F7048091F005CF
:1005F000981719F41092240403C081E08093240416
:100600009F918F914F913F912F910F900FBE0F901F
:100610001F901895E0EBF0E0808182608083E1EB31
:10062000F0E08081826080838CE78093B300E0E714
:10063000F0E080818260808380818460808308957F
:10064000E0EBF0E080818D7F8083E0E7F0E0808167
:100650008D7F808380818B7F808308951F920F928E
:100660000FB60F9211242F933F938F939F93209156
:10067000F1053091F2058091FC059091FD05281758
:10068000390798F48091F1059091F20501969093C5
:10069000F2058093F10580917B0590917C05019690
:1006A00090937C0580937B052CC081E090E0909333
:1006B000F2058093F105809114069091150601963C
:1006C0009093150680931406809114069091150658
:1006D00097FF04C0109215061092140685B190E29F
:1006E000892785B920910B0530910C0580918405EF
:1006F000909185052817390721F41092FF05109273
:10070000FE0580912A06882331F180910906909197
:100710000A0680599140BCF48091090690910A061E
:10072000019690930A06809309069091060680919F
:10073000E505981730F4809106068F5F80930606D2
:100740000CC02A980AC010920A061092090610924C
:1007500006062A9A02C01092E5059F918F913F915B
:100760002F910F900FBE0F901F9018951F920F9210
:100770000FB60F9211242F933F938F939F93209145
:10078000DC053091DD058091FC059091FD05281771
:10079000390730F48091DC059091DD05019602C0A7
:1007A00081E090E09093DD058093DC05309B16C0DE
:1007B00080917D0590917E05019690937E058093B2
:1007C0007D0580917D0590917E05895E934030F096
:1007D00088EE93E090937E0580937D0580912606B8
:1007E0009091270601969093270680932606809184
:1007F0007B0590917C05019690937C0580937B0509
:100800008091CF059091D00501969093D00580936B
:10081000CF058091C6059091C70581569A4E48F440
:100820008091C6059091C70501969093C705809366
:10083000C60580910B0690910C06892B49F080919A
:100840000B0690910C06019790930C0680930B0673
:100850008091CF059091D005815F91401CF18091EE
:10086000F5049091F604892BE9F080912404882303
:1008700039F08091F5049091F6048093040602C04B
:10088000109204068091F5049091F6049093DF0590
:100890008093DE058091F7048093F0051092F604B2
:1008A0001092F50480917B0590917C0580519742D0
:1008B00020F010927C0510927B059F918F913F91C3
:1008C0002F910F900FBE0F901F90189520EA3FE0D8
:1008D00004C0F9013197F1F701970097D1F7089516
:1008E00024E030E004C0F9013197F1F70197009757
:1008F000D1F70895E9E6F0E080818F6080838DB3C1
:1009000083608DBB1092DB051092DA058091DA05C9
:100910009091DB059093100580930F0580910F0552
:10092000909110059093FF058093FE058091FE0540
:100930009091FF0590930C0580930B051092E405B0
:100940001092E3058091E3059091E4059093CE0524
:100950008093CD058091CD059091CE059093E705CC
:100960008093E6058091E6059091E70590930A054E
:100970008093090508951F920F920FB60F921124CC
:100980002F933F938F939F938091D505823078F476
:100990008091D5058F5F8093D50580916A049091F1
:1009A0006B04019690936B0480936A0437C081E0D6
:1009B0008093D50580910B0590910C05019690933D
:1009C0000C0580930B0580910B0590910C0590937D
:1009D0008505809384058091F1059091F2059093AF
:1009E000100580930F0580910F05909110052091BF
:1009F000DA053091DB05821B930B9093FF05809302
:100A0000FE0580910F05909110059093DB05809372
:100A1000DA058091F4048F5F8093F4049F918F91A5
:100A20003F912F910F900FBE0F901F9018951F921E
:100A30000F920FB60F9211242F933F938F939F9392
:100A400080912B06823078F480912B068F5F809303
:100A50002B0680911206909113060196909313062F
:100A60008093120632C081E080932B0680910905A5
:100A700090910A05019690930A058093090580914B
:100A8000090590910A0590931B0680931A068091A0
:100A9000F1059091F2059093CE058093CD0580915C
:100AA000CD059091CE052091E3053091E405821BA0
:100AB000930B9093E7058093E6058091CD05909187
:100AC000CE059093E4058093E3059F918F913F912C
:100AD0002F910F900FBE0F901F90189584B5806ACC
:100AE00084BD84B5836084BD85B5836085BDEEE635
:100AF000F0E080818D7F808380818E7F808317BC32
:100B000018BC1092FF051092FE0510927904109205
:100B10007804809178049091790490936F04809385
:100B20006E041092080510920705809107059091B8
:100B3000080590931405809313051092D705109221
:100B4000D6058091D6059091D7059093F4058093B2
:100B5000F305089588BD089587BD08958091280400
:100B6000813009F404C180912A0490912B040697E6
:100B700014F418BC089580912A0490912B0490934A
:100B8000C2058093C1058091FE059091FF05909369
:100B90003704809336048091360490913704855F42
:100BA000914034F084EF91E09093370480933604C1
:100BB0008091150590911605609136047091370467
:100BC0000E94AE1370932F0460932E048091C10590
:100BD0009091C20520912E0430912F04821B930B1B
:100BE000909314058093130520916E0430916F0447
:100BF0008091130590911405820F931F90936F04B9
:100C000080936E0480916E0490916F048056904F93
:100C100034F480E690EF90936F0480936E0480919B
:100C20006E0490916F04815A9F4034F080EA9FE0F7
:100C300090936F0480936E04809113059091140536
:100C400060911E0670911F060E94C2137093660485
:100C50006093650480916E0490916F046091020628
:100C6000709103060E94C2137093870560938605F6
:100C700080911305909114052091F3053091F405AE
:100C80006091070670910806821B930B0E94C213A5
:100C900070930106609300064091650450916604CC
:100CA000809186059091870520910006309101067C
:100CB000840F951F820F931F9093C9058093C805D9
:100CC00080911305909114059093F4058093F3059A
:100CD0008091C8059091C90597FF14C08091D805EF
:100CE0009091D905019709F442C01092C90510925C
:100CF000C8052C985C9881E090E09093D90580938A
:100D0000D80508958091C8059091C90597FD2AC01E
:100D10008091C3059091C405892B49F18091D80534
:100D20009091D9050197F1F41092D9051092D80548
:100D30008091C3059091C405181619061CF42C9ACD
:100D40005C9802C02C985C9A8091C8059091C90566
:100D50008F3F910539F034F08FEF90E09093C90503
:100D60008093C8058091C8059091C90588BD0895F4
:100D700080912904813009F404C180912C04909160
:100D80002D04069714F417BC089580912C049091BB
:100D90002D0490937504809374048091E6059091DE
:100DA000E70590933904809338048091380490913A
:100DB0003904855F914034F084EF91E090933904D9
:100DC0008093380480911505909116056091380440
:100DD000709139040E94AE1370933304609332040F
:100DE0008091740490917504209132043091330401
:100DF000821B930B9093080580930705209178043C
:100E0000309179048091070590910805820F931F16
:100E10009093790480937804809178049091790478
:100E20008056904F34F480E690EF9093790480934D
:100E300078048091780490917904815A9F4034F02D
:100E400080EA9FE09093790480937804809107056D
:100E50009091080560917604709177040E94C21306
:100E600070931D0660931C0680917804909179041C
:100E70006091F9057091FA050E94C21370931706EC
:100E80006093160680910705909108052091D6057C
:100E90003091D7056091E8057091E905821B930BAD
:100EA0000E94C2137093F8056093F70540911C06E9
:100EB00050911D0680911606909117062091F70516
:100EC0003091F805840F951F820F931F90930605AC
:100ED0008093050580911305909114059093F40576
:100EE0008093F305809105059091060597FF14C046
:100EF0008091700490917104019709F442C010929E
:100F000006051092050528985F9881E090E090937F
:100F100071048093700408958091050590910605F1
:100F200097FD2AC08091F2049091F304892B49F136
:100F300080917004909171040197F1F41092710402
:100F4000109270048091F2049091F304181619061F
:100F50001CF4289A5F9802C028985F9A8091050532
:100F6000909106058F3F910539F034F08FEF90E0B6
:100F700090930605809305058091050590910605DF
:100F800087BD089584B5806284BD2C9A5C980895CD
:100F900084B5806284BD2C985C9A089584B58F7D59
:100FA00084BD2C985C98089584B5806284BD2C9A89
:100FB0005C9A089584B5806884BD289A5F9881E022
:100FC00090E09093F3048093F204089584B58068D0
:100FD00084BD28985F9A8FEF9FEF9093F3048093DE
:100FE000F204089584B58F7784BD17BC28985F9864
:100FF000089581E28093E50508958BE08093E505EF
:101000000895DF93CF9300D000D000D0CDB7DEB7E6
:10101000109204068AE090E09A8389838CE390E042
:101020009C838B8385E090E09E838D83F89410925F
:101030002B0410922A0410922D0410922C0410926A
:10104000DB051092DA058091DA059091DB0590932B
:10105000100580930F0580910F05909110059093D6
:10106000FF058093FE058091FE059091FF0590930A
:101070000C0580930B051092E4051092E305809116
:10108000E3059091E4059093CE058093CD05809182
:10109000CD059091CE059093E7058093E60580916C
:1010A000E6059091E70590930A05809309057894E9
:1010B00020E030E0F901EE0FFF1FDF01A95EBA4F1B
:1010C00011961C921E928D919C91E257FB4F918339
:1010D000808380819181F901E857FA4F80832F5FE7
:1010E0003F4F2436310531F780E28093F4041092AB
:1010F00068040E94DA070E94C8078AE090E0909393
:101100002B0480932A0490932D0480932C0441E0B7
:1011100020EA3FE0F89480910B0590910C058558EA
:10112000924040F48091090590910A0585589240BB
:1011300008F455C078940E94F2070E94CE071092DE
:101140002B0410922A0410922D0410922C0480EA91
:101150009FE0FC013197F1F70197F1F71092DB0561
:101160001092DA058091DA059091DB0590931005D5
:1011700080930F0580910F05909110059093FF05C6
:101180008093FE058091FE059091FF0590930C05DC
:1011900080930B051092E4051092E3058091E3051E
:1011A0009091E4059093CE058093CD058091CD0577
:1011B0009091CE059093E7058093E6058091E60532
:1011C0009091E70590930A058093090526960FB63E
:1011D000F894DEBF0FBECDBFCF91DF91089580910F
:1011E000F404813238F14093F404E0916804F0E0B3
:1011F00080917F05E857FA4F8083E0916804F0E022
:101200008091800590E0EE0FFF1FE257FB4F918326
:101210008083E0916804F0E08091810590E0EE0F1A
:10122000FF1FE95EFA4F91838083809168048F5F8E
:10123000809368047894C9010197F1F7C901019777
:10124000F1F768CFDF93CF9300D000D0CDB7DEB7F2
:101250008EE190E09A83898380E590E09C838B8384
:1012600080917F0529813A8190E02817390718F08D
:101270002BE030E039C08091800529813A8190E0EF
:101280002817390718F02FE130E02EC08091810532
:1012900029813A8190E02817390718F029E230E0D7
:1012A00023C080917F052B813C8190E082179307BA
:1012B00018F020E130E018C0809180052B813C813E
:1012C00090E08217930718F024E230E00DC080917F
:1012D00081052B813C8190E08217930718F420E070
:1012E00030E002C02EE230E0C9010F900F900F9065
:1012F0000F90CF91DF9108951F93DF93CF9300D08C
:1013000000D000D0CDB7DEB78EE189838CE38A832D
:1013100011E01B8380917F058C83809180058D83F4
:10132000809181058E8310922D0410922C0480915F
:101330002C0490912D0490932B0480932A040E94F6
:10134000DA070E94C20717BD18BD298140EA5FE095
:1013500013C0822F90E090932D0480932C048091F1
:101360002C0490912D0490932B0480932A04CA019D
:101370000197F1F78B81280F8A81821750F78091AE
:101380007F058C83809180058D83809181058E837C
:101390008C81853178F08C81843660F48D81853143
:1013A00048F08D81843630F48E81853118F08E813D
:1013B000843628F32A8140EA5FE00EC0822F90E055
:1013C00090932B0480932A0490932D0480932C04F3
:1013D000CA010197F1F722508981821778F70E949C
:1013E000F2070E94CE0710922D0410922C048091D7
:1013F0002C0490912D0490932B0480932A0426961C
:101400000FB6F894DEBF0FBECDBFCF91DF911F9115
:1014100008950F931F93DF93CF9300D00F92CDB712
:10142000DEB78C012EE129839CE39A8381E08B83D4
:1014300029839A838B830E94C20717FF05C00E94ED
:10144000C807109501951F4F10920C0510920B05BF
:10145000298140EA5FE019C0822F90E090932B042D
:1014600080932A0480910B0590910C0580179107B9
:1014700078F4CA010197F1F780910B0590910C0562
:101480008017910728F48B81280F8A81821720F713
:1014900080910B0590910C0580179107C8F32A8164
:1014A00040EA5FE00AC0822F90E090932B04809383
:1014B0002A04CA010197F1F722508981821798F70F
:1014C0000E94CE0710922B0410922A040F900F90C6
:1014D0000F90CF91DF911F910F9108950F931F935C
:1014E000DF93CF9300D00F92CDB7DEB78C012EE102
:1014F00029839CE39A8381E08B8329839A838B835E
:101500000E94DA0717FF05C00E94E60710950195B3
:101510001F4F10920A0510920905298140EA5FE0E9
:1015200019C0822F90E090932D0480932C04809119
:10153000090590910A058017910778F4CA0101976F
:10154000F1F78091090590910A058017910728F419
:101550008B81280F8A81821720F78091090590914D
:101560000A0580179107C8F32A8140EA5FE00AC0A4
:10157000822F90E090932D0480932C04CA01019750
:10158000F1F722508981821798F70E94F207109292
:101590002D0410922C040F900F900F90CF91DF919B
:1015A0001F910F910895DF93CF9300D00F92CDB785
:1015B000DEB781E080932A0681E28093E5058EEE16
:1015C00092E020EA3FE0F9013197F1F70197D9F76E
:1015D0008091800080688093800010922A060E948B
:1015E000240282E390E020EA3FE0F9013197F1F72D
:1015F0000197D9F780917F058983809180058A833F
:10160000809181058B830E947C09809180058A31BD
:1016100040F482EE9FEF0E946E0A8DE99FEF0E94D8
:10162000090A809181058A3140F482EE9FEF0E9481
:10163000090A8DE99FEF0E946E0A80917F058A3129
:1016400040F482EE9FEF0E946E0A8DE99FEF0E94A8
:10165000090A809180058A3540F082EE9FEF0E9452
:101660006E0A8DE99FEF0E94090A809181058A35F3
:1016700040F082EE9FEF0E94090A8DE99FEF0E94E1
:101680006E0A80917F058A3508F4BDCF82EE9FEF08
:101690000E94090A8DE99FEF0E946E0AB4CFDF9382
:1016A000CF9300D000D000D0CDB7DEB78AE090E075
:1016B0009A83898386E990E09C838B8385E090E020
:1016C0009E838D83F89480EA9FE00197F1F788EC80
:1016D00087BD8FEF88BD0E94DA070E94C207109273
:1016E000DB051092DA058091DA059091DB05909385
:1016F000100580930F0580910F0590911005909330
:10170000FF058093FE058091FE059091FF05909363
:101710000C0580930B051092E4051092E30580916F
:10172000E3059091E4059093CE058093CD058091DB
:10173000CD059091CE059093E7058093E6058091C5
:10174000E6059091E70590930A05809309051092AC
:101750006F0410926E0410927904109278047894B9
:101760008B819C8190932D0480932C0480912C0478
:1017700090912D0490932B0480932A0420EA3FE05B
:10178000F89480910B0590910C05855F914038F499
:101790008091090590910A05855F914038F0789411
:1017A0008B819C81682F40EA5FE024C07894C90156
:1017B0000197F1F7C9010197F1F7E2CF30932D04BA
:1017C00020932C0480912C0490912D0490932B0451
:1017D00080932A04CA010197F1F7CA010197F1F732
:1017E000CA010197F1F7CA010197F1F7CA01019700
:1017F000F1F7625089819A81262F30E08217930792
:10180000E8F2F8941092DB051092DA058091DA057F
:101810009091DB059093100580930F0580910F0543
:10182000909110059093FF058093FE058091FE0531
:101830009091FF0590930C0580930B051092E405A1
:101840001092E3058091E3059091E4059093CE0515
:101850008093CD058091CD059091CE059093E705BD
:101860008093E6058091E6059091E70590930A053F
:101870008093090578940E94E6070E94C20784EBD2
:1018800090E090932D0480932C0480912C049091EF
:101890002D0490932B0480932A0420EA3FE0F894CF
:1018A00080910B0590910C058D56924040F48091EB
:1018B000090590910A058D56924008F465C0789408
:1018C0000E94F2070E94CE0710922D0410922C0461
:1018D00080912C0490912D0490932B0480932A04E2
:1018E00080EA9FE0FC013197F1F70197F1F7109240
:1018F000DB051092DA058091DA059091DB05909373
:10190000100580930F0580910F059091100590931D
:10191000FF058093FE058091FE059091FF05909351
:101920000C0580930B051092E4051092E30580915D
:10193000E3059091E4059093CE058093CD058091C9
:10194000CD059091CE059093E7058093E6058091B3
:10195000E6059091E70590930A058093090510929A
:10196000790410927804809178049091790490938E
:101970006F0480936E0426960FB6F894DEBF0FBEF8
:10198000CDBFCF91DF9108957894C9010197F1F708
:10199000C9010197F1F783CFDF93CF9300D000D037
:1019A00000D0CDB7DEB78AE090E09A83898386E9DC
:1019B00090E09C838B8385E090E09E838D83F894F8
:1019C00080EA9FE00197F1F784E687BD88BD109219
:1019D0002D0410922C0480912C0490912D0490934E
:1019E0002B0480932A040E94DA070E94C8071092F1
:1019F000DB051092DA058091DA059091DB05909372
:101A0000100580930F0580910F059091100590931C
:101A1000FF058093FE058091FE059091FF05909350
:101A20000C0580930B051092E4051092E30580915C
:101A3000E3059091E4059093CE058093CD058091C8
:101A4000CD059091CE059093E7058093E6058091B2
:101A5000E6059091E70590930A0580930905109299
:101A6000790410927804809178049091790490938D
:101A70006F0480936E04789484EB90E090932D042F
:101A800080932C0480912C0490912D0490932B042E
:101A900080932A0420EA3FE0F89480910B0590910E
:101AA0000C05865E914038F48091090590910A05F5
:101AB000865E914050F0789426960FB6F894DEBF7B
:101AC0000FBECDBFCF91DF9108957894C9010197E2
:101AD000F1F7C9010197F1F7DFCFDF93CF93CDB7CE
:101AE000DEB728970FB6F894DEBF0FBECDBFBE019C
:101AF0006F5F7F4F4AE050E00E94D5130E941301B0
:101B000028960FB6F894DEBF0FBECDBFCF91DF9100
:101B10000895DF93CF93CDB7DEB728970FB6F8942B
:101B2000DEBF0FBECDBFBE016F5F7F4F4AE050E00A
:101B30000E94D5130E94130128960FB6F894DEBFB9
:101B40000FBECDBFCF91DF910895EF92FF920F931B
:101B50001F93DF93CF9300D0CDB7DEB7082FF62EBB
:101B6000142F84E189838AEF8A83002329F4662372
:101B700019F483E591E005C189E591E00E94130124
:101B800080912804992787FD90950E94890D8BE606
:101B900091E00E941301812F90E00E94890D013095
:101BA00039F4113019F40E94C20702C00E94C8071C
:101BB00081E0F81639F4113019F40E94DA0702C0F6
:101BC0000E94E6071981F0EAEF2EFFE0FF2E70C0B9
:101BD000812F90E090932B0480932A0480912A0413
:101BE00090912B0488BD80912A0490912B0487BD8D
:101BF00020912A0430912B04898190E0281739071D
:101C000019F484E791E010C080912A0490912B048C
:101C100001966AE070E00E94C213019719F487E709
:101C200091E002C08BE791E00E94130180912A04A9
:101C300090912B0468EF74E04AE050E00E94D513C5
:101C400088EF94E00E941301809104068B3291F496
:101C50008FE791E00E9413010E94CE070E94F207D5
:101C600084E690E020EA3FE0F9013197F1F701972F
:101C7000D9F789C0809104068B3291F48FE891E006
:101C80000E9413010E94CE070E94F20784E690E0B2
:101C900020EA3FE0F9013197F1F70197D9F773C0D6
:101CA00084E690E0F7013197F1F70197D9F71F5FCC
:101CB0008A81811708F08CCF8BE991E00E94130193
:101CC00088E893E120EA3FE0F9013197F1F70197C5
:101CD000D9F784E791E00E94130188EF94E00E9415
:101CE00013011A811150E0EAEE2EEFE0FE2E38C00B
:101CF000812F90E090932B0480932A0480912A04F2
:101D000090912B0488BD80912A0490912B0487BD6B
:101D100080912A0490912B0468EF74E04AE050E02F
:101D20000E94D51380912A0490912B0402966AE0B8
:101D300070E00E94C213019719F487E791E002C096
:101D40008BE791E00E94130188EF94E00E94130159
:101D500084E690E0F7013197F1F70197D9F7115038
:101D60008981181728F60E94CE070E94F207109268
:101D70002B0410922A0410922D0410922C048BEA4A
:101D800091E00E9413010F900F90CF91DF911F916E
:101D90000F91FF90EF9008951F920F920FB60F9240
:101DA00011242F933F934F935F936F937F938F9360
:101DB0009F93AF93BF93EF93FF938091780090919F
:101DC000790090930F0680930E0680910E069091F5
:101DD0000F0690930E0580930D0520910E0630910D
:101DE0000F0680912406909125062817390714F5CF
:101DF000789487EB91E00E94130180917800909194
:101E0000790068EF74E04AE050E00E94D51388EF53
:101E100094E00E94130188EE93E020EA3FE0F9018C
:101E20003197F1F70197D9F780EC91E00E94130107
:101E3000F894FFCFFF91EF91BF91AF919F918F9158
:101E40007F916F915F914F913F912F910F900FBEB6
:101E50000F901F9018950F931F93DF93CF93CDB7DB
:101E6000DEB72C970FB6F894DEBF0FBECDBF87EC60
:101E700091E00E94130184EF91E00E9413018CE62F
:101E800090E08E010F5F1F4FB8014AE050E00E94C2
:101E9000F613C8010E9413018CEF91E00E94130118
:101EA0008FEF91E00E94130189E292E00E941301FA
:101EB0000E941F0280E091E00E9413012C960FB651
:101EC000F894DEBF0FBECDBFCF91DF911F910F9170
:101ED0000895DF93CF93CDB7DEB728970FB6F89468
:101EE000DEBF0FBECDBFBE016F5F7F4F4AE050E047
:101EF0000E94F6130E94130128960FB6F894DEBFD5
:101F00000FBECDBFCF91DF910895CF92DF92EF92B8
:101F1000FF920F931F93DF93CF93CDB7DEB72C972C
:101F20000FB6F894DEBF0FBECDBF182FD62EC42E2D
:101F300083E492E00E941301812F90E08E010F5FF5
:101F40001F4FB8014AE050E00E94F613C8010E94FA
:101F50001301ADE4EA2EA2E0FA2EC7010E9413019C
:101F60008D2D90E0B8014AE050E00E94F613C801C0
:101F70000E941301C7010E9413018C2D90E0B8014B
:101F80004AE050E00E94F613C8010E941301C70105
:101F90000E9413018FE492E00E9413018091E505F5
:101FA00090E0B8014AE050E00E94F613C8010E9498
:101FB0001301C7010E94130186E592E00E941301FC
:101FC0008091260490E0B8014AE050E00E94F613A8
:101FD000C8010E941301C7010E9413012C960FB67D
:101FE000F894DEBF0FBECDBFCF91DF911F910F914F
:101FF000FF90EF90DF90CF900895CF92DF92FF9205
:102000000F931F93CF93DF93809180008F778093FE
:1020100080008EE592E00E94130110EAC12E1FE0BD
:10202000D12E80912404882321F08091040680938E
:10203000BC058091BC058E3031F48091D40580932D
:10204000BC05109204068091BC05803109F4EBC0F8
:10205000813168F4843081F1853018F4823009F7D9
:1020600017C0863009F43FC08F30D9F6B9C08B3124
:1020700009F46CC18C3130F4813109F400C189312B
:1020800081F602C18C3109F48AC18E3251F6B7C192
:102090008CE792E00E9413018091BC058093D405E7
:1020A000109204061092BC0588EE93E0F601319779
:1020B000F1F70197D9F7B5CF8091BC058093D4058E
:1020C000109204061092BC0585E892E00E9413016C
:1020D00081E061E041E00E94A50D81E061E040E027
:1020E0000E94A50D9ECF82E992E00E9413011092FA
:1020F000040681E080932A0681E28093E50580E270
:1021000093E0F6013197F1F70197D9F710922A067B
:102110008FE992E00E9413018CE195E2F60131977C
:10212000F1F70197D9F78091800080688093800053
:1021300084EF91E0F6013197F1F70197D9F70E940A
:102140000108809180008F778093800080E197E282
:10215000F6013197F1F70197D9F70E942B0200E0C1
:102160001FC08EEB92E00E941301F894FE01E85725
:10217000FA4F8081FE01EE0FFF1FDF01A257BB4F18
:102180006D917C91E95EFA4F408151810E94850FEB
:1021900084E690E0F6013197F1F70197D9F70F5FE8
:1021A000C02FD0E08091680490E005968C179D07C1
:1021B000C4F60E941F0288EE93E0F6013197F1F712
:1021C0000197D9F781E080932A068BE08093E5059B
:1021D00080E991E0F6013197F1F70197D9F721CF26
:1021E00080EC92E00E9413011092040681E080933B
:1021F0002A0681E28093E50580E293E0F6013197BB
:10220000F1F70197D9F710922A0681E080932A0608
:102210008BE08093E50580E991E0F6013197F1F7D5
:102220000197D9F7FECE8FEC92E00E941301109235
:1022300004061092BC0581E080932A0681E2809317
:10224000E50580E293E0F6013197F1F70197D9F7C0
:1022500010922A0684EF91E0F6013197F1F7019789
:10226000D9F781E080932A068BE08093E50580E929
:1022700091E0F6013197F1F70197D9F7D2CE10929C
:1022800004060E94D30ACDCE8091BC058093D4056C
:102290001092BC0589ED92E00E94130181E08093C9
:1022A0002A068091800080688093800080E093E01F
:1022B0000E94130184E690E0F6013197F1F701974F
:1022C000D9F7FF24F394809104068B3241F18EEB11
:1022D00092E00E941301F894009178001091790027
:1022E000789488E193E00E941301C80168EF74E0DC
:1022F0004AE050E00E94F61388EF94E00E94130138
:102300008DE492E00E94130187EE93E0F60131978D
:10231000F1F70197D9F7F39484E0F816A1F68091CC
:1023200080008F77809380008FE193E00E941301FB
:1023300083E68093040681E68093BC0588EE93E0F3
:10234000F6013197F1F70197D9F76BCE81E393E06E
:102350000E9413011092040681E080932A0681E214
:102360008093E50580E293E0F6013197F1F701975C
:10237000D9F710922A068BE393E00E9413010E9482
:10238000CC0C81E080932A068BE08093E50580E900
:1023900091E0F6013197F1F70197D9F742CE8DE53B
:1023A00093E00E9413011092040681E080932A06B4
:1023B00081E28093E50580E293E0F6013197F1F741
:1023C0000197D9F710922A068DE693E00E94130137
:1023D0000E944F0B84EF91E0F6013197F1F70197DE
:1023E000D9F781E080932A068BE08093E50580E9A8
:1023F00091E0F6013197F1F70197D9F712CE82E813
:1024000093E00E9413010E942B0281E080932A0630
:1024100081E28093E50580E293E0F6013197F1F7E0
:102420000197D9F710922A068091800080688093E6
:10243000800087EA93E00E94130184E690E0F601B1
:102440003197F1F70197D9F701E08EEB92E00E9406
:102450001301F89480917F0560918005409181057A
:1024600078940E94850F87EE93E0F6013197F1F79B
:102470000197D9F70F5F0B3041F7809180008F777C
:10248000809380008CEB93E00E94130181E08093A5
:102490002A060093E50580E991E0F6013197F1F70E
:1024A0000197D9F710920406BCCD0F931F938FE7C5
:1024B00084B915B817B887EF88B984EF8AB98BE06B
:1024C0008BB940E020EA3FE02D9AC9010197F1F76E
:1024D000C9010197F1F7C9010197F1F72D9881E63C
:1024E00090E0F9013197F1F70197D9F74F5F4A3042
:1024F00059F780E592E0909325068093240620E02A
:1025000030E042E050E060EA7FE0309904C0509350
:10251000250640932406319904C050932506409324
:102520002406329904C05093250640932406CB011B
:102530000197F1F72F5F3F4F83E0283E380729F7D7
:102540000E946E050E9432010E94D40180E890E052
:10255000909389008093880011E010932A068BE005
:102560008093E50580E29EE49093FD058093FC0551
:102570009093DD058093DC050E940A03809168003A
:1025800082608093680080916C00816080936C0011
:102590000E9420011093290480912904809328042B
:1025A00083E090E090931F0680931E06909377043B
:1025B0008093760486E190E09093FA058093F90584
:1025C0008091F9059091FA05909303068093020695
:1025D00084E090E09093E9058093E8058091E80518
:1025E0009091E905909308068093070685E690E2AE
:1025F00090931605809315058AE090E00E945300A1
:102600000E947A0478940E942B0F88EE93E020EACF
:102610003FE0F9013197F1F70197D9F710922A06B7
:102620000E9401028DED93E00E9413018091240627
:102630009091250668EF74E04AE050E00E94D513BF
:1026400088EF94E00E941301809124069091250662
:102650008055924021F48BEE93E00E94130180910B
:10266000240690912506029721F486EF93E00E94BC
:1026700013018EEF93E00E94130180910D0590915C
:102680000E0568EF74E04AE050E00E94D51388EF31
:1026900094E00E94130180910E0690910F068055E0
:1026A000924024F48BE094E00E94130189E194E0CD
:1026B0000E94130180910E0690910F06880F991FBA
:1026C0009C0103E0220F331F0A95E1F7820F931F4D
:1026D0009093110680931006809110069091110638
:1026E00066EB70E00E94AE13162F072F862F972FF0
:1026F0006AE070E00E94AE13CB0168EF74E04AE03C
:1027000050E00E94D51388EF94E00E9413018EE1FF
:1027100094E00E941301812F902F6AE070E00E94E4
:10272000AE1368EF74E04AE050E00E94D51388EFE2
:1027300094E00E94130180E294E00E94130181E082
:102740008093240483E68093040681E68093BC058D
:1027500082E68093D4050E94FD0FFDCFAA1BBB1B10
:1027600051E107C0AA1FBB1FA617B70710F0A61B91
:10277000B70B881F991F5A95A9F780959095BC01B2
:10278000CD01089597FB092E07260AD077FD04D0C6
:10279000E5DF06D000201AF4709561957F4F08950B
:1027A000F6F7909581959F4F0895FB019F01E8945E
:1027B0004230C4F04532B4F44A3029F497FB1EF499
:1027C000909581959F4F642F77270E94AE13805D6F
:1027D0008A330CF0895D8193CB010097A1F716F441
:1027E0005DE251931082C9010C940C14FB019F010E
:1027F000423074F0453264F4642F77270E94AE13A0
:10280000805D8A330CF0895D8193CB010097A1F73D
:102810001082C9010C940C14DC01FC01672F71912A
:102820007723E1F7329704C07C916D9370836291B6
:0C283000AE17BF07C8F30895F894FFCF5F
:10283C000D0A000D0950574D206F6E206D697420E4
:10284C0054433150574D5F6F6E000D094D657373D6
:10285C00772E2031323D6D2C20333D6C6920756E06
:10286C006420343D726500093D3D3E3E2077727216
:10287C007875610D0A002064657A203D203078005F
:10288C005858000D0923230D000D094D3162347683
:10289C007A096E6F72676C31320900096D61747060
:1028AC006F7309000D09002C0D09002C2020000D60
:1028BC0009094952436E74726C205B30495D000DFE
:1028CC0009094D6F74205B30495D000D0944726538
:1028DC00687A61686C20766F6C6C000D094D312D37
:1028EC00342053544F50000D094144432009090032
:1028FC000D0953544F50000D0943323235204430EA
:10290C003220783232206D333238704032304D48BC
:10291C007A2032362044657A2032303138203139F1
:10292C003A3236000D09554152542000206B000DEF
:10293C000A0942656665686C20342C362C31352CBE
:10294C0031362C31372C32352C32372C32382C3462
:10295C003620616B7469763B00094D6F742D74736E
:10296C0074205B4D49585D2C2053746F70205B4F65
:10297C00495D00206931322F332F34090009004999
:10298C007376733109006D6F737431320900095419
:10299C00433150574D5F6F6666203D3E204C454499
:1029AC002D50574D203D206F66660D000952433562
:1029BC002023320D000D0D09524335205B4D495833
:1029CC005D0009524335205B503130305D0D0009FC
:1029DC00537461727465204B616C696272696572C3
:1029EC00656E20696E203130207365630D000D001B
:1029FC0009524335205B5550444154455D0D000947
:102A0C00524335205B305D0D000D09524335205B80
:102A1C00395D203D3E2031302323203A2033204D98
:102A2C00657373676E204144432D6E6574746F003B
:102A3C000D095B395D50574D206F6E203E2054437D
:102A4C003150574D5F6F6E00090941444309000D29
:102A5C00095B395D2054433150574D5F6F66660DED
:102A6C000009524335205B565D0D000953746172A9
:102A7C0074652046616872746573742031336D20FF
:102A8C002D2072FC636B77E47274730D0009524352
:102A9C0035205461737465205B5E5D0D00095374C1
:102AAC006172746520466168727465737420313389
:102ABC000D000D095B67656C625D20313078206913
:102ACC0072444D452D4D657373676E206F686E654E
:102ADC00204661687274000D0954433150574D5FA4
:102AEC006F6E3C3D3E50574D3D6F6E000D095B3493
:102AFC00365D54433150574D5F6F6666203D3E2026
:102B0C004C45442D50574D3D6F66660D000955627E
:102B1C006174744144436D696E09002C0963612032
:102B2C00362C352056002C093C20312056000D093E
:102B3C00556261747441444309090009556261741A
:102B4C0074203C362C35563F0009636120002C0064
:062B5C0020560D000100EF
:00000001FF


Das ist laut Compiler eine Programmlänge von 11106 Bytes.

Der File selbst, "D02.hex" hat laut Dateiexplorer (Win7pro, Festplatte 1TB) 31 kBytes. In den "Eigenschaften" des Hexfiles steht aber Größe: 30,5 KB (31.260 Bytes).

Er, "D02.hex", enthält (angesehen mit dem Editor notepad) 29898 Buchstaben in 696 Zeilen (kann oben nachgezählt werden) - ich hab den Zeichensalat aus dem Editor kopiert, in Winword eingefügt und die Statistik gelesen. Pro Zeile des Hexcodes muss man 11 Zeichen abziehen: den Startcode ":", dann Bytecount, Adresse, Typ und Checksumme. Das ergibt dann aus den 29898 Zeichen - minus 696 Zeilen x 11 Zeichen/Zeile - nur noch 22212 Zeichen. Die entsprechen dann dem tatsächlichen Maschinencode im Hexformat.

Es wird EIN Byte Programmcode durch zwei ASCII-Zeichen repräsentiert, beispielsweise 2 Bytes "0c 94" für den Jumpbefehl (ohne Adresse).
Wenn ich jetzt die 22212 (ASCII-)Zeichen durch 2 teile, bekomme ich 11 106 (Programm-)Bytes, also genau das, was mir der Compiler schreibt.

HeSt
27.12.2018, 21:43
Hallo Moppi,
danke für den Link zum M16 und Arduino. Bin schon einige Male über Arduino gestolpert, hab mich aber noch nie damit befasst. Mal schauen, wer weiß ...

Hi Joe,
danke für die Erläuterung zu den Zahlen einer Hex-Dateigröße.
Ist schon interessant! Dass allerdings der Unterschied so eklatant ist war mir nicht bewusst!
Auf das Nachzählen hab ich übrigens verzichtet ;)

Gute N8 allen!

wkrug
27.12.2018, 23:19
Bin schon einige Male über Arduino gestolpert, hab mich aber noch nie damit befasst. Mal schauen, wer weiß ...
Diese ARDUINO Geschichte ist im Prinzip eine Hardware ursprünglich basierend auf ATMEL AVR Controllern.
In der Zwischenzeit gibt's auch Varianten mit potenteren Controllern.
Alle diese verschiedenen Platinen mit den unterschiedlichen Controllern lassen sich über eine Entwicklungsumgebung programmieren - ARDUINO IDE.
Die Sprache die dabei benutzt wird ist C sehr ähnlich.
Alle Arduino Controller verfügen über einen Bootloader, somit kann eine geänderte Software per Bootloader in den Chip geschoben werden.

Der große Vorteil ist, das die Platinen inklusive Peripherie und Stromversorgung schon fertig aufgebaut sind.
Für eigene Erweiterungen kann man dann Aufsteckplatinen drauf machen die hier Shield's genannt werden.

Ich bin in der Arduino Welt noch nicht angekommen, da Ich für meine Projekte gerne eigene Layouts verwende.
Wenn Ich hier was falsches über den Arduino behauptet habe, bitte Ich mich zu korrigieren - Wie gesagt Ich arbeite nicht damit.

HeSt
28.12.2018, 08:42
Ich bin in der Arduino Welt noch nicht angekommen, da Ich für meine Projekte gerne eigene Layouts verwende.
Ich bin mit dir.
Auch ich mach mir meine Platinen selber.
Absolut und optimal zugeschnitten auf das was das Ding tun/können soll/muss.
Keinen zusätzlichen Ballast.

wkrug
28.12.2018, 11:03
jaja, C ich weiß. Aber soll ich in meinen alten Tagen noch C lernen?
Auch Ich bin nicht mehr ganz Taufrisch!.
Ich hab auch lange Zeit nur in Assembler programmiert und hab mich dann zu C überreden lassen.
Vorweg - Ich hab es nicht bereut.
Die Entwicklungszeit gegenüber Assembler würde Ich auf etwa 20% schätzen.

Angefangen hab Ich mit CodeVision AVR - Das würde Ich Dir auch empfehlen.
Die Einsteiger Variante ist bis 2k Maschinencode frei.
Das tolle an der Software ist der Automatic Programm Generator.
Nach dem Start neues Projekt anlegen, den APG starten, die gewünschten Einstellungen machen und schon ist der Quelltext für die Grundeinstellungen des Controllers gemacht.
Auch die Grundstruktur für aktivierte Interupts legt der automatisch an.
So eine Display Einbindung passiert hier weitgehend automatisch!
Auf Dauer und für größere Projekte muss man dann die Vollversion kaufen die mit etwa 160,-€ mit einem Jahr Support doch recht teuer ist.

Ich bin dann auf AVR GCC umgestiegen der dann im ATMEL Studio 7 mit integriert wurde.
Der Grund war, das es hierfür eine riesige Menge getestete Library's gibt, die man für seine Projekte nutzen kann und natürlich der finanzielle Aspekt.
Direkt mit Studio 7 würde Ich nicht beginnen wollen, da man hier im Prinzip alles händisch machen muss, obwohl es im Programm gute Hilfen gibt.
Das schöne ist, das CodeVision 3.x und Studio 7 in der Grundstruktur weitgehend Code kompatibel sind.
FLASH, EEPROM, Interrupt Behandlung und ASSEMBLER Einbindung sind bei den beiden aber leider völlig Unterschiedlich!

seite5
28.12.2018, 11:33
"Arduino Welt" - Was soll das denn sein? Ein paar profitgeile Marketing-Dödel ordnen neuerdings jedes fertig gelötete Board diesem Schlagwort zu.
Diese Boards sind auch mit jedem anderen µC und jeder anderen IDE verwendbar. Viele dieser Sensor-, Treiber-, µC- u.ä. Boards sind billiger,
als wenn man Bauelemente und PCB selber kauft/anfertigt, vom Zeitfaktor mal ganz zu schweigen. Ich find's toll, in ein paar Minuten etwas "zusammenzustecken"
und dann mit der Programmierung zu beginnen.
Arduino: mMn., wer sich wirklich ernsthaft mit Elektronik/Programmierung befassen will, sollte darauf verzichten, oder rechtzeitig "den Absprung schaffen".
CVAVR/AS 7.0: Hab auch mit CVAVR angefangen. Für mich einziger Vorteil: EEPROM- und FLASH-Variablen können genauso gehandelt werden, als wären sie
im RAM abgelegt. Man kann also mMn. ebenso mit AS 7.0 anfangen, mit dem ASF hat man mindestens genau so viele Bibliotheken als Unterstützung, die
Dok's und Beispiele im Netz sind mehr als ausreichend vorhanden, und man deckt die gesamte Atmel-Reihe vom 8-pin-8-bit bist zum ARM Cortex 4F ab.
Nachteil: Wer weiß, wie lange MicroChip noch die ehemalige Konkurrenz "am Leben" lässt, in einigen Bereichen (32-bit) haben sie ja jetzt schon ihren PIG
dem AVR32 vorgezogen, ganz zu Schweigen von der beginnenden Schlamperei bei Datenblättern (s. anderer Thread).
mfg
Achim

Moppi
28.12.2018, 12:27
Ich bin in der Arduino Welt noch nicht angekommen, da Ich für meine Projekte gerne eigene Layouts verwende.


Mir geht es doch ganz genau so, dass ich gerne lieber alles selber mache. Aber ich habe sehr lange in Maschinensprache und dann mit Assembler programmiert. Ich war absolut begeistert und es gibt nichts besseres. Bis ich mal größere Projekte machen wollte (ich habe mehrere Projekte - die auch nicht klein waren - nur mit Assembler umgesetzt und wenige Macros verwendet). Als ich vom Commodore64 auf PC umstieg, habe ich mit DEBUG.COM angefangen Programme zu schreiben. Das führte dazu, dass ich später sogar in der Lage war, mit einem Hexeditor Dateien zu öffnen oder mit Symantec Disk-Tools Sektoren einzulesen und diese relativ gut lesen zu können. - Nicht alles natürlich aber so die wichtigsten Dinge, die am häufigsten vorkamen: JUMPs, CALLs usw. die nächste für mich interessante Unabhängigkeit habe ich mit JavaScript erlebt und programmiere seit dem sehr viel damit, Java kann ich zur Ergänzung benutzen. Nun wollte ich irgendwann die Grenzen durch Kontroller erweitern, so bin ich dann auch hier gelandet. Die Arduino-IDE ist nicht verkehrt, weil man damit eben auch z.B. das nodeMCU programmieren kann. Kann ich einen Arduino UNO oder einen (ATmega328) damit programmieren, kann ich auch nodeMCU programmieren (vornehmlich wegen Netzwerk). Mit beiden diesen Sachen kann man schon eine ganze Menge machen, wenn kleine Helferchen gebaut werden sollen.
Maschinensprache werde ich auch immer wieder benutzen, wenn es notwendig ist.


MfG

021aet04
28.12.2018, 12:29
Ich verwende auch das AVR Studio (4 und 7) und schreibe die Programme in C. Ich verwende zum Testen die Arduinos (seit neuesten) und flashe weiterhin über ISP und verwende den Bootloader nicht. Wenn ich ein Schaltung entwerfe verbaue ich aber nicht die Arduinos sondern direkt die uC, da ich flexibler bin. Aber zum Testen sind die Arduinos sehr komfortabel. Shields o.Ä. verwende ich nicht.

Wenn du schon in ASM programmierst hast du auch einen Programmer und somit würde ich dir raten in C zu schreiben (AVR Studio ist kostenlos) und mit diesem Programmer zu flashen. Wenn das auch ein Debugger ist kannst du auch den C-Code direkt debuggen (wenn der Debugger vom AVR Studio unterstützt wird).

MfG Hannes

HeSt
28.12.2018, 14:40
Hallo Leute,
gemach, gemach!


Jetzt will ich erst mal meinen Solartracker mit der LCD-Anzeige und Änderungsmöglichkeit der Parameter darüber fertig bringen.
Wird noch eine Weile dauern, weil ich nicht immer Zeit hab und auch nicht immer Lust dazu.
Ob überhaupt und wenn was ich nachher angehe steht derzeit in den Sternen.
Den Code schreibe ich mit einem ganz normalen Texteditor.
Umgewandelt wird er dann noch mit AVR-Studio4. Das 6er hab ich zwar installiert, verwende es aber bislang noch nicht. Bin das 4er einfach gewöhnt.


Ob ich danach irgend eine andere Sprache genauer unter die Lupe nehme ...???
Mal sehen.


LG Heinz

wkrug
28.12.2018, 15:16
@seite5
Wenn Ich direkt mit AVR GCC angefangen hätte, hätte Ich mit ziemlicher Sicherheit niemals C Programmierung gelernt.
Man braucht da schon ein gehöriges Vorwissen um damit zu arbeiten.
CodeVision fand Ich da wesentlich einfacher und unkomplizierter.
Studio 7 ist ne gute und mächtige Entwicklungsumgebung - auch die neuesten Controller sind in den aktuellen Versionen implementiert.
Im Internet gibt es massig Beispiele und Hilfen, die aber einem absoluten C Anfänger relativ wenig bringen.
Eine Dauerlösung ist IMHO CodeVision nicht! Man kann sich aber damit das Grundwissen aneignen, das man dann für das Studio 7 braucht.
Auf meinem Rechner hab Ich übrigens beide Programme laufen.

Ist halt meine Meinung. Ich gestehe da auch jedem seine eigene Meinung zu diesem Thema zu.

@HeSt
Da Du dein Assemblerprogramm ja nun schon sehr weit gebracht hast, würde Ich das jetzt auch abschließen.
Unabhängig davon kannst Du dir ja mal so nen C Compiler anschauen.
Zudem können mit Studio 7 auch Assembler Projekte erstellt werden.

HeSt
28.12.2018, 16:00
Auch ich gestehe jedem seine Art zu bauen und zu programmieren zu.

Mag schon sein, dass ich mich noch mit einer höheren Sprache beschäftige.
Ich hab mir vor einigen Jahren zwei Bücher zugelegt. Eines für Bascom-AVR, das andere Assembler und C. Bascom hat mich nicht vom Hocker gehauen. Hab früher mal Basic und Clipper programmiert (für Vorgänger der PC's). Aber das ist lange her.
Wobei letzteres Buch für einen Laien (als solchen sehe ich mich, auch wenn ich schon ein paar Jahre Assembler programmiere) leider sehr unübersichtlich (verschachtelt) und "UNI-mäßig" geschrieben. Es wird einiges vorausgesetzt, was ich jedoch in diesem Umfang (noch) nicht mitbringe.

Für die Hilfe, die ich hier im Forum immer wieder erhalte, bin ich sehr dankbar!
Zudem hilft es mir auch dann Abschnitte des Buches (besser) zu verstehen.
Der Abschnitt für "C" des Buches ist für mich nur kryptisch - derzeit. Und in keiner Weise nachvollziehbar.
Deshalb bleib ich auch noch beim Assembler.

Jedenfalls danke für die vielen Tipps von euch für einen erleichterten Einstieg in die nächste Ebene!!
Bevor ich das nächste Projekt angehe (wer weiß wann?), werd ich daran denken ...

HaWe
28.12.2018, 19:12
Dann leg doch gefälligst mal deine Vorurteile ab und beschäftige dich halt mal mit dem Arduino-Konzept! Das hat nicht ohne Grund einen beispiellosen weltweiten Siegeszug erzielt, durch plattformübergreifende C++ Libraries!

HeSt
29.12.2018, 07:36
Hi HaWe,

wer hat hier etwas von Vorurteilen geschrieben ...?

Da kommt mir ein Vergleich in den Sinn:
Warum fahren so manche Leute einen hart gefederten, unkomfortablen MG, wo man doch wesentlich komfortablere Vehikel fahren könnte?
Schlichtweg, weil es ihnen gefällt und sie Spaß daran haben.
Solche Leute haben auch keine Vorurteile gegen andere Autos ...
Sie fahren meist auch solche.

Ich hab eben vor langer Zeit mit Assembler angefangen, weil mir damals ein ehemaliger Kollege dazu geraten hat.
Da gabs noch keine µC wie sie heute auf dem Markt sind. Somit auch noch keine komfortablen Sprachen wie heute.
Ich wollte einfach basteln. Hab aber nie wirklich was gemacht, weil es keine konkreten Projekte gab.
Deshalb blieb meine Kenntnis über Assembler auch im - sagen wir - Anfangsstadium.

In meinen Augen hat es sich bei den wenigen kleinen Projekten schlichtweg noch nicht ausgezahlt (oder gerechnet - sieh es wie du willst), mich eingehend mit anderen Sprachen zu beschäftigen.
Ich hab auch nicht gesagt, dass ich es nie versuchen werde.
Begonnen hab ich ja immer wieder damit (wie oben geschrieben, mir auch Bücher gekauft). Aber es hätte immer zu lange gedauert, bis ich mein Projekt, das gerade anstand, fertig geworden wäre. Hätte ich es mit einer neuen Sprache begonnen, die ich erst lernen hätte müssen.
Ich beschäftige mich immer nur dann mit µCs, wenn ein Problem einer Lösung damit bedarf. Und das ist eher selten. Dafür soll/muss es rasch umgesetzt werden.
Und einfach nur C++ zu lernen ohne ein konkretes, umfangreicheres, langfristigeres Projekt zu haben, macht nicht wirklich Spaß. Bisher hatte ich keines.

Aber ganz einfach:
Falls es dich aufregt, dass ich mich bislang nicht "missionieren" hab lassen:
beschäftige dich einfach nicht mehr mit meinen Foreneinträgen, wenn sie mit Assembler zu tun haben.
Damit Ende der Diskussionen.

HaWe
29.12.2018, 10:33
Sorry, ich hatte vergessen auf Zitat zu klicken.
Ich bezog mich auf User seite5
Arduino Welt was soll das denn sein und hatte auf dem Handy mangels Übersichtlichkeit die Postings verwechselt. Arduino ist ja auch open source und public domain und hat absolut nichts mit profitgeilen Marketing Dödeln zu tun.

avr_racer
29.12.2018, 11:25
Hallo allerseits,

ich möchte nun endlich mit der Verwendung eines Displays an einem Mega8 oder/und Mega16 beginnen.
Einige Beiträge habe ich ja schon gesichtet und studiert ... bin aber noch nicht ganz schlau daraus geworden ...
Nun meine Fragen:
Kann ich für einen 4-Bit-Betrieb des LCDs nur EINEN Port nutzen, wie es mir vorschwebt (siehe unten), oder muss ich Steuer- und Datenleitungen an getrennten Ports ausgeben?
Wenn getrennt, hilft mir ja eine 4-Bit-Anwendung nichts, da ich mit den anderen 4-Port-Pins nichts steuern kann, weil ja bei der Ausgabe (einem OUT PORTx,ldc_data) ALLE PINs des PORTs angesprochen werden und somit andere Funktionen mit angesteuert würden!?.

ZB (M16):
; PC0 / 22 > + Transitor VCC to LCD
; PC1 / 23 LCD RS (register select)
; PC2 / 24 LCD RW (read/write)
; PC3 / 25 LCD E (enable)
; PC4 / 26 \
; PC5 / 27 \ > Datalines for LCD 1602
; PC6 / 28 /
; PC7 / 29 /

Gruß Heinz

Du kannst grundsätzlich es so machen wie es dir beliebt. Ein Port für alles, ein Port für Steuer und ein Port für Datenleitungen oder im schlimssten Falle, falls der Port nicht ganz ausreicht auch nur einen Pin auf einen anderen Port legen.
Bezug auf "weil ja bei der Ausgabe (einem OUT PORTx,ldc_data)":
ldc_data = ein Register und im 4bit- Modus müssen eben 2mal 4bit übertragen werden. Somit bleibt das Highnibble immer 0 bei der Vorverabeitung. Damit das LCD die Daten auch richtig verarbeitet kann zb das RW, RS oder das Enablebit einzelnd gesetzt werden.
RS, RW, Enable können als Bit/s deklariert werden
1 = RS
2 = RW
3 = Enable

zB:

out PORTx , LCD_DATA
sbi PORTx , RS
sbi PORTx , RW
sbi PORTx , Enable

übersetzt ohne Deklarationen

out PORTC , R16
sbi PORTC , 1
sbi PORTC , 2
sbi PORTC , 3

Letztendlich dienen die Deklarationen nur der Lesbarkeit in allen Programmiersprachen.
https://www.mikrocontroller.net/articles/AVR-Tutorial:_LCD

Seriele 8bit-Ausgabe mit kleiner Hardwareerweiterung
https://www.roboternetz.de/community/threads/66675-LCD-Seriel-ATMega8

https://www.roboternetz.de/community/forums/70-Bascom-C-ASM-Sketch-Codesammlung-Programmschnipsel/page2



Wo ich auch noch grüble ist, wie ich ADC-Werte in Volt umrechne und diese mit zumindest einer Kommastelle ausgeben kann - in Assembler!


Guck mal hier
https://www.roboternetz.de/community/threads/64609-AtMega8-kleine-Bibliothek
beinhaltet mehrere 16bit Matheroutinen.

seite5
29.12.2018, 14:45
Arduino ist ja auch open source und public domain und hat absolut nichts mit profitgeilen Marketing Dödeln zu tun.
... träum weiter.

mfg
Achim

HeSt
29.12.2018, 14:59
Hi avr_racer,

danke für deine Erklärungen.

Das hab ich mittlerweile bereits so übernommen.

Und danke für die Links!!
Mit den Bibliotheken hab ich so mein Problem, weil ich den Programmierstil und Benamselung übernehmen müsste.
Und bevor ich meine Programme daran anpasse, bin ich schneller, wenn ich mir ansehe, verstehe wie Routinen geschrieben sind, um sie dann in "meiner Welt" umzusetzen.
Wahrscheinlich hab ich auch noch nicht kapiert, wie man "fremde" Bibliotheken verwendet. Aber bislang scheint es bei mir keinen Sinn zu machen (im Sinne von .include ...).
Wer weiß, vielleicht bringt mir noch wer bei, wie man es richtig macht.

avr_racer
29.12.2018, 17:24
Die Namensvergabe liegt ganz bei dir, das was für dich in deinem Programm für das jeweilige Projekt sinnhaft erscheint. Ein Ausblick für die Zukunft zeigt aber das man die entsprechenden Deklarationen beibehalten sollte, was eine enorme Verkürzung der Programmierung mit sich bringt. Hochsprachen sind auch nichts weiter als der sinnvolle Einsatz von Bibliotheken...

Diese Bibliotheken gibs halt auch in C, C++, C# usw auch diese mussten mal geschrieben werden... nur am Rande.

Bibiliotheken müssen nicht mal fremd sein es können auch deine eigenen sein aber es ist doch Schwachsinn sich jedesmal durchs Datenblatt des Controllers zu lesen.... Mensch wie wär did doch gleich... was ab und an Zeitaufwendig sein kann.

Zum einbinden der Includes gibs 2 Möglichkeiten:
1. alle Includedateien befinden sich in deinem Projektordner für das jeweilige Projekt. Das einbinden erfolgt dann ganz unten in deiner Hauptdatei.
Beispiel:
Hauptdatei = test.asm
.include "controller"
Dekalerationen Register/RAM
Interrauptvektoren mit Sprung vom Resetvektor von .org 0000 rjmp INIT
Init von Controller/Ports usw
Hauptprogramm
.include "weitere Unterprogramme"

Nachteil ist wenn man in Unterschiedlichen Projekten die gleichen Routinen/Unterprogramme braucht hat man vllt das Original verändert...

2. Wenn man sich seine eigenen Bibiliotheken schreibt werden alle Routinen, die allgemein sind, in einen Ordner aufbewahrt, selbiges trifft auch für controllergebundene Routinen zu die in zb in ATmega8 Ordner abgelegt werden. Bei einem neuen Projekt werden die entsprechenden Dateien einfach nur kopiert und siehe Punkt 1 als Include eingebunden.

Vorteil du kannst in dem jeweiligen Projekt die Dateien unter Umständen anpassen ohne das es sich auf andere Projekte auswirkt.

So wie du angefangen hast hab ich auch mal angefangen bis mir folgender Satz entgegen gebracht worden ist:
Lieber gut kopiert als schlecht selbstgeschrieben! Verfasser unbekannt. Lernen heißt kopieren gerade am Anfang.

Hast du denn mal Programmcode den man sich mal anschauen kann ?
Mit welcher Software prgrammierst du AtmelStudio 4/7 ?

http://www.avr-asm-tutorial.net/avr_de/beginner/warum.html
http://www.avr-asm-tutorial.net/avr_de/index.html

HeSt
29.12.2018, 20:53
Was mich abhält fertige (fremde) Bibliotheken zu verwenden ist die Tatsache, dass andere Definitionen von Registern und dergleichen verwendet werden. Sie passen absolut nicht in meine Namensgebung. Wie kann ich sie denn da einbinden!?

Lieber gut kopiert als schlecht selbstgeschrieben! Verfasser unbekannt. Lernen heißt kopieren gerade am Anfang.
Das mache ich ja, indem ich mir Bibliotheken schnappe, den Code kopiere und an meine Umgebung anpasse. Aber einfach mit .include einbinden ist nicht möglich.

Mit welcher Software prgrammierst du AtmelStudio 4/7 ?
Zum "Schreiben/Codieren" verwende ich einen ganz normalen Texteditor.
Zum Compilieren verwende ich AVR Studio4 (hab 6 auch auf dem Rechner, aber 4 bin beim debug gewöhnt). Und noch reicht 4, da all meine µCs enthalten sind.
Zum codieren ist mir AVR zu umständlich.

Hast du denn mal Programmcode den man sich mal anschauen kann ?
Sieh PN

avr_racer
30.12.2018, 10:52
Was mich abhält fertige (fremde) Bibliotheken zu verwenden ist die Tatsache, dass andere Definitionen von Registern und dergleichen verwendet werden. Sie passen absolut nicht in meine Namensgebung. Wie kann ich sie denn da einbinden!?


Ähm auch da ist das Studio hilfreich in dem man einfach STR+F drückt und alles mit dem gesuchten Wort ersetzen kann wenn man es unbedingt umändern möchte.
Oder man schreibt es eben komplett ab mit seiner Namensgebung



Das mache ich ja, indem ich mir Bibliotheken schnappe, den Code kopiere und an meine Umgebung anpasse. Aber einfach mit .include einbinden ist nicht möglich.


mmhhh gut da brauch ich erstmal den Quellcode.
Für Studio4
http://www.alenck.de/AVR_Tutorial_Gruppe_200_Tools/205_Assembler_und_AVR_Studio/Tools_205.pdf




Zum "Schreiben/Codieren" verwende ich einen ganz normalen Texteditor.
Zum Compilieren verwende ich AVR Studio4 (hab 6 auch auf dem Rechner, aber 4 bin beim debug gewöhnt). Und noch reicht 4, da all meine µCs enthalten sind.
Zum codieren ist mir AVR zu umständlich.

persönlich habe ich mit einem reinen Editor nie gearbeitet fands immer problematisch.
Studio 4 ist in Performance gegebenüber 4+ unschalgbar.



Sieh PN
PN

Moppi
30.12.2018, 14:22
@HeSt (https://www.roboternetz.de/community/members/36933-HeSt)

Wenn Du nur Texteditor benutzt zum programmieren, dann schau Dir doch mal EditPad an. Ich verwende unter Windows immer schon EditPad Lite. Unter DOS habe ich in den 90ern immer mit Tempest gearbeitet (Data Becker) das fand ich für DOS genial.
Ich weiß nicht, ob es das EditPad, wie ich es nutze, mittlerweile noch zum Download gibt, aber es gibt eine Pro-Version davon: http://www.editpadpro.com/de.html

MfG

HeSt
30.12.2018, 21:00
So, Leute,
danke für eure guten Tipps!

Aber belassen wir es dabei, wie es derzeit ist:
Ich arbeite auf einem MacBook und schreibe mit dem standardmäßigen Texteditor (den kenn ich in- und auswendig).
Das AVR-Studio läuft in einer Windows-Session am Mac. Wird nur zum umwandeln und debuggen gestartet/genutzt.

Damit möchte ich die Diskussion über wie was womit besser/einfacher zu handhaben ist als beendet wissen.

Nun wünsche ich euch noch einen Guten Rutsch!!

wkrug
31.12.2018, 09:56
Damit möchte ich die Diskussion über wie was womit besser/einfacher zu handhaben ist als beendet wissen.
Hast ja Recht! Das hat mit dem Ursprungsthema nix mehr zu tun.
Wenn Du Dich ja doch noch umentscheidest und Probleme hast, kannst Du nen neuen Post machen.
Für alle hier einen guten Rutsch!!!

HeSt
01.01.2019, 16:01
Willkommen im Neuen Jahr!

Ich wollte mir zum Jahresbeginn eine Freude machen und hab den Test mit dem T24 versucht.
Leider kein guter Jahresbeginn :(

Den Code mehrfach überprüft, auch den Testaufbau. ICH kann keinen Fehler entdecken.
Möglicherweise ist mein LCD defekt. Hab es mittlerweile ein paar Jahre rum liegen. War zwar immer verpackt, aber ???
Egal ob der µC in der Schaltung steckt oder nicht, das LCD bleibt finster. Nur wenn ich das Kontrastpoti fast auf GND drehe, ist die zweite Zeile voll mit 5x7 Blöcken.
Die obere Zeile bleibt ganz finster. Kann das normal sein?

Vielleicht hat jemand Zeit und Muße und schaut mal über meinen Code, ob ich da einen Fehler übersehen hab bzw. mir dessen gar nicht bewusst bin.

Moppi
01.01.2019, 16:32
Ich denke, wirst Du schon untersucht haben, aber trotzdem noch mal:
Auch keine Kontaktschwierigkeiten mit irgendwelchen Anschlussadern am Display oder sonst wo? Stecker ab?

MfG

wkrug
01.01.2019, 16:44
die zweite Zeile voll mit 5x7 Blöcken.
Die obere Zeile bleibt ganz finster. Kann das normal sein?
Ich glaube nicht, das das Display defekt ist.
Das ist üblicherweise so, wenn das Display nicht richtig initialisiert wurde.
Schau mal Deine Init Routine und die Verbindungen zum Display durch!
Im Simulator vom AVR Studio kannst Du den Code ja mal Schritt für Schritt durchklicken.

HeSt
01.01.2019, 16:44
@ Moppi
Ja, auch nachgemessen ...

@wkrug,
Im Sim scheint alles ok zu laufen. Zumindest läuft alles nach meinem Gedankengang ab.
Ist er richtig?

Siro
01.01.2019, 17:18
Das beschriebene Verhalten klingt völlig normal, glaube auch nicht dass das Display defekt ist.

Die Displays benötigen aber einen gewisse Zeit bevor sie überhaupt ansprechnbar sind, da sie nach dem Anlegen der Versorgung einen internen Reset ausühren.
Bevor Du also irgendwelche Zugriffe tätigst, muss vorher eine Wartezeit genereirt werden.
Vielleicht liegt es daran.

Siro

wkrug
01.01.2019, 18:10
Also irgendwie komm ich mit dem Timing nicht so ganz mit.
Bei 1Mhz sind die Zeitschleifen zu lang (200ms bei 46msRoutine), bei 8 MHz sind es dann nur 28ms.
Auf jeden Fall bei mir im Simulator.
Der tiny24 hat auch keinen SPH?

Siro
01.01.2019, 19:48
Ein Tipp von mir, wie ich es auch immer gemacht habe und immer noch mache bis die Displays Leben zeigen:

Baue zunächst eine "lange" Warteschleife die "mit Sicherheit" mindestens 100ms dauert.
Dann benutze diese "überall". So kannst Du zunächst mal ein Timing Problem ausschliessen,
wenn es dann noch nicht geht, liegt das Problem bei der Ansteuerung selbst.
Bis das Display läuft, solltest Du generell die Lange Wartezeit benutzen.
Auch bei den Signalen von Enable RS usw, LAAAAANGE Schleifen zum Testen, das tut ja keinem weh....
Man verheddert sich sonst. Schnelligkeit Optimierung erst wenn das Display läuft.

Es scheint ja noch nicht einwandfrei geklärt zu sein, wie lange deine Funktionen wirklich warten

Dann fällt mir grade noch auf:
Du initialsierst dein Display dauernd neu:
ich würde die Initialisierung wohl eher so machen:



rcall lcd_init ; Initialisierung nur EINMAL
DSP_MOD:

....
rjmp dsp_mod ; Hauptschleife ohne neue Inititialisierung


Das SPH Register in deinem Tiny24 existiert tatsächlich nicht, hat wkrug recht, das gibts erst beim Tiny84 mit 512 KByte RAM
Die Initialisierung gleich beim Start für den Stack scheint okay und somit universell. Ich denke das kann bleiben.
Es gibt jedoch Controller die bei derartigen Zugriffen (auf Registern die nicht existieren) mit einer Speicherschutzverletzung reagieren und das System anhalten,
ich glaub aber nicht bei deinem.
Mich wunderte zudem noch der "OUT" Befehl für den Stackpointer:
Aber der Stackpointer liegt tatsächlich im IO Bereich, ungewöhnlich aber völlig korrekt.

Siro

avr_racer
01.01.2019, 22:48
So hab mal durchgeschaut... und das ein oder andere wurde schon angesprochen wie z.B. der Stack oder die Init.
33900

Wenn du das LCD richtig angeschlossen hast solltest du mal den Kontrast so einstellen das man die Dots 5x7 ein wenig sieht. Kommt hier mit Erhöhung des KOntrastet nur die erste Zeile zum vorscheinen ist die Init des LCD nicht komplett oder unterbrochen worden.

Sag mal wie fit bist du eigentlich im ASM beim AVR ?

1.
In die Initialisierung gehören alle Inits interner sowei externe Peripherie. Ebenso sollten alle Ints, also die gesamte Vectortabelle aufegführt werden entweder.


.org $0000
rjmp INIT
reti
reti
reti
reti
reti
.
.
.
.
.


Oder


.org $0000
rjmp INIT
.org $0001
rjmp ???
.org $0002
rjmp ????
.
.
.
.


Denn wenn der SEI aktiv ist und man vllt sich mal vertan hat und der zugehörige Int wird ausgelöst und diese Tabelle fehlt kann es sein das dein Controller mitten in der Startinit wieder loslegt....


1.1


ldi lcdd,0x28 ;cd_function_set_std: 4Bit,2Zeilen,5*7 Font
rcall lcd_cmd4 ; Enthält bereits eine Zeitschleife
es steht zwar dahinter aber wenn man doch mal fix was ändern möchte ist
folgendes übersichtlicher

;SET Function
.equ F = 2 ;1 = 5x10 0 = 5x7
.equ N = 3 ;1 = 2line(4line) 0 = 1line
.equ DL = 4 ;1 = 8bit int 0 = 4bit interface
.equ HSF = 5 ;immer 1 setzen Symbolisiert das Ende

ldi temp1,(1<<HSF|0<<DL|1<<N|0<<F) ;funktionset
rcall lcd_command ;DatenLine1=8bit, N=1 2zeilig á 40 Zeichen d.h. 4zeilig á 20Zeichen
ret
Die LCD -Deklarationen sollten ebenfalls im Hauptprogramm ganz oben stehen

1.2
Zu den Registern sei gesagt die sollten nur einen allgm. Namen bekommen und haben nicht wirklich was mit den einzelnen Programmteilen, in textlicher Form, was zu tun. Ob es nun lcdd, tempx oder sonst wie benannt wird spielt keine Rolle da diese wirklich meist die absoluten temproären Daten sind und meist nur für die jeweilige Unterroutine wichtig sind.
Daten die über mehrere Funktionen z.B. Sekunden/Minuten einer Uhr von Interesse sind werden im SRAM vorgehalten.
Warum spreche ich das an ?

; ldi XL,0x03 ;clr DSP, Curs > home (01)
; rcall lcd_cmd4 ; Erst wenn die komplette Init fertig ist Cursor Home schicken mit 0x01
;woher also 0x03

; rcall lcd_dlys ;dito

; ldi XL,0x06 ;also entry_mode DSP fest, Curs auto-inc
ldi lcdd,0x06 ; Und warum plötzlich in XL und nicht in lcdd ?
rcall lcd_cmd4 ;

; rcall lcd_dlys ;dito

pop XL
ret
Hier hats dich ein wenig erwischt, Daten wurden in XL geschrieben obwohl du genau lcdd dafür vorgesehen hast somit wurde erst gar keine LCD-Daten ausgegeben.
Der Befehl 0x01 ist LCD löschen und setzen auf Cursorpostition 0 in Zeile 1, würde ich erst immer nach der fertigen Initialisierung des LCD aufrufen.
Das hier sollten die Hauptfehler gewesen sein, Wenn die Verkabelung stimmt ...

Kleine Hausaufgaben
1. Warum kannst du ohne weitere Deklarationen XL/ Z direkt nutzen ?
2. Welche Register können nicht direkt mit Konstanten geladen werden ?

2.
Datenbanken so wie die dazugehörigen Textausgaben inklusive der Adressen, sollten in einer Include gepackt werden siehe hier
https://www.roboternetz.de/community/threads/66675-LCD-Seriel-ATMega8 unter DbTxt_LCD.asm

3.
An Manchen Stellen hast du in der Unterroutine zum Schluss eine Zeitschleife und nachdem du diese Unterroutine verlassen hast folgt auf den Fuße wieder eine.
Warum ? Entweder du entwickelst die Unterroutinen so das diese in und ansich voll funktionsfahig aus sich heraus sind. Zumindest solltest du dich nur auf einen Weg festlegen.


puuhhhh jjaaaa das wars was mir erstmal aufgefallen war/ist...

HeSt
02.01.2019, 09:31
Guten Morgen, Leute!

Erst mal vielen Dank für eure Zeit, die ihr für mein Problem aufwendet!
Und für die Tipps samt Lösungen!

Da ich das erst richtig verarbeiten muss, erbitte ich mir etwas Zeit, bis ich wieder Rückmeldung gebe.

Nur eines kurz @avr_racer:
die Sache mit den Daten in XL ist mir heute früh auch aufgefallen, auf lcdd geändert. Half nix.

Alles weiter werde ich beherzigen und umsetzen ...

oberallgeier
02.01.2019, 10:30
.. Da ich das erst richtig verarbeiten muss, erbitte ich mir etwas Zeit, bis ich wieder Rückmeldung gebe ..Ich grins mich eins - mir gehts da wie Dir und dem LCD: wir brauchen alle mal ein paar waits wenns kompliziert wird *gg*.

Spass beiseite. Ich habe zwar keine Assemblerlösung. Aber in Assembler werden ja ähnliche Routinen nötig wie in C - und da kann ich ein bisschen was zu den Waits beitragen. Im folgenden Code sind die "waits" - heissen dort
......_delay_us (parameter)
rot hervorgehoben. Die Delays habe ich vor Jahren angepasst für 20 MHz Controllertakt (ist ja aber in µs angegeben) - und diese Routinen laufen bei mir so auf irgendwelchen, möglichst günstigen 2x16-LCDisplays. Vielleicht hilft Dir das ein bisschen weiter?


// Erweiterte Fassung mit Routine für selbst definierte Zeichen
// Stand = Erweiterung von lcd-routines.h und lcd-routines.c
// vom 11. Apr. 2012
// 28 Nov 2012 16:24 Leichte Korrekturen
// 27 Juni 2015, 19:27 Datenausgabe PC0..PC3, Steuerport PD

// Ansteuerung eines HD44780 kompatiblen LCD im 4-Bit-Interfacemodus
// http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial
// Die Pinbelegung ist über defines in lcd-routines.h einstellbar

#include <avr/io.h>
//#include "lcd-routines.h"
#include "lcd_162_xt_ALCo.h"
#include <util/delay.h>
#include <avr/eeprom.h>

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// sendet ein Datenbyte an das LCD

void lcd_data(unsigned char temp1)
{
LCD_PORT |= (1<<LCD_RS); // RS auf 1 setzen
lcd_send(temp1);
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// sendet einen Befehl an das LCD

void lcd_command(unsigned char temp1)
{
LCD_PORT &= ~(1<<LCD_RS); // RS auf 0 setzen
lcd_send(temp1);
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Eigentliche LCD-Zugriffs-Funktion; 4-Bit-Modus
void lcd_send(unsigned char data) {
// oberes Nibble setzen
LCD_PORT = (LCD_PORT & 0xF0) | ((data >> 4) & 0x0F);
_delay_us(15);
lcd_enable();
// unteres Nibble setzen
LCD_PORT = (LCD_PORT & 0xF0) | (data & 0x0F);
_delay_us (15);
lcd_enable();
_delay_us (60);
LCD_PORT &= 0xF0;
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// erzeugt den Enable-Puls
void lcd_enable(void)
{
LCD_PORT |= (1<<LCD_EN1);
_delay_us (20); // kurze Pause
// Bei Problemen ggf. Pause gemäß Datenblatt des LCD Controllers verlängern
// http://www.mikrocontroller.net/topic/80900
LCD_PORT &= ~(1<<LCD_EN1);
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Initialisierung:
// Muss ganz am Anfang des Programms aufgerufen werden.

void lcd_init(void)
{
LCD_DDR = LCD_DDR | 0x0F | (1<<LCD_RS) | (1<<LCD_EN1); // Port auf Ausgang schalten
// muss 3mal hintereinander gesendet werden zur Initialisierung
_delay_us (40);
LCD_PORT = (LCD_PORT & 0xF0 & ~(1<<LCD_RS)) | 0x03;
lcd_enable();

_delay_us (15);
lcd_enable();

_delay_us (11);
lcd_enable();
_delay_us (11);
LCD_PORT = (LCD_PORT & 0xF0 & ~(1<<LCD_RS)) | 0x02;
_delay_us (11);
lcd_enable();
_delay_us (11);

// 4Bit / 2 Zeilen / 5x7
lcd_command(CMD_SetIFOptions | 0x08);

// Display ein / Cursor aus / kein Blinken
lcd_command(CMD_SetDisplayAndCursor | 0x04);

// inkrement / kein Scrollen
lcd_command(CMD_SetEntryMode | 0x02);
lcd_clear();
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Sendet den Befehl zur Löschung des Displays

void lcd_clear(void)
{
lcd_command(CLEAR_DISPLAY);
_delay_us (15);
}


// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Schreibt einen String auf das LCD

void lcd_string(char *data)
{
while(*data) {
lcd_data(*data);
data++;
}
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//String aus EEPROM laden und an LCD senden
void lcd_eep_string(const unsigned char *data)
{ //
unsigned char c;
while(1) //
{ //
c = eeprom_read_byte(data); //
if(c==0) return; //
lcd_data(c); //
data++; //
}
} // Ende void lcd_eep_string(const

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Schreibt ein Zeichen in den Character Generator RAM
// Daten liegen direkt im RAM
void lcd_generatechar(uint8_t code, const uint8_t *data)
{ //
lcd_command(LCD_SET_CGADR|(code<<3)); // Startposition des Zeichens einstellen
for (uint8_t i=0; i<8; i++) // Bitmuster übertragen
{ //
lcd_data(data[i]); //
} //
} // Ende void lcd_generatechar(uint8_t code,
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

avr_racer
02.01.2019, 10:43
Guten Morgen,

jo nimm dir Zeit.

Ein Hinweis zur Zeile 1 und 2 als Deklaration.
$80 ist das SET-DD-RAM-ADRESS-Kommando den Cursor an die jeweilige Adresse springen zu lassen. $80 muss immer addiert werden zur Cursorposition in allen Zeilen!

Ebenso sind die Zeiten nochmal zu beachten.
Du hast das LCD an den ISP-PINs angeschloßen. Das kann manchmnal zu Problemen in der Kommunikation mit dem LCD führen da der ISP-Programmer unter Umständen die PINs nicht frei gibt.

Wäre es möglich mal ein Screenschot vom Aufbau zu machen ?

HeSt
02.01.2019, 14:29
Baue zunächst eine "lange" Warteschleife die "mit Sicherheit" mindestens 100ms dauert.Es scheint ja noch nicht einwandfrei geklärt zu sein, wie lange deine Funktionen wirklich warten
Dann fällt mir grade noch auf:
Du initialsierst dein Display dauernd neu:
Beides erledigt, siehe unten

Das SPH Register in deinem Tiny24 existiert tatsächlich nicht, da hat wkrug recht ...
Hab ich einfach vom M16 PGM rüber kopiert und nicht darauf geachtet - ist jetzt berichtigt

Mich wunderte zudem noch der "OUT" Befehl für den Stackpointer:

Was meinst du damit? Kenne ich nicht anders und finde ich in anderen Programmen auch so.

Also irgendwie komm ich mit dem Timing nicht so ganz mit.
Stimmt (schon). Ich hab den Wert erhäht, damit das delay sicher lang genug ist, hab aber den Text dazu nicht geändert.

So hab mal durchgeschaut... und das ein oder andere wurde schon angesprochen wie z.B. der Stack oder die Init.test3.txt
ldi lcdd, 0x01 ;*
$01 löscht das Display, von cursor setzen auf Zeile1 Pos1 hab ich nichts gelesen!
$03 setzt zusätzlich den cursor auf Z1P1.
Und der Befehl ist der letzte der Init-Prozedur.

Wenn du das LCD richtig angeschlossen hast solltest du mal den Kontrast so einstellen das man die Dots 5x7 ein wenig sieht. Kommt hier mit Erhöhung des Kontrasts nur die erste Zeile zum Vorschein ist die Init des LCD nicht komplett oder unterbrochen worden.
Wie schon geschrieben:
Es kommt in der ersten Zeile gar nichts zum Vorschein, dafür in der 2. Zeile sofort nach Anlegen der Spannung 16 Blöcke. Ob nun ein T24 in der Schaltung ist oder nicht. also auch ohne Init oder sonstiger Ansteuerung!

Sag mal wie fit bist du eigentlich im ASM beim AVR ?
Wie meinst du das, bzw. worum gehts dir?
Wie auch schon geschrieben: ich hab einige verschiedene, kleinere Programme für den T13, den M8 und eine Heizungssteuerung für den M16 geschrieben (mit dem Texteditor), mit AVR umgewandelt und wenns nötig war mit debug getestet.


1.
In die Initialisierung gehören alle Inits interner sowie externe Peripherie.
Im Testprogramm sind keine Ints definiert, weil nicht benötigt.
Wenn, dann mach ich es mit .org.
Das kommt dann beim M16.


Denn wenn der SEI aktiv ist und man vllt sich mal vertan hat und der zugehörige Int wird ausgelöst und diese Tabelle fehlt kann es sein das dein Controller mitten in der Startinit wieder loslegt....
Im Testprogramm nicht zutreffend - weder Int definiert noch in Verwendung


1.1
Code:
ldi lcdd,0x28 ;cd_function_set_std: 4Bit,2Zeilen,5*7 Font
rcall lcd_cmd4 ; Enthält bereits eine Zeitschleife
es steht zwar dahinter aber wenn man doch mal fix was ändern möchte ist
folgendes übersichtlicher
Code:
;SET Function
.equ F = 2 ;1 = 5x10 0 = 5x7
.equ N = 3 ;1 = 2line(4line) 0 = 1line
.equ DL = 4 ;1 = 8bit int 0 = 4bit interface
.equ HSF = 5 ;immer 1 setzen Symbolisiert das Ende

ldi temp1,(1<<HSF|0<<DL|1<<N|0<<F) ;funktionset
rcall lcd_command ;DatenLine1=8bit, N=1 2zeilig á 40 Zeichen d.h. 4zeilig á 20Zeichen
ret
???? Tut mir leid, kann damit nichts anfangen
Mich verwirrt sowas nur.


1.2
Zu den Registern sei gesagt die sollten nur einen allgm. Namen bekommen und haben nicht wirklich was mit den einzelnen Programmteilen, in textlicher Form, was zu tun.
Das mag für dich zutreffen, nicht für mich. Denn durch eine zugeordnete Benennung wird für mich ein Programm, speziell wenn es länger ist, besser lesbar. So weiß ich in den einzelnen Routinen (auch später, wenn eine Routine in eine Bibliothek gewandert ist) wozu das Register dient. Das ist in mir drin - kommt aus dem Großrechnerbereich (sieh unten) und von der Clipper-Programmierung.
Manchmal werden direkt veränderbare Register zu wenig, dann muss ich klarerweise in den SRAM "ausweichen". Wird aber, soweit möglich, vermieden.
Wenn wenig direkt veränderbare Register zur Verfügung stehen, dienen X,Y,Z bei mir als "Arbeitsregister", die ständiger Veränderung unterliegen. Sind einfacher zu schreiben als Rxx oder benannte. Zudem tu ich mir leichter, wenn ich 16 Bit benötige. Da XYZ vordefiniert und für mich eindeutig. Sie sind auch durch die Großschreibung leicht erkenntlich. Wenn genug Register zur Verfügung stehen, werden andere unterhalb XYZ bis R16 als Arbeitsregister verwendet. Und dann neben den namentlich (nahezu) fix zugeordneten immer mit "WRKx" (WoRKregister) definiert (bei euch meist als "tempx" o.ä.). Die Mnemonic, die ich meist bei den Namen verwende, kommt aus dem Großrechnerbereich (alles englisch). Ist eine ganz andere Welt, prägt aber. Daher auch mein meist gemischter Text D/E.
Aus oben genannten, jahrzehntelang prägenden Tätigkeiten erklärt sich auch mein Programmierstil. Somit auch mein Problem mit "fremden" Bibliotheken.
Man möge mir verzeihen!


Der Befehl 0x01 ist LCD löschen und setzen auf Cursorpostition 0 in Zeile 1, würde ich erst immer nach der fertigen Initialisierung des LCD aufrufen.
Siehe oben. Der Befehl befindet sich am Ende der Initialisierung (=also fertig).

Kleine Hausaufgaben
1. Warum kannst du ohne weitere Deklarationen XL/ Z direkt nutzen ?
2. Welche Register können nicht direkt mit Konstanten geladen werden ?
zu 1.: Siehe 1.2
zu 2.: von R0-R15
Gewisse Grundlagen sind mir bekannt.
Sonst hätte ich meine vorherigen Projekt nicht lösen können.

2.
Datenbanken so wie die dazugehörigen Textausgaben inklusive der Adressen, sollten in einer Include gepackt werden siehe hier
https://www.roboternetz.de/community...Seriel-ATMega8 unter DbTxt_LCD.asm
Werd ich mir genau ansehen.
Wird aber erst schlagend, wenn das Test-Programm die Testphase bestanden hat und dann mit Mega16 voll programmiert wird ...


3.
An Manchen Stellen hast du in der Unterroutine zum Schluss eine Zeitschleife und nachdem du diese Unterroutine verlassen hast folgt auf den Fuße wieder eine.
Hast recht.
Wurden eliminiert.
Antworten zu Text3 siehe Anhang


Um das Problem mit den Wartezeiten (delays) zu eliminieren, hab ich auf "Mechanik" umgestellt. Statt Wartezeiten in Routinen zu definieren verwende ich nun die "wait_key"-Routine. Die Wartezeit wird somit per "Taste" abgefragt. Händisch ist man sicher nicht zu schnell ;-)
Man sollte, da die Befehle nun per Tastendruck weitergeschaltet werden, auch jeden Schritt auf dem LCD verfolgen können.

Und trotzdem funktioniert ... NICHTS!

Nach Power on (ob LCD alleine oder an T24 angeschlossen):
1. Zeile: dunkel/leer
2. Zeile: voll mit Blöcken (aber nur, wenn Kontrast fast auf 0V), also keine "Anzeige".
Das bleibt unverändert, auch wenn mit der Taste weiter geschaltet wird.
:(

Siro
02.01.2019, 14:48
Deine Zeitverzögerungen habe ich mal versucht anhand des Datenblatts nachzurechnen:

Vorab:
Die CPU arbeitet intern (startet) mit einem 8 MHz Clock, dieser wird standardmäßig durch 8 geteilt,
somit bleibt ein Clock von 1 MHz bestehen.
Durch die "single pipeline" Struktur benötigen die meisten der Befehle dann auch entsprechend nur 1 Mikrosekunde.

Nehme ich jetzt mal deine Wartefunktion LCD_DLYL die 46ms dauern soll:

Es wird der Wert Hex 0xDAE0 dezimal 56032 ins X register geladen und in der Schleife kontinuierlich runtergezählt.
sbiw XH_XL,1 benötigt 2 Zyklen
brne ldl1 benötigt 2 Zyklen ausser beim letzten Durchlauf, dann nur einen.

Das sind also 56032 mal 4 Zyklen = 224128-1


nun kommen noch die anderen Befehle dazu
2 push XH
2 push XL
2 ldi
2 ldi
2 pop
2 pop
3 ret
3 der Aufruf der Funktion mit rcall
Also insgesamt 18 Zyklen

Das sind dann 224127+18 = 224145 also 224,145 Millisekunden
Bei 8 MHz wären es 28,0018125 Millisekunden

Jetzt können wir rückwärts rechnen welchen Wert wir wirklich brauchen für 46 ms
46000 - 18 = 45982

geteilt durch 4 für die innere Schleife
jedoch vorher noch einen abziehen
45981 / 4 = 11495,25

somit müste der Wert für das Laden des X Registers 11495 dezimal bzw. 0x2CE7 sein.

-----
Für die 2ms Sekunden wäre es dann
20000-18-1=19981 / 4 = 4994,25 also 49995 bzw. Hexadezimal 0x1383

----
Ich habe auf meinem Rechner nichts mit Atmel drauf,
aber das kann sicher mal jemand überprüfen mit dem Simulator.

Siro

Dies löst zwar nicht dein Problem, aber das Timing der Wartefunktionen sollte damit stimmen, sofern ich nix falsch gemacht habe...


Dein WAIT_KEY: hat aber ein Problem:
Du fragst den Pin ab und dann wird die entsprechende Funktion danach ausgeführt.
Das geht aber SOOOO schnell, das bei der nächsten WAIT_KEY die Taste noch garnicht losgelassen wurde
und somit wartet er garnicht mehr und führt die nächste Funktion sofort aus.
Thema Tastenentprellung.
So kommt leider immer ein Problem zum nächsten. Aber der Ansatz ist doch schonmal gut.
Bau mal einfach in die WaitKey eine lange Schleife rein bzw. rufe dort nur deine LCD_DLY funktion auf, unabhängig ob Taste gedrueckt ist.
und versuche es erneut.

Könnte es auch sein, dass der Watchdog zuschlägt ?
Das WDE Bit im Register WDTCSR mus auf 0 gesetzt sein.
Laut Datenblatt ist es undefiniert ??, hab ich aber auch noch nicht verstanden wie das geht.....

avr_racer
02.01.2019, 16:15
Gut dein LCD zeigt nen Balken an, ohne Init, also ist erstmal die Versorgung i.O..
Kontrast mal ganz auf Anschlag gedreht ?

Ebenso ein Bild vom Aufbau oder Stromlaufplan, ich sag mal so ich sehe nichts... Und das LCD heißt auch wirklich 1602 ?
Hast du deine Programmierhwardware mal abgezogen von dem ISP Sockel?
RESET ist wie bescaltet ?

Nur mal so:
die Datenleitung sind zufälliger Weise nicht irgendwie vertauscht mit DB0-DB3 ?
Oder
DB04 = PA07
Db05 = PA06
DB06 = PA05
DB07 = PA04

Der RW-Pin liegt auf Masse und auch mit RS oder Enable nicht vertauscht ?
Oder Masse/Plusschluss eines Pins ?

Ebenso mal die Frage was ist von den Bits am Controller eingestellt ?


Mit dem Wait_Key, wenn dein Taster nicht entprellt per Hardware oder nach der Tasterabfrage keine >150ms Wartezeit drin sind, LASS ES!

Den weiteren Text hab ich vernommen aber das führt uns erstmal nicht weiter und sind viel Schönheitsdinge....

Wie sieht denn dein aktueller Code aus ?



Könnte es auch sein, dass der Watchdog zuschlägt ?
Das WDE Bit im Register WDTCSR mus auf 0 gesetzt sein.
Laut Datenblatt ist es undefiniert ??, hab ich aber auch noch nicht verstanden wie das geht.....
Wenn der nicht aktiviert ist passiert auch erstmal nichts !

HeSt
02.01.2019, 20:19
@ Siro,
Für die Zeiten hab ich mir vor Jahren eine Excel-Tabelle erstellt mit der ich die Zeiten errechne.
Bislang hat das noch immer (annähernd) gestimmt (diverse Laufzeiten nicht berücksichtigt) und alle Anwendungen funktionieren damit. Allerdings hab ich noch keine Schleifen mit Doppelregistern realisiert. Vielleicht gibt es da einen größeren Unterschied.

Was die Tastensache betrifft, so sehe ich meine Routine als abgesichert.
Denn:
WAIT_KEY:
in XL,key_pin ;solange eine Taste gedrückt ist, geht's
cpi XL,0 ;nicht weiter. Somit kann kein versehentlicher
brne wait_key ;"Durchlauf" passieren. Erst nach dem Loslassen
;gehts weiter und ...
WK1:
in XL,key_pin ;... steht dann hier an, bis wieder eine Taste
cpi XL,0 ;gedrückt wurde.
breq wk1
ret

Somit gehts nur Schritt für Schritt von Befehl zu Befehl.

Zum Thema "watchdog":
Ich hab noch nie ein watchdog-Bit bewusst gesetzt. Weder 0 noch 1. Und es gab noch nie Probleme deshalb.

@ avr_racer,
die Sache mit den ISP-Pins wäre mir neu!
Bei allen meinen Projekten habe ich auch die ISP-Pins verwendet.
Teils auch für ISP. Und ich hatte noch nie Probleme damit.
Das einzige was Zores macht ist JTAG (M16). Das gibts beim T24 aber nicht.


Gut dein LCD zeigt nen Balken an, ohne Init, also ist erstmal die Versorgung i.O..
Kontrast mal ganz auf Anschlag gedreht ?
Ja, 1. Zeile bleibt leer bzw. ohne Blöcke.

Ebenso ein Bild vom Aufbau oder Stromlaufplan, ich sag mal so ich sehe nichts... Und das LCD heißt auch wirklich 1602 ?
Hast du deine Programmierhwardware mal abgezogen von dem ISP Sockel?
RESET ist wie bescaltet ?
Morgen mach ich ein Bild vom Aufbau zum besseren Verständnis.
es ist eine kleine Steckplatine ohne ISP und "reset" ist nicht beschaltet.

Nur mal so:
die Datenleitung sind zufälliger Weise nicht irgendwie vertauscht mit DB0-DB3 ?
Oder
DB04 = PA07
Db05 = PA06
DB06 = PA05
DB07 = PA04
Auch aus Angst was versehentlich vertausch zu haben - x-mal geprüft = ok.


Der RW-Pin liegt auf Masse und auch mit RS oder Enable nicht vertauscht ?
Oder Masse/Plusschluss eines Pins ?
Nichts vertauscht und RW ist offen.


Ebenso mal die Frage was ist von den Bits am Controller eingestellt ?
Welche sollten das sein??
Da wurde nichts eingestellt, keine Fuses geändert oder dergleichen.


Wie sieht denn dein aktueller Code aus ?
Siehe Anhang letzter post.

[edit]
Werde morgen noch RW auf GND setzen.
Ob's was bringt?
[endedit]

021aet04
02.01.2019, 23:19
Digitale Eingänge sollten immer beschalten sein, teilweise müssen diese auch Beschalten sein (entweder mit Widerständen oder direkt). Wenn die Pins als Ein- und Ausgang verwendet wird muss ein Widerstand verwendet werden.

Der Reset sollte auch beschalten sein (mindestens ein Pullup-Widerstand). Ohne Widerstand kann es funktionieren, muss aber nicht. Hast du auch eine Led o.Ä. angeschlossen die du zum Testen verwenden kannst? So könntest du feststellen ob Resets auftreten bzw ob das Programm überhaupt läuft.

MfG Hannes

Siro
03.01.2019, 08:26
Wenn ein Pin nicht beschaltet ist, dann zieht ein interner Pullup im Prozessor den Pin nach High, sofern er als Eingang configuriert wurde.
Der R/W Pin vom Display muss auf Low sonst steht das Display immer auf Read Mode. Ich weis nicht ob die einen Pullup haben,
ein Pulldown vermutlich aber nicht. Ich mess das mal bei meinem....

Mein R/W Pin am Display liegt ohne Beschaltung auf High. Das würde demnach dann nicht funktionieren.

Ich hoffe, Du hast nicht mein Display erwischt, das verleitet regelrecht dazu es falsch anzuschliessen,
das ist mir nämlich auch passiert....Man beachte die Zählweise der Pins....
33909

021aet04
03.01.2019, 09:58
Standardmäßig sind bei den AVRs (zumindest die ich kenne) die Ports als Eingang ohne Pullup-Widerstand konfiguriert. Den Pullup schaltet man ein wenn man ins Portregister schreibt (den jeweiligen Pin auf 1 setzen).

MfG Hannes

HeSt
03.01.2019, 16:46
Erst muss ich mich für eine Fehlmeldung entschuldigen,
denn beim Umbau von µC auf absolut händisch ist mir bewusst
geworden, dass ich das LCD verkehrt rum "gesehen" hab.
Weil ich das LCD so im Board hab, dass die Anschlüsse unten
sind und nicht oben. Zeile 1 ist bei den Anschlüssen.
Somit hat die Zeile 1 die Blöcke und nicht Zeile 2!
Zeile 2 ist leer.
DIE LCD-ANSCHLÜSSE WAREN/SIND IMMER RICHTIG BESCHALTEN!!
Hab nur die Zeilen vertauscht gesehen!

Aufbau mit T24:
Hab RS + R/W gegroundet.
Resultat: keine Änderung.

Pullup hin, pullup her ....

Aufbau manuell:
Nun hab ich statt dem µC ein Mäuseklavier installiert und
die entsprechenden commands darüber eingegeben.
RS + RW immer auf GND - also nur Befehle.
EN mit 4,7k gegen GND.
Per Taste + auf EN, bei Loslassen - über R.
CMD-Abfolge (x = per Taste EN > +/-):
$30 3x
$20 1x noch im 8-Bit Mode (4-Bit-Mode)
$28 2x erst 2 dann 8 (4-Bit, 2 Zeilen, 5x7)
$0F 2x erst 0 dann F (DSP on, Cursor on blink)
$06 2x erst 0 dann 6 (DSP fest, C autoincr)
$01 2x erst 0 dann 1 (clr DSP, C > home)
Pegel/V-levels an den Anschlüssen mit V-Meter kontrolliert - ok.
Somit sollte der Zeitfaktor (Warteschleifen zu kurz) eliminiert sein.
Oder "vergisst" das LCD nach gewisser Zeit, welche Befehle es schon erhalten hat!?

Resultat: keine Änderung ggü. µC oder keiner Beschaltung.
Es tut sich ggü. dem Status nach dem Spannung anlegen einfach ...
NICHTS, GAR NICHTS am LCD!!!
Die Blöcke bleiben unverändert und keine weitere Reaktion.

Bin ratlos ... Was nun?
Doch LCD defekt??

Und damit ihr euch den Testaufbau vorstellen könnt, die Fotos dazu.

Werde morgen noch DB4-DB7 mit R gegen GND hängen.

Moppi
03.01.2019, 18:49
In solchen Fällen, wenn ich gar nicht weiter komme, neige ich dann dazu, ein neues Teil zu kaufen - also hier ein neues Display - um zu sehen, ob sich das auch so verhält oder ob das alte defekt ist.
Oder ich würde mir ein Programmcode aus dem Internet ziehen, der auf dem Display was anzeigt und das dann damit versuchen.
Was aber auch eine Lösung wäre, das Teil zu jemandem schicken, der damit vertraut ist und versucht es zum Laufen zu bekommen.

MfG

Siro
03.01.2019, 18:55
Ich habe es mal eben probiert:

Verkabelung:
DB0 frei
DB1 frei
DB2 frei
DB3 frei
DB4 über Widerstand nach Plus
DB5 über Widerstand nach Plus
DB6 an Masse
DB7 an Masse

RS an Masse
RW an Masse
E über Widerstand nach Plus

V0 (Kontrastpin) nach Masse

Wir simulieren das Datenbyte 0x30 indem wir DB4 und DB5 an High legen
und DB6 und DB7 an Masse legen.

Nun müssen wir mehrfach das Enable Signal nach Masse und wieder nach Plus schalten.
Ich habe den Draht rein und wieder raus gezogen.
Dann sollte das Display ALLE Zeichen im Kontrast zeigen.

Bilder:
Aufbau:

33914

Versorgund einschalten
33915

Enable Pin Mehrfach rausgezogen und wieder reingesteckt.
33916

Dann sollte es Grundinitialisert sein.

Ich habe die Pullup Widerstände an DB4 und DB5 mal eben weggelassen, auch dann ging es.
Der Widerstand am Enable Pin nach Plus ist aber zwingend erforderlich bei dem Test, der Pin "schwebt" sonst...

Muss doch in den Griff zu bekommen sein....;)
Siro

HeSt
03.01.2019, 20:24
Hi Siro!

DANKE!! Dein Test hat mir immens geholfen!

1. Dass nach der Spannungsversorgung dein LCD ebenfalls die Blöcke in Zeile 1 hat und
2. dass alleine das Senden von $30 beide Zeilen "habt 8" stehen lässt.
Ich werde morgen deinen Aufbau bei mir rekonstruieren und mal schauen ...
Danke nochmals!

Falls wieder nichts passiert ist mit Sicherheit das LCD defekt.

Mir ist eingefallen, dass ich eine alte Graupner-Computerfunke rum liegen habe (nicht mehr in Gebrauch), die auch ein LCD eingebaut hat.
Es ist ein 2x16er Display. Allerdings weiß ich nicht welches. Werd es mal genauer unter die Lupe nehmen.
Es ist größer und mit Sicherheit über 20 Jahre alt ...
Könnte ich eventuell ausbauen und versuchen ...

Siro
03.01.2019, 20:29
Die Displays haben sich eigentlich seit Jahrzehnten nicht geändert. Hab die vor 20 Jahren schon in ähnlicher Form bernutzt.
Die arme Graupner.. ;) Hab auch noch eine, aber aus der neuesten Generation.
Viel Erfolg, ich bin gespannt.

Siro

HeSt
03.01.2019, 20:38
Danke für den Erfolgswunsch! Kann ihn gebrauchen! ;)
Ja, irgendwie wäre mir um die MC20 leid. Aber mal schauen, ob sich das LCD leicht ausbauen lässt.
Aber nur, wenn das neue defekt ist.

Siro
03.01.2019, 20:43
Bei Amazon gibt es jetzt blaue Displays für 1,17 Euro, kostenlose Lieferung:
https://www.amazon.de/Zeichen-Display-HD44780-Backlight-Arduino-Blau/dp/B009GEPZRE

(https://www.amazon.de/Zeichen-Display-HD44780-Backlight-Arduino-Blau/dp/B009GEPZRE)
Aber die Bewertungen sind teils schlecht, dauert wohl ewig und es wurden wohl auch defekte verkauft...:(
Wobei bei 1,77 kann man nicht viel verkehrt machen.

Bei Pollin hätte ich da mehr vertrauen
https://www.pollin.de/p/lcd-modul-tc1602a-09-120422

avr_racer
03.01.2019, 21:50
Erst muss ich mich für eine Fehlmeldung entschuldigen,
denn beim Umbau von µC auf absolut händisch ist mir bewusst
geworden, dass ich das LCD verkehrt rum "gesehen" hab.
Weil ich das LCD so im Board hab, dass die Anschlüsse unten
sind und nicht oben. Zeile 1 ist bei den Anschlüssen.
Somit hat die Zeile 1 die Blöcke und nicht Zeile 2!
Zeile 2 ist leer.
DIE LCD-ANSCHLÜSSE WAREN/SIND IMMER RICHTIG BESCHALTEN!!
Hab nur die Zeilen vertauscht gesehen!

Alles gut ein nicht initialisiertes LCD muss immer in der ersten Zeile eine Balken haben, deshalb hab ich drüber hinweg geschaut siehe weiter oben.



Aufbau mit T24:
Hab RS + R/W gegroundet.
Resultat: keine Änderung.

Pullup hin, pullup her ....

Wenn denn nur R/W grounden. RS ist für das Schreiben auf dem LCD notwendig.



Aufbau manuell:
Nun hab ich statt dem µC ein Mäuseklavier installiert und
die entsprechenden commands darüber eingegeben.
RS + RW immer auf GND - also nur Befehle.
EN mit 4,7k gegen GND.
Per Taste + auf EN, bei Loslassen - über R.
CMD-Abfolge (x = per Taste EN > +/-):
$30 3x
$20 1x noch im 8-Bit Mode (4-Bit-Mode)
$28 2x erst 2 dann 8 (4-Bit, 2 Zeilen, 5x7)
$0F 2x erst 0 dann F (DSP on, Cursor on blink)
$06 2x erst 0 dann 6 (DSP fest, C autoincr)
$01 2x erst 0 dann 1 (clr DSP, C > home)
Pegel/V-levels an den Anschlüssen mit V-Meter kontrolliert - ok.
Somit sollte der Zeitfaktor (Warteschleifen zu kurz) eliminiert sein.
Oder "vergisst" das LCD nach gewisser Zeit, welche Befehle es schon erhalten hat!?

Resultat: keine Änderung ggü. µC oder keiner Beschaltung.
Es tut sich ggü. dem Status nach dem Spannung anlegen einfach ...
NICHTS, GAR NICHTS am LCD!!!
Die Blöcke bleiben unverändert und keine weitere Reaktion.

Bin ratlos ... Was nun?
Doch LCD defekt??

Und damit ihr euch den Testaufbau vorstellen könnt, die Fotos dazu.

Werde morgen noch DB4-DB7 mit R gegen GND hängen.

Rein für die Init könnte man das so machen bleibt die Frage der Entrprellung der Taster/Schalter was es wahrscheinlich scheintern lässt.
Danke für die Bilder. Und prüfe Leitungen oder Stecklöcher auf dem Board...

So hoffe ich das dir folgendes weiterhilft

Das "Ur-LCD" auf dem auch dei KS0077/67 usw angelehnt sind hat Seite 39 des HD44780 foglenden Hinweis:

"4-bit operation, 8-digit ´ 1-line display with internal reset
The program must set all functions prior to the 4-bit operation (Table 12). When the power is turned on,
8-bit operation is automatically selected and the first write is performed as an 8-bit operation. Since
DB0 to DB3 are not connected, a rewrite is then required. However, since one operation is completed in
two accesses for 4-bit operation, a rewrite is needed to set the functions (see Table 12). Thus, DB4 to
DB7 of the function set instruction is written twice."

Ich muss zugeben das habe ich das letzte mal vor 5/6 Jahren gelesen nachdem ich mir dann meine 8-Bit-Erweiterung mit nem Schieberegister gebaut habe um Pins zu sparen. Seit dem hatte ich 4bit nie wieder angefasst weil dort einfach zuviele Fehlinterpretation möglich sind. Gerade in Eng wenn man da nicht sattelfest ist.

Musste mir mein Board nochmal schnappen und es für den 4bit-Mode aufbauen was schief geht... Die Routine sollte eigentlich sofort bei dir funktionieren wenn folgende Bedigungen eingehalten sind

Takt 1Mhz eingestellt wenn
CLKDIV8 = Haken raus
!!!!!!!!!!!!
Jetzt VORSICHTIG wirklich drauf achten das folgende Einstellung gewählt ist
SUT_CKSEL = Int. RC. Osc. 8Mhz.... egal was oder Ext. Crystal 0,9-3Mhz.... egal was

Finger WEG von Ext. CLOCK der Chip lässt sich nur dann durch anlegen eines externen Taktes in den Fues umstellen!!!
!!!!!!!!!!!!
KONTRAST BISSCHEN STÄRKER EINSTELLEN
RW = GND
RS/E = vom Crontroller wie gehabt
DB0-DB3 = offen da sie eh in Tristate geschaltet werden
DB4-DB7 = vom Controller wie gehabt

Wenn LCD i.O. sollte jetzt Texte in beiden Zeilen zeilen erschienen.

Sollte dein LCD nach ca 5s, ohne das du Einstellungen verändert hast, nur wieder einen Balken in der Zeile 1 haben ist es defekt.

021aet04
03.01.2019, 23:22
Ich habe schon vor längerem 2 PDFs gefunden http://www.epemag.wimborne.co.uk/lcd1.pdf und http://www.epemag.wimborne.co.uk/lcd2.pdf vielleicht hilft es weiter. Ich könnte noch eine Hex kompilieren damit du das LCD mit einem uC testen kannst.

MfG Hannes

Moppi
04.01.2019, 08:59
Ich habs jetzt leider nicht gefunden oder gelesen, ob das Display neu war oder schon im Betrieb. Wenn es noch nie in Betrieb war: hast Du schon mal die Platine / Lötstellen inspiziert? Ich habe die Erfahrung mit Teilen aus China gemacht, dass man das kontrollieren sollte, weil manchmal Lötzinnreste Brücken auf der Platine bilden. Wenn nichts zu finden ist, könnte man noch alle Lötstellen nachbearbeiten, ob das Display schon im Betrieb war , vor längerer Zeit, oder nicht. Vielleicht kommt irgendwo ein Signal nicht durch.

MfG

HeSt
04.01.2019, 09:08
(Guten) Morgen,

die Erklärung zur Klammer:
Mein LCD ist defekt :(
Ich hab den Aufbau genau so wie Siro gemacht.
Die LCD-Anzeige nach der Spannungsversorgung siehe Foto.
Sie bleibt unverändert, egal wie oft E gegen + getippt wird.

Danke für eure Mühe, Zeit und die vielen Tipps!

Ich melde mich wieder ...

Gruß Heinz

- - - Aktualisiert - - -


Ich habs jetzt leider nicht gefunden oder gelesen, ob das Display neu war oder schon im Betrieb.
War/ist neu. War deshalb, weil vor einigen Jahren gekauft, aber nie verbaut ...
Die Lötstellen hab ich mit der Lupe kontrolliert und auch - soweit möglich - nachgelötet - alles ok.

Werd mir heute noch beim großen "C" ein neues holen. Ist grad mal 5km entfernt ...

HaWe
04.01.2019, 10:10
nur als Tipp bei ähnlichen Problemen:
Auch wenn bei mir Hardware auf speziellen Plattformen nicht zum Funktionieren zu bringen ist (z.B. am Raspi): zum testen habe ich da immer einen Arduino für 5 EUR in Reserve, zu dem es super-simple fertige Beispielprogramme gibt, das ist eine Sache von 3 Minuten - es spart einfach Wochen-lange nervige Fehlersuchereien auf der eigentlichen genutzten Plattform.

Siro
04.01.2019, 10:31
Sie bleibt unverändert, egal wie oft E gegen + getippt wird.


E liegt über einen Widerstand an Plus,
Du musst E dann 3 mal nach Masse ziehen.;)

HeSt
04.01.2019, 11:44
E liegt über einen Widerstand an Plus,
Du musst E dann 3 mal nach Masse ziehen.;)
Lieber Siro,
es steht doch "egal wie oft" gegen Masse gezogen ...;)
Aber dein Testaufbau hat mir geholfen!

Hab mir ein neues 1602 LDC besorgt (€ 13,-)

Und ....
BINGO !!!!!!!!!!!!

@ avr_racer,
hab daraufhin gleich dein text3-progrämmchen adaptiert (statt portD > portA).
Und alles funktioniert!

Danke euch allen!

Jetzt kann ich mal beruhigt weiter machen ... bis ich auf das nächste Problem stoße ...
Dann rühr ich mich wieder (bin mir sicher!).
Spätestens jedoch, wenn ich fertig bin - und das wird noch lange dauern .................. ;)

avr_racer
04.01.2019, 14:49
Schön zu hören das es funktioniert, weniger schön das ein nicht benutztes und nagelneues einfach defekt war/ist. So kann man sich eben nen Wolf suchen warum das Programm nicht funktioniert obwohl es das tut vllt auch nur in Ansätzen.... Seuftz ;)

HeSt
11.01.2019, 12:08
So, bin schon wieder da ;)

Nichts tragisches ...!

@avr_racer,
ich hab mir deine Zeitenrechnung genauer angesehen und bin zur Ansicht gekommen, dass sie nicht stimmt.
Jetzt gibt es zwei Möglichkeiten:
1. sie stimmt wirklich nicht oder
2. meine Rechnung stimmt nicht!

Dein Beispiel aus text3: (cc = cpu clock cycle = 1µs)
wait25us:
ldi r20,$20 ;1cc
wait25us1:
dec r20 ;1cc
brne wait25us1 ;1/2cc
ret
Nehmen wir brne mit 1cc an (=1µs), dann ergibt das folgende Rechnung:
$20 sind dezimal 32. Also 32 Durchgänge/Schleifen.
32 mal 2 (dec + brne á 1µs) ergibt 64µs und keine 25.

Wo liegt nun der Gedanken-Fehler?
Bei mir oder bei dir?

@alle:
Übrigens stehe ich schon länger auf der Leitung und komm nicht weiter.
Ich will/muss einen ADC-Wert (8Bit ADLAR genügt) in Volt umrechnen (Akkuspannung 12V, max. 13,7 Ladeschlussspannung).
Folgende ADC-Beschaltung: 15V-68k-ADC-50kPot-GND.
Bei exakt 15V wird mit einem Spindelpoti der ADC-Maximalwert genau auf 5V eingestellt.
Somit hab ich eine Reserve, sollte die Spannung mal über 13,7V ansteigen.
Zudem dient eine 5V Z-Diode als Schutz.
Bei 15V liegen nun 5V am ADC. Das ergibt einen ADC-Wert von 255 (ADCH).
Das ist Basis für die weiteren Berechnungen.
Nehmen wir nun als zu messende Spannung 10,4V an.
Das ergibt folgende Schlussrechnung:
15V.....255
10,4V....?
10,4*255/15=177 gerundet.
Umgekehrt:
255.....15V
177......?
15/255=0,0558 Und da haperts schon! Wie rechne ich mit 0,0588?
177*0,0588=10,4

Auch hab ich nachstehende Divisions-Routine im Netz gefunden.
Allerdings rechnet die nicht richtig.
Da steht im Rest (=Nachkommastelle) bei einer Rechnung 177/17, statt 4 eine 8!
Wo liegt hier der Fehler, bzw. wie/wo kann man das berichtigen?
Ich möchte bei den Zehntel-Volt schon relativ genau sein.

Sonst schaut bisher alles gut aus ... :)


; 8Bit Division mit Rest; Laufzeitverhalten im schlechtesten Fall (255/1) 103 Taktzyklen
; Achtung:
; Divison durch 0 wird nicht abgefangen und führt zu einer Endlosschleife
; Dieser Algorithmus funktioniert nur für vorzeichenlose 8Bit-Werte
; Nach Division steht das Ergebnis in r18 und der Rest in r16

.def divident = r16
.def divisor = r17
.def ergebnis = r18
.def zw = r19
ldi divident,177 ; Berechnet 177/17 !
ldi divisor,17
division:
clr ergebnis ; Ergebnis initialisieren
ldi zw,1 ; Teilbarkeit durch 1 annehmen
tst divisor
loop:
brmi div_loop ; Den Divisor linksbündig ? -> JA
lsl zw ; Zwischenergebnis und
lsl divisor ; Divisor einen Schritt nach links
rjmp loop ; ... und nochmal prüfen
div_loop:
cp divident,divisor ; divident >= divisor
brlo division_weiter ; -> nein
add ergebnis,zw ; Ergebnis vergrößern und
sub divident,divisor ; Dividenten verkleinern
division_weiter:
lsr divisor ; Divisor und Zwischenergebnis
lsr zw ; einen Schritt nach rechts
brne div_loop ; zw!=0 ? ->JA
nop ; Ergebnis in ergebnis
; Rest in divident !
end: rjmp end

Searcher
11.01.2019, 14:01
Da steht im Rest (=Nachkommastelle) bei einer Rechnung 177/17, statt 4 eine 8!
Wo liegt hier der Fehler, bzw. wie/wo kann man das berichtigen?
Ich möchte bei den Zehntel-Volt schon relativ genau sein.


Hallo HeSt,
Rest ist nicht gleich Nachkommastelle. Ich habe den Code mal durch meinen BASCOM Simulator laufen lassen und bekomme als Rest nicht 8 sondern eine 7. 177/17 ist ja gleich 10 Rest 7. Um auf die erste Nachkommastelle von 4 zu kommen, könnte man nun den Rest von 7 wieder durch 17 teilen. Um den gleichen Code zu nutzen erst den Rest von 7 mit 10 multiplizieren und dann den Code mit 70 und 17 füttern.

Gruß
Searcher

HeSt
11.01.2019, 14:54
Servus Searcher,
danke für die Antwort!
Werde es dann gleich probieren ....

Eine andere Frage noch an alle:
Im Datenblatt des Mega16 steht auf Seite 32 in Tabelle 14, dass der µC von den Timern nur durch Timer 2 geweckt werden kann.
Oder lese ich das falsch!?
Im AVR-Studio funktionieren aber sehr wohl auch T0 und T1 OVF.
Kann ich davon ausgehen, dass das auch in der Realität so ist?
33926

Moppi
11.01.2019, 15:10
Es kommt drauf an, welchen Sleep Mode Du möchtest, dann kannst Du sehen, was man nutzen kann, zum Aufwecken (im Datenblatt steht es dann ja). Oder Du entscheidest Dich für eine bestimmte Art und Weise, den aufzuwecken (weil es keine andere Möglichkeit gibt), dann muss geschaut werden, welcher Sleep-Mode dazu möglich ist. Je tiefer der Schlaf, desto weniger Möglichkeiten gibt es zurück zu kehren.

Beim ATmega328P steht auch nur Timer2. Ich verwende aber Timer1, der dann bei Überlauf einen Interrupt auslöst und auch zum Aufwachen führt.
Allerdings muss ich darauf achten, dass im jeweiligen Sleep-Mode dann der Timer1 auch aktiv ist. In manchen Modi sind bestimmte Dinge abgeschaltet, dann kann man die nicht nutzen.

MfG

avr_racer
11.01.2019, 15:59
So, bin schon wieder da ;)

Nichts tragisches ...!

@avr_racer,
ich hab mir deine Zeitenrechnung genauer angesehen und bin zur Ansicht gekommen, dass sie nicht stimmt.
Jetzt gibt es zwei Möglichkeiten:
1. sie stimmt wirklich nicht oder
2. meine Rechnung stimmt nicht!

Dein Beispiel aus text3: (cc = cpu clock cycle = 1µs)
wait25us:
ldi r20,$20 ;1cc
wait25us1:
dec r20 ;1cc
brne wait25us1 ;1/2cc
ret
Nehmen wir brne mit 1cc an (=1µs), dann ergibt das folgende Rechnung:
$20 sind dezimal 32. Also 32 Durchgänge/Schleifen.
32 mal 2 (dec + brne á 1µs) ergibt 64µs und keine 25.

Wo liegt nun der Gedanken-Fehler?
Bei mir oder bei dir?


Bei 1Mhz
;Call = 3 Takte (3µs)
wait25us:
ldi r20,$20 ;1cc ; 1Takt (1µs)
wait25us1:
dec r20 ;1cc ; 1Takt (1µs)
brne wait25us1 ;1/2cc ; 1Takt bei 0 und 2 Takte wenn !=0 also (1µs oder 2µs)
ret ; 4Takte (4µs)

3µs + 1µs + (32*3µs(!=0) - 1µs(bei 0)) + 4µs = 103µs bei 1Mhz

Ich habs mir mal geschrieben und passe es auf die Frequenz an, ja es geht auch anders und manchmal verwirrend ;)



@alle:
Übrigens stehe ich schon länger auf der Leitung und komm nicht weiter.
Ich will/muss einen ADC-Wert (8Bit ADLAR genügt) in Volt umrechnen (Akkuspannung 12V, max. 13,7 Ladeschlussspannung).
Folgende ADC-Beschaltung: 15V-68k-ADC-50kPot-GND.
Bei exakt 15V wird mit einem Spindelpoti der ADC-Maximalwert genau auf 5V eingestellt.
Somit hab ich eine Reserve, sollte die Spannung mal über 13,7V ansteigen.
Zudem dient eine 5V Z-Diode als Schutz.
Bei 15V liegen nun 5V am ADC. Das ergibt einen ADC-Wert von 255 (ADCH).
Das ist Basis für die weiteren Berechnungen.
Nehmen wir nun als zu messende Spannung 10,4V an.
Das ergibt folgende Schlussrechnung:
15V.....255
10,4V....?
10,4*255/15=177 gerundet.
Oder anders rum:
255/15=17*10,4=177 gerundet (was ADC dann tatsächlich bingt? 176/177?)
Jetzt drehen wir die Sache um:
177/17=10,4 gerundet.


Ja ADLAR lässt den ADC auf 8Bit schrumpfen somit ist deine Auflösung 5V (AREF) / 256bits = 0,0195..V also 19,5mV pro Bit
Diesen Wert deklarierst du dir als z.B: 195 in der Init und MULTIPLIZIERST du dir dann mit den im ADCH zu Verfügung stehenden BITS z.B.: mit 256 = 49920.
Dein Widerstandsteilerverhältnis ist 3:1 heißt 49920*3 = 149760 den Punkt richtig setzen und du hast deine 14.976V ohne geschönt zu haben.

1. 10,4*255/15 sind verkehrt denn 8bit ADC hat 256 Stufen die 0 gehört mit dazu
richtig also 10,4*256/15 =177,493bits. Abgeschnitten sinds dann nur 177 wie es auch korrekt ist. Aufgrund das dir jetzt aber im Wandler die Nachkommastellen fehlen wirds halt ungenauer.
Nur mit der Multiplikation ist es einfacher

177bits * 195(bits/V) = 34515(V) * Teiler 3 = 103545(V) jetzt nur den Punkt im LCD richtig setzen und du hast deine 10.3545V auf dem LCD, ohne DIVISION.
Nur über FESTKOMMAARETHMETIK



Nun hab ich nachstehende Divisions-Routine im Netz gefunden.
Allerdings rechnet die (auch) nicht richtig.
Da steht im Rest (=Nachkommastelle) nach obiger Rechnung, statt 4 eine 8!
Wo liegt hier der Fehler, bzw. wie/wo kann man das berichtigen?
Ich möchte bei den Zehntel-Volt schon relativ genau sein.

Sonst schaut bisher alles gut aus ... :)


; 8Bit Division mit Rest; Laufzeitverhalten im schlechtesten Fall (255/1) 103 Taktzyklen
; Achtung:
; Divison durch 0 wird nicht abgefangen und führt zu einer Endlosschleife
; Dieser Algorithmus funktioniert nur für vorzeichenlose 8Bit-Werte
; Nach Division steht das Ergebnis in r18 und der Rest in r16

.def divident = r16
.def divisor = r17
.def ergebnis = r18
.def zw = r19
ldi divident,177 ; Berechnet 177/17 !
ldi divisor,17
division:
clr ergebnis ; Ergebnis initialisieren
ldi zw,1 ; Teilbarkeit durch 1 annehmen
tst divisor
loop:
brmi div_loop ; Den Divisor linksbündig ? -> JA
lsl zw ; Zwischenergebnis und
lsl divisor ; Divisor einen Schritt nach links
rjmp loop ; ... und nochmal prüfen
div_loop:
cp divident,divisor ; divident >= divisor
brlo division_weiter ; -> nein
add ergebnis,zw ; Ergebnis vergrößern und
sub divident,divisor ; Dividenten verkleinern
division_weiter:
lsr divisor ; Divisor und Zwischenergebnis
lsr zw ; einen Schritt nach rechts
brne div_loop ; zw!=0 ? ->JA
nop ; Ergebnis in ergebnis
; Rest in divident !
end: rjmp end

Wo hast denn die Routine her ? Ähm der Rest steht nicht zufällig im DIVIDENT R16 drin mit 7 ??

177/17 = 10, ;10*17 = 170
177 -170 = R 7 ;7/ 17 schwer also 7*10 = 70
70/17 = 4 also 10,4 ;4*17 = 68 somit
70-68 = R 2 ;2/17 schwer also 2*10 = 20
20/17 = 1 also 10,41 ; 1*17 = 17
20-17 = R 3 ; 3/17 schwer also 3*10 = 30
30/17 = 1 also 10,411 usw...



Im AVR-Studio funktionieren aber sehr wohl auch T0 und T1 OVF.
Kann ich davon ausgehen, dass das auch in der Realität so ist?

NEIN das Datenblatt weiß mehr als der Simulator ausser es ist unter der Hilfe angegeben. Grundsätzlich aber das Datenblatt ausschlaggebend.

Man kann aber den Timer laufen lassen oder den Prescaler vor den SLEEP-Befehl zu setzen ist nun nicht wirklich kein Problem oder ?

HeSt
12.01.2019, 12:56
Danke für die Antworten!

Es kommt drauf an, welchen Sleep Mode Du möchtest, ...

In diesem Fall ist nur Timer2 angegeben, egal welcher Modus.

Beim ATmega328P steht auch nur Timer2. Ich verwende aber Timer1, der dann bei Überlauf einen Interrupt auslöst und auch zum Aufwachen führt.
Allerdings muss ich darauf achten, dass im jeweiligen Sleep-Mode dann der Timer1 auch aktiv ist.
Das gibt mir Hoffnung. Im Datenblatt des ATmega328P ist auch nur Timer2 angegeben.

25µs versus 103µs bei 1Mhz
Mir gings nur darum, ob mein Gedankengang richtig ist.
Ob da noch vorne und hinten ein paar µs dazu kommen, darum gings nicht.
Aber danke für die exakte Erklärung!

Ja ADLAR lässt den ADC auf 8Bit schrumpfen somit ist deine Auflösung 5V (AREF) / 256bits = 0,0195..V also 19,5mV pro Bit
2 Hundertstel Volt an Genauigkeit genügen mir. Wenn die Zehntel stimmen passt es schon.

Diesen Wert deklarierst du dir als z.B: 195 in der Init und MULTIPLIZIERST du dir dann mit den im ADCH zu Verfügung stehenden BITS z.B.: mit 256 = 49920.
Dein Widerstandsteilerverhältnis ist 3:1 heißt 49920*3 = 149760 den Punkt richtig setzen und du hast deine 14.976V ohne geschönt zu haben.
Die Multiplikationen hatte ich ja auch schon im Kopf.
NUR: ein 16Bit Register (word) fasst nur bis 65535.
Laut Datenblatt wird das Ergebnis einer Multipikation in R1-R0 geschrieben = 16Bit.
Wie aber funktioniert diese Multiplikation: 49920*3 = 149760?
Wo soll 149760 gespeichert werden?
Oder hier:
177bits * 195(bits/V) = 34515(V) * Teiler 3 = 103545(V)
Da fehlt mir noch einiges an Wissen ...

Wo hast denn die Routine her ?
Irgendwo aus dem Netz. Woher weiß ich nicht mehr.

Moppi
12.01.2019, 13:03
Der Timer2 ist glaub ich ein besonderer. Zumindest beim ATmega328P kann man den auch unabhängig takten, selbst, wenn sonst alles schläft und auch der übliche Taktgenerator abgeschaltet ist.
Das man auch Timer1 verwenden kann oder einen andern, liegt beim 328P daran, dass der auch durch so ziemlich jeden Interrupt geweckt werden kann. So löst auch der Timer1 bei Überlauf einen Interrupt aus und weckt also den µC. Auch wenn der Timer1 jetzt namentlich nicht direkt in der Tabelle steht. Auch Signalwechsel an den I/O-Ports können einen Interrupt auslösen und so zum Wecken führen. So könnte man auch eine Real Time Clock extern anschließen.


MfG

HeSt
12.01.2019, 13:24
Ja, T2 ist ein async Timer, die anderen nicht.
Und PCInts hab ich beim Mega16 auch schon vermisst. Offenbar gibts die wirklich nicht :(
Beim Mega328 allerdings schon.

avr_racer
12.01.2019, 13:35
Die Multiplikationen hatte ich ja auch schon im Kopf.
NUR: ein 16Bit Register (word) fasst nur bis 65535.
Laut Datenblatt wird das Ergebnis einer Multipikation in R1-R0 geschrieben = 16Bit.
Wie aber funktioniert diese Multiplikation: 49920*3 = 149760?
Wo soll 149760 gespeichert werden?
Oder hier:
177bits * 195(bits/V) = 34515(V) * Teiler 3 = 103545(V)
Da fehlt mir noch einiges an Wissen ...

Na so als wenn du eine schriftliche Multiplikation machst. Heißt z.B: bei 49920*3 = 40000*3 + 9000*3 + 900*3 + 20*3 + 0*3 = 120000 + 27000 + 2700 + 60 + 0 = 149760 .
Im Link siehst du das ich erst 1low*2low + 1low*2high + 1high*2low + 1high*2high rechne
https://www.roboternetz.de/community/threads/64609-AtMega8-kleine-Bibliothek unter Mathe.asm ;)
http://www.avr-asm-tutorial.net/avr_de/rechnen/index.html

Das Wissen fehlt dir nicht sondern es ist nur verschüttet im Unterbewusstsein, man hats ja mal in der 2-4Klasse gelernt

Wo es gespeichert wird hängt von der Rechenart ab, Bei der Multiplikation fest verankert IMMER in R0:R1 heißt wenn dort die Werte vorher geladen werden, werden sie danach überschrieben.
Addition/Subtraktion Add r16,r17 wird das Ergebnis immer in das Register vor dem Komma geschrieben siehe Datenblatt Instructionset

Einfach mal im Simulator Werte laden und mit den Rechnarten probieren zum Verständnis.

Zum Timer 2 der kann ASYNCHRON bzw für SLEEP muss sogar ASYNCHRON betrieben werden.

Der MEGA16/32 sind die älteren Generationen Atmega 48/88/168/328 sind alles Atmega8 nur mit 4-32Kbyte Flash und kleinen Unterschiedlichkeiten in der Adressierung der Hawrdwere aber sonst identisch

HeSt
12.01.2019, 21:44
Mein lieber Schwan!!
Das soll einer behirnen!?
Bei deinem "Mathe.asm" Beispiel steige ich komplett aus!!
Tut mir leid. Das pack ich einfach nicht. Das ist mir viel zu verwirrend.
Dafür gehts bei der Routine "Hardware Multiplikation von 16- mit 8-Bit-Zahl" aus dem Tutorial.
Danke!


177bits * 195(bits/V) = 34515(V) * Teiler 3 = 103545(V) jetzt nur den Punkt im LCD richtig setzen und du hast deine 10.3545V auf dem LCD
Das stimmt so nicht!
103545 ist eine "Zahl"! Die kann ich am Display nicht anzeigen.
Einen 8-Bit Registerinhalt in Text umzuwandeln geht ja. Dazu hab ich eine Routine im Netz gefunden.
Aber wie geht das mit 3 Registern zu je 8-Bit?
Da kann ich nicht einfach jedes einzelne Register in Text umwandeln.
Für eine Zahl aus 3 Registern in ASCII bin ich im Netz leider nicht fündig geworden.
Ich kapier das alles leider (noch) nicht. :(

Moppi
12.01.2019, 22:27
(fang mal irgendwann ganz sachte mit C++ an)

avr_racer
13.01.2019, 11:24
Mein lieber Schwan!!
Das soll einer behirnen!?
Bei deinem "Mathe.asm" Beispiel steige ich komplett aus!!
Tut mir leid. Das pack ich einfach nicht. Das ist mir viel zu verwirrend.
Dafür gehts bei der Routine "Hardware Multiplikation von 16- mit 8-Bit-Zahl" aus dem Tutorial.
Danke!

Ausgangsbasis sind immer 2*16bit Zahlen die jeweils aus 2*8bit Registern zu 1*16bit zusammen gefasst sind. Die Ergebnissregister sind 4*8bit somit ist der Zahlenbereich 0-4294967296 Zahlen möglich womit deine 103545 locker reinpasst.
Das Ergebnis steht auch relativ sichtbar
Was ist dennn angeblich so verwirrend ?

Nur weil das Carry also der Übertrag bei der Addition mit hinzukommt ? Wenn du selber schriftlich multiplizierst rechnest du doch genauso:

.....1234 * 5
.........20
.......150
......1000
......5000
.= ..6170

Rein in binär kann man das auch rechnen nur das wird absolut zuviel.
Das Problem bei dieser Routine ist das du die Restbildung zum Erweitern sich deutlich verkompliziert.
Denn hier bist du schon in der Floatingpointoperation heißt mit Kommastellen rechnen...



Das stimmt so nicht!
103545 ist eine "Zahl"! Die kann ich am Display nicht anzeigen.
Einen 8-Bit Registerinhalt in Text umzuwandeln geht ja. Dazu hab ich eine Routine im Netz gefunden.
Aber wie geht das mit 3 Registern zu je 8-Bit?
Da kann ich nicht einfach jedes einzelne Register in Text umwandeln.
Für eine Zahl aus 3 Registern in ASCII bin ich im Netz leider nicht fündig geworden.
Ich kapier das alles leider (noch) nicht. :(

Warum kannst du diese Zahl im Display nicht dastellen ? Du wandelst die 8bit in Text ? Eher nicht du meinst du wandelst es von 8Bit in DEZIMAL.
Die Routine ist nichtsweiter als ein Vergleich z.B.:
von 2300
>=1000 ? ja 2300 minus 1000 = 1 Durchgang Rest 1300
>=1000 ? ja 1300 minus 1000 = 1 Durchgang Rest 300
Durchgänge incrementieren oder Subtrahieren Wert als 2 speichern = tausender Stelle
>= 100 ? ja 300-100 = 1 Durchgang Rest 200
>= 100 ? ja 200-100 = 1 Durchgnag Rest 100
>= 100 ? ja 100-100 = 1 Durchgang Rest 0
Speichern als hunderter Stelle 3
>= 10 ? nein also 0 speichern als Zehner Stelle
>= 1 ? nein also 0 speichern als einer Stelle

Jetzt zu deiner Frage wie macht man das für x-8Bit-Register?
1byte 8 bit = 255 = Zahlenbereich also 100 ist dein Grundwert mit dem man beginnt abzuziehen
2byte 16 bit = 65535 = Zahlenbereich also 10000 ist dein Grundwert mit dem man beginnt abzuziehen
3byte 24 bit = 16777215 = Zahlenbereich also 10Mio ist dein Grundwert mit dem man beginnnt abzuziehen
usw

Hinweis Wertebereich 8bit = 256 Zustände. Der Zahlenbereich ist immer Wertebereich minus 1 deshalb 255 Trotzdem bleiben es 256 Zahlen 0-255

SO und auch dafür gibs eine Lösung im selbigen Link und nennt sich HEX_DEZ_Wandlung auch in der MATHE.ASM zu finden nur mit dem Unterschied das es eben für 4*8Bit ausgelegt ist der Zahlenbereich 0-4294967296.
Wenn du nach der Wandlung dir die Werte ins SRAM speicherst, stehen diese gleich als DEZIMAL zu Verfügung und man kann sich das Ergebniss sofort anschauen. DEBUG-Option im Simulator

Wie stark nutzt du den Simulator ? Also spielst du jede Änderung durch ?

Nachtrag: Sich mit diesen Grundlagen zu beschäftigen ist im ersten Moment schwer nur ohne gehts einfach nicht. Rate mal warum viele soviele Probleme in Hochsprachen haben obwohl diese es eigentlich einfacher machen sollten...

(fang mal irgendwann ganz sachte mit C++ an)
Klar 2 Jahre erstmal den Syntax lernen ohne das man irgendwas am Controller als Ergebnis sieht.... Auch die Wandlungen macht C+/C++/C# und alle anderen Hochsprachen ebenso nur mit anderen Ausdrücken... ;)

HeSt
13.01.2019, 13:24
Was ist dennn angeblich so verwirrend ?
Nur weil das Carry also der Übertrag bei der Addition mit hinzukommt ?
Nein, das ist es nicht.
Wenn man, so wie du, mit der Materie auf du + du ist, ist das leicht(er) zu verstehen.
Das fehlt bei mir leider noch fast völlig. Ich hab solche Rechnereien bislang nicht benötigt und mich somit auch nicht damit befasst.
Deshalb brauche ich jetzt Zeit zum behirnen. Bitte um Geduld.

SO und auch dafür gibs eine Lösung im selbigen Link und nennt sich HEX_DEZ_Wandlung auch in der MATHE.ASM zu finden nur mit dem Unterschied das es eben für 4*8Bit ausgelegt ist der Zahlenbereich 0-4294967296.
Wenn du nach der Wandlung dir die Werte ins SRAM speicherst, stehen diese gleich als DEZIMAL zu Verfügung und man kann sich das Ergebniss sofort anschauen. DEBUG-Option im Simulator
Das, was davor noch an Erklärung steht, muss ich erst ganz genau durcharbeiten ...
HEX_DEZ_Wandlung hilft mir nichts! Oder reden wir da aneinander vorbei?
Wenn ich zB einen Wert von 174 in einem 8-Bit Register habe, ist für mich dieser Wert DEZIMAL. Das kann ich aber nicht am Display anzeigen.
Ich muss die einzelnen Ziffern erst einzeln in ASCII/Text (1=$31,7=$37,4=$34) in einzelne Register umwandeln damit sie anzeigbar sind. Oder was meinst du mit dezimal anzeigen?

Wie stark nutzt du den Simulator ? Also spielst du jede Änderung durch ?
Das kommt auf den Code/die Änderung an. Wenn ich den Code "verstehe" und somit weiß wie er funktioniert, was er tut, meist nicht.
Bei diesen Rechnereien JEDE!

Nachtrag: Sich mit diesen Grundlagen zu beschäftigen ist im ersten Moment schwer nur ohne gehts einfach nicht. Rate mal warum viele soviele Probleme in Hochsprachen haben obwohl diese es eigentlich einfacher machen sollten...
Deshalb ist mir, auch wenn es aufwändiger ist, Assembler lieber, weil ich weiß (oder hoffe zu wissen) was der Prozessor wie macht.
Ich hab wahrscheinlich noch einen Knopf im Hirn, den es erst gilt zu lösen.;)
Dann wirds mir leichter fallen diese Rechnereien zu verstehen und dann auch zu codieren. Ich lerne bei jedem Projekt wieder was dazu.
Bei diesem ist es halt im Moment heftig, weil mir ein gewisses Grundverständnis (und damit meine ich nicht der Codierung) fehlt.
Ich werd's schon noch hinkriegen ...

Moppi
13.01.2019, 14:33
HEX_DEZ_Wandlung hilft mir nichts! Oder reden wir da aneinander vorbei?
Wenn ich zB einen Wert von 174 in einem 8-Bit Register habe, ist für mich dieser Wert DEZIMAL. Das kann ich aber nicht am Display anzeigen.
Ich muss die einzelnen Ziffern erst einzeln in ASCII/Text (1=$31,7=$37,4=$34) in einzelne Register umwandeln damit sie anzeigbar sind. Oder was meinst du mit dezimal anzeigen?

Dezimal sind Werte auf Basis von 10.
Hexadezimal Werte auf Basis von 16.
Binär oder Dual Werte auf Basis von 2.

In einem Bit kann nur Dual gespeichert werden.
In einem Byte, das aus 8 Bit besteht, wird Hexadezimal gespeichert. Hier sind Werte von 0 bis einschließlich 15 möglich.

Umgewandelt werden muss deshalb von Hexadezimal nach Dezimal , zur Ausgabe in einzelne Stellen (der darzustellenden Dezimalzahl) zerlegt und als ASCII-Wert abgebildet.

dezimal (Basis 10): 123
hexadezimal (Basis 16): 7B
binär (Basis 2) 8 Bit: 01111011


MfG

- - - Aktualisiert - - -


Klar 2 Jahre erstmal den Syntax lernen ohne das man irgendwas am Controller als Ergebnis sieht....

Na, na! Wenn man das erlernt, sieht man schon was... ;)

In der Tat sind die ersten Schritte schwer. Überall. Auch bei Assembler bzw. Maschinensprache braucht man Geduld. Nicht so schnell, immer eins nach dem andern. Ich glaube HeSt wird gerade etwas überrumpelt.

MfG

avr_racer
13.01.2019, 14:39
Nein, das ist es nicht.
Wenn man, so wie du, mit der Materie auf du + du ist, ist das leicht(er) zu verstehen.
Das fehlt bei mir leider noch fast völlig. Ich hab solche Rechnereien bislang nicht benötigt und mich somit auch nicht damit befasst.
Deshalb brauche ich jetzt Zeit zum behirnen. Bitte um Geduld.
Na lass mal genau wie du hab ich auch damit angefangen ohne solche Umherrechnen nur irgendwann gehts halt nicht mehr weiter. Also keine Angst dieser Lernzustand ist ganz normal ;)



Das, was davor noch an Erklärung steht, muss ich erst ganz genau durcharbeiten ...
HEX_DEZ_Wandlung hilft mir nichts! Oder reden wir da aneinander vorbei?
Wenn ich zB einen Wert von 174 in einem 8-Bit Register habe, ist für mich dieser Wert DEZIMAL. Das kann ich aber nicht am Display anzeigen.
Ich muss die einzelnen Ziffern erst einzeln in ASCII/Text (1=$31,7=$37,4=$34) in einzelne Register umwandeln damit sie anzeigbar sind. Oder was meinst du mit dezimal anzeigen?

Das sind nur die Namen der Register und fügst diese in deiner Hauptdatei zum Anfang ein oder "schaltest" es in der Mathe-Datei einfach frei.
Also HEX_Dez_Wandlung brauchst du trotzdem. denn wie willst du das A als DEZ darstellen bzw es sind ja 2 ASCII-Zeichen §31 und $30 nur das wären doch schon 2byte für zwei einezelne Ziffern die als Zehn interpretiert werden.
Einfacher ist es doch 1byte mit HEX 10 zu beschreiben und in der Ausgabe zum LCD
1. Kopie von $10 anlegen
2. swapst du das Highbyte auf lowbyte und addierst $30 dazu
3. $31 als Datensatz zum LCD schicken, 1 wird angezeigt
4. Kopie Highbyte ausmaskieren und wieder mit $30 addieren
5. $30 als Datensatz zum LCD schicken, 0 wird angezeigt

Hinweis: Die Mathe.asm bringst das Ergebnis steht in den Registern richtig drin, je nach Ansicht in Dezimal oder HEX. Ich entnnehme deiner Aussage das du es auf Dezimal eingestellt hast im Simulator.
Es gibt jetzt verschiedene Ansätze wie du diese Ergebnis jetzt wann wandelst.
1. Du nimmst die Register wie sie sind und wandlest erst bei der Ausgabe in ASCII-Zahlen was aber die Ausgabe komplizierter macht.
oder
2. Ergebniss berechnen lassen dann von HEX in Dezimal wandeln und im RAM ablegen ACHTUNG je nach ANSICHT im Simulator: HEX-Ansicht dann sind es PSEUDO-HEXEN da du es schon in DEZIMAL betrachtest oder in Dezimal dann sind die Werte als DEZ interpretiert falsch, Ausgabe der DEZ-Zahlen da in der mit der Addition des Wertes von $30

Noch mal einfach.
Du brauchst eine reine:
TEXTAUSGABE
ZAHLENAUSGABE

Hab mal zwei Bilder angehängt. $1312 * $0100 = $131200 da die ALU nur in Binär/(HEX) rechnen kann funktioniert die Registerübergreifende Darstellung in DEZIMAL nicht da die Zahlen von UNS falsch interpretiert werden
Damit du es richtig interpretierst müsstest du
19*256 + 18 = 4882 und 1*256 +0 = 4882 * 256 = 1249792
Das Ergbeniss richtig zu interpretiern
19*65536 + 18*256 + 0*256 = 1249792

33932


Das kommt auf den Code/die Änderung an. Wenn ich den Code "verstehe" und somit weiß wie er funktioniert, was er tut, meist nicht.
Bei diesen Rechnereien JEDE!

Deshalb ist mir, auch wenn es aufwändiger ist, Assembler lieber, weil ich weiß (oder hoffe zu wissen) was der Prozessor wie macht.
Ich hab wahrscheinlich noch einen Knopf im Hirn, den es erst gilt zu lösen.;)
Dann wirds mir leichter fallen diese Rechnereien zu verstehen und dann auch zu codieren. Ich lerne bei jedem Projekt wieder was dazu.
Bei diesem ist es halt im Moment heftig, weil mir ein gewisses Grundverständnis (und damit meine ich nicht der Codierung) fehlt.
Ich werd's schon noch hinkriegen ...

Wie gesagt das ist ein Frage deiner Darstellungsform im Simulator am besten auf HEX lassen wenn es Rgeisterübergreifend arbeitet.

HaWe
13.01.2019, 14:42
genau moppi, ich dachte eigentlich, das wäre einem asm-Programmierer bekannt...

Wenn ich zB einen Wert von 174 in einem 8-Bit Register habe, ist für mich dieser Wert DEZIMAL.
DAS stimmt natürlich nicht.
174 ist (ohne Vorzeichen) gespeichert als 10101110 bzw in 1 Byte-Register als 0xAE (editiert)
nun muss man diese Zahl in eine andere Schreibweise (mit dezimalen Ziffern) umwandeln (der Zahlenwert bleibt dabei ntl identisch), erst dann erhält man die drei Ziffern 1, 7, 4
und dann müssen die einzelnen Ziffernstellen 0-9 in Zeichen '0' bis '9' umgewandelt werden, erst dann lassen sie sich als Zeichen (nicht als Zahl) aufs Display bringen.

avr_racer
13.01.2019, 14:47
genau moppi, ich dachte eigentlich, das wäre einem asm-Programmierer bekannt...

DAS stimmt natürlich nicht.
174 ist gespeichert als 10101110 bzw in 2 Byte-Registern als 0xA 0xE
nun muss man diese Zahl in eine andere Schreibweise (mit dezimalen Ziffern) umwandeln (der Zahlenwert bleibt dabei ntl identisch), erst dann erhält man die drei Ziffern 1, 7, 4
und dann müssen die einzelnen Ziffernstellen 0-9 in Zeichen '0' bis '9' umgewandelt werden, erst dann lassen sie sich als Zeichen (nicht als Zahl) aufs Display bringen.

FALSCH
174 ist 1 BYTE die jeweils aus dem A als Highbyte und dem E als Lowbyte zusammengesetzt sind als 0xAE = 1Byte

HaWe
13.01.2019, 14:54
ah, stimmt, klar, Highbyte und Lowbyte passen ja bei unsigned char (0...255) zusammen rein.
Nur wenn man signed char (-128...+127) hat, braucht man bei 174 zwei Byte.

Moppi
13.01.2019, 14:58
FALSCH
174 ist 1 BYTE die jeweils aus dem A als Highbyte und dem E als Lowbyte zusammengesetzt sind als 0xAE = 1Byte

Richtig.

MfG

HaWe
13.01.2019, 15:00
Richtig.

MfG

war das jetzt noch nötig?

Moppi
13.01.2019, 16:08
Ja.

HeSt versucht was zu verstehen. Deshalb noch mal die Betonung, um Unsicherheit zu beseitigen. Und das Pallaver am Rande hilft ihm auch nicht weiter.

MfG

HeSt
13.01.2019, 19:32
He Leute!
Langsam! Keine Seitenhiebe wegen mir !!!
Ich hab schon verstanden.
Die Auslegung von DEZIMAL war mir in diesem Sinne nicht geläufig.
Darum habe ich im Post #116 ja geschrieben: "reden wir aneinander vorbei?"
Dem war defacto so.
Ich meinte mit "dezimal" NUMMERN/ZIFFERN (123...)!
Gespeichert wird in dual, angezeigt in Hex um einstellig zu bleiben.
Und "Ziffern" (0,1,2,...) kann ein Display nicht darstellen, sondern nur in "Textform" als $30,$31, ....
Das war eben die Ungereimtheit.
Jeder meinte mit "dezimal" was anderes.
Ich werd mal alles durcharbeiten, was ich an Erklärungen erhalten hab.
Wird ein bisschen dauern, muss auch wieder mehr was anderes tun als nur hier rumgrübeln ... ;)

Moppi
13.01.2019, 19:52
Ja das ist es eben. Du kennst Zahlen als Schrift, wie Du schreibst. So existieren sie in Deiner Vorstellung und deswegen meinst Du diese Zahlen. Aber der Computer kennt eben eine andere "Schrift" für Zahlen und die ist erst mal binär. Die hexadezimale Darstellung bildet eine bestimmte Bit-Menge ab. Mit 4 Bit lassen sich Werte von 0 bis 15 abbilden: 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E und F. Danach kommen 8 Bit, die aus jeweils 4 Bit bestehen: 4Bit|4Bit (z.B.: 0A, 12, B3). Dann fasst man zweimal 8 Bit zu 16 Bit zusammen: 8Bit|8Bit. Und so geht das dann vom Prinzip immer weiter. So kommt man irgendwann zu Datentypen, die 32 Bit umfassen oder noch mehr sogar.

Du musst Dich auf jeden Fall intensiv mit dem Rechnen in Maschinensprache auseinandersetzen. Ich finde, das ist jetzt das Wichtigste an allem. Sonst kommst Du immer wieder in Schwierigkeiten und verschiedene Dinge nicht verstehen zu können. Das gehört aber zum Grundverständnis. - Du hast Dir ganz schön was vorgenommen. :)

MfG

avr_racer
13.01.2019, 20:27
Die Auslegung von DEZIMAL war mir in diesem Sinne nicht geläufig.
Darum habe ich im Post #116 ja geschrieben: "reden wir aneinander vorbei?"
Dem war defacto so.
Ich meinte mit "dezimal" NUMMERN/ZIFFERN (123...)!
Gespeichert wird in dual, angezeigt in Hex um einstellig zu bleiben.
Und "Ziffern" (0,1,2,...) kann ein Display nicht darstellen, sondern nur in "Textform" als $30,$31, ....
Das war eben die Ungereimtheit.
Jeder meinte mit "dezimal" was anderes.
Ich werd mal alles durcharbeiten, was ich an Erklärungen erhalten hab.
Wird ein bisschen dauern, muss auch wieder mehr was anderes tun als nur hier rumgrübeln ... ;)

Ein Zündgedanke war im #116er schon dabei nur in der Weiterführung gings in die falsche Richtung.
Können wir uns auf Zeichen einigen ?
Diese Zeichen sind im LCD als ZEICHENVORRAT hinterlegt welche dann über eine ADRESSE angesprochen und dargestellt werden kann.
Das das LCD keine Ziffern darstellen kann ist eher nicht richtig, es kanns ja, nur du meinst eher die Umsetzung von Zahl -> Mensch -> µC -> LCD -> Zahl passiert.

Diesen Gedankengang hatte ich damals auch wie stellt ein LCD etwas da, bis mir jmd sagte das vieles fest vordefiniert wird was einfach dann abgerufen wird.
https://de.wikipedia.org/wiki/American_Standard_Code_for_Information_Interchange


ah, stimmt, klar, Highbyte und Lowbyte passen ja bei unsigned char (0...255) zusammen rein.
Nur wenn man signed char (-128...+127) hat, braucht man bei 174 zwei Byte.

Hab es mir schon gedacht das da ein Denkfehler vorlag. Mit signed vollkommen recht. ;) Ging auch nicht gegen dich...

@Moppi danke für die Unterstützung


eine "Ziifer" ist ein Zeichen (für die Darstellung einer Stelle einer Zahl), ist aber selber keine Zahl ! http://www.roboternetz.de/phpBB2/images/smiles/icon_cool.gif

Jep das hat ja schon den Hauch einer Definition. ;)

HaWe
13.01.2019, 20:38
eine "Ziffer" ist ein Zeichen (für die Darstellung einer Stelle einer Zahl), ist aber selber keine Zahl ! 8)
(Eine "Zahl" ist Konstrukt, das sich in verschiedenen Zahlensystemen mit verschiedenen Ziffern schriftlich darstellen lässt)
Ziffern sind genau das, was die ASCII Codes 48...57 plus ggf. zusätzlich weitere Buchstaben (für andere Zahlensyteme) repräsentieren.

HeSt
15.01.2019, 11:10
@avr_racer

Hab mich mit deinem "Mathe.asm" Programm auseinander gesetzt.
Vieles ist mir jetzt klar(er), alles noch nicht ...
Was ich gefunden hab, hab ich dir bereits in der PN geschrieben.

Was mir noch nicht klar ist, wozu die SWAPs in HEX_DEC gut sein sollen?
Das macht die Umwandlung in ASCII schwieriger!
Beispiel:
34515: 03 40 05 15 (besser: 03 04 05 01 05 ohne swap und ZE getrennt)

Wie kann ich ZE gemeinsam in ASCII umwandeln/anzeigen?
Da ich die Ziffern am LCD einzeln ausgebe, müssen die getrennt sein.
Das ist zumindest mein Gedankengang.
Oder liege ich hier falsch?

HaWe
15.01.2019, 11:49
@avr_racer

Hab mich mit deinem "Mathe.asm" Programm auseinander gesetzt.
Vieles ist mir jetzt klar(er), alles noch nicht ...
Was ich gefunden hab, hab ich dir bereits in der PN geschrieben.

Was mir noch nicht klar ist, wozu die SWAPs in HEX_DEC gut sein sollen?
Das macht die Umwandlung in ASCII schwieriger!
Beispiel:
34515: 03 40 05 15 (besser: 03 04 05 01 05 ohne swap und ZE getrennt)

Wie kann ich ZE gemeinsam in ASCII umwandeln/anzeigen?
Da ich die Ziffern am LCD einzeln ausgebe, müssen die getrennt sein.
Das ist zumindest mein Gedankengang.
Oder liege ich hier falsch?
ich fürchte, du hast immer noch nicht verstanden, dass du eine auf dem µC gespeicherte Zahl (z.B. 0xAE) nicht direkt in ASCII als Dec Zahl ausgeben kannst, denn weder 0xA noch 0xE sind Dezimalziffern.
also musst du erst durch eine Reihe von Rechenoperationen (Division, Modulo) eine Dezimalsystem-Stellen-Zerlegung erzeugen (Hunderter, Zehner, Einer, hier also: 1*100 + 7*10 + 4*1)


Hunderter: 0xAE/100
Zehner: (0xAE mod 100) / 10
Einer: (0xAE mod 100) mod 10

und erst DIESE kannst du dann (per ASCII offset=48 ) als Ziffern ausgeben (1 7 4 , einzeln oder gemeinsam als string).

HeSt
15.01.2019, 11:58
Ich hab sehr wohl verstanden WIE Ziffern/Zahlen/Zeichen angezeigt werden können!
Offenbar kann ich mich nicht so ausdrücken, dass ihr das so versteht, wie ich es meine!
Die Rechenoperationen sind bis auf die ASCII-Umwandlungen durch (34515).
Diese Registerinhalte 03 04 05 01 05 (15 bereits getrennt) müssen klarerweise noch in ASCII umgewandelt werden um sie anzeigen zu können.
Es geht nur darum, dass die einzelnen Register nurmehr mit $30 addiert werden müssen, dann kann man sie einzeln anzeigen.
Aber 40 oder 15 mit $30 addiert ergibt kein anzeigbares Zeichen!! Zumindest nicht die Ziffer, die es sein soll!
Also auf "low-nibble" = 04!
Und 15 trennen auf 01 05!
Hast mich jetzt??

HaWe
15.01.2019, 12:11
Hast mich jetzt??

sorry, leider nein.
Alle ASCII-Zeichen ab dec 48 ($30) sind anzeigbar, und natürlich dürfen es dezimal nur die Werte 48-57 sein (48+0 bis 48+9).
Wschl muss es dir ein asm-Progger erklären.

HeSt
15.01.2019, 12:18
Damit ich die Zahl 34515 auf dem LCD anzeigen kann, muss ich jede einzelne Ziffer dieser Zahl (jede Ziffer steht in einem eigenen Register) in anzeigbare Zeichen umwandeln = Ziffer + $30:
3 = $33, 4 = $34, 5 = $35, 1 = $31 und 5 = $35.
Entweder ich geb das zusammengefasst als String aus (wobei ich nicht weiß, wie ich das zu einem String zusammenstellen kann) oder eben jedes einzeln.
Ein "03" oder "05", .... wie es im Register steht ist nicht anzeigbar!
Jetzt??

HaWe
15.01.2019, 12:22
Jetzt?? nein, sorry, ich muss mich ausklinken, (edit) deine Rechnungen sind sogar ok (so rechne ich selber ja auch), aber dein Problem ist für mich als C-Programmierer so als wäre es in sumerischer Keilschrift geschrieben ;)

HeSt
15.01.2019, 12:25
:) Ist ja auch gut !! :)
avr_racer verstehts schon ;)

HaWe
15.01.2019, 12:35
letzter Versuch - kannst du direkt nacheinander die Konstanten
$30
$31
$32
$33
$34
ausgeben?
Wenn nein, funktioniert deine lcd-Ausgabe nicht.
Wenn ja, hast du dich vlt oben verrechnet bei der Dezimalstellen-Zerlegung...

HeSt
15.01.2019, 12:36
Alle $xx ja,
§33 ist nicht anzeigbar.

C und Assembler sind nicht identisch!!
Vergiss es! ;)

HaWe
15.01.2019, 12:38
typo, sollte ntl $33 heißen.

Aber dann liegt wohl der 2. Fall vor (Rechenfehler)
C erzeugt denselben Maschinencode wie asm und rechnet mit denselbern Registerwerten.

avr_racer
15.01.2019, 16:40
@avr_racer

Hab mich mit deinem "Mathe.asm" Programm auseinander gesetzt.
Vieles ist mir jetzt klar(er), alles noch nicht ...
Was ich gefunden hab, hab ich dir bereits in der PN geschrieben.

PN



Was mir noch nicht klar ist, wozu die SWAPs in HEX_DEC gut sein sollen?
Das macht die Umwandlung in ASCII schwieriger!
Beispiel:
34515: 03 40 05 15 (besser: 03 04 05 01 05 ohne swap und ZE getrennt)

Der Swap dient der Zuordung der richtigen Stelle
1Mio, 100tsder, 10tsder, Tausender, Hunderter, Zehner, Einer.
Das hängt davon ab wie man es betrachtet. Wenn ich rechne möchte ich das Ergebnis als ganzes sehen um evtl Fehler usw zu erkennen und spart Bytes. Somit habe ich eine reine Zahlenroutine nur für die Ausgabe von Zahlen.
Wenn man jeder Ziffer der einzelnen Stellen jeweils ein Byte zuordnet kann man das gern machen um es dann mit $30 zu addieren um es quasi als LCD-Ziffer schon parat und abrufbereit zu haben, erfordert je nach Ergebnis aber eben schonmal bis zu 10byte.
Problem wirds geben wenn man das zu früh macht und evtl mit dem Ergebniss weiter rechnen muss...

Ich spare mir das indem ich dafür eine reine Zahlenroutine habe die dann High/Lowbyte auftrennt und $30 dazu addiert



Wie kann ich ZE gemeinsam in ASCII umwandeln/anzeigen?
Da ich die Ziffern am LCD einzeln ausgebe, müssen die getrennt sein.
Das ist zumindest mein Gedankengang.
Oder liege ich hier falsch?

Nun ich nehme an das ZE als Buchstaben zu betrachten sind und Buchstaben brauchen nicht mehr gewandelt werden.
Mach mal einen Doppelklick auf ein Register, dort hast du jetzt mehrere Möglichkeiten einen Wert einzugeben und in HEX/DEZ/OCT/BIN/TEXT darstellen zu lassen. Also klicke mal TEXT an und gebe Z oder E ein. Dann klickst auf Bin oder HEX oder DEZ, da steht dann der Zahlenwert im jeweiligen Zahlensystem. Mal einen Wert von E oder Z als BIN anzeigen lassen und nix machen
Wechsel zur PDF des LCD. Dort ASCII-Tabelle suchen und mal die UPPER und LOWER 4Bit ansehen und vergleichen nun sollte eigentlich ein EUREKA die Synapsen befeuern ;)
Selbst dein Bildschirm beinhaltet diesen Zeichensatz.




Diese Registerinhalte 03 04 05 01 05 (15 bereits getrennt) müssen klarerweise noch in ASCII umgewandelt werden um sie anzeigen zu können.
Es geht nur darum, dass die einzelnen Register nur mehr mit $30 addiert werden müssen, dann kann man sie einzeln anzeigen.

absolut korrekt.



Aber 40 oder 15 mit $30 addiert ergibt kein anzeigbares Zeichen!! Zumindest nicht die Ziffer, die es sein soll!
Also auf "low-nibble" = 04!
Und 15 trennen auf 01 05!
Hast mich jetzt??

40 als DEZ + $30 = $58 in binär 0101 1000 und sollte eigentlich das X sein
15 als DEZ + $30 = $3F in binär 0011 1111 und sollte eigentlich das ? sein

$40 + $30 = $70 in binär 0111 0000 müsste das p sein
$15 + $30 = $45 in binär 0100 0101 müsste das E sein



Damit ich die Zahl 34515 auf dem LCD anzeigen kann, muss ich jede einzelne Ziffer dieser Zahl (jede Ziffer steht in einem eigenen Register) in anzeigbare Zeichen umwandeln = Ziffer + $30:
3 = $33, 4 = $34, 5 = $35, 1 = $31 und 5 = $35.
Entweder ich geb das zusammengefasst als String aus (wobei ich nicht weiß, wie ich das zu einem String zusammenstellen kann) oder eben jedes einzeln.
Ein "03" oder "05", .... wie es im Register steht ist nicht anzeigbar!
Jetzt??

Die erste Spalte, also $00 bis $0F, sind die Adressen für eigens zu erstellende Zeichen im CHARAKTER-ROM... Heißt du würdest jetzt im Zeichenvorrat-Ram deine eigenen Zeichen adressieren...
Als Assembler "String" wäre das eine Schleife.
Heißt du könntest diese Zahl im RAM ablegen um die Register frei zu machen somit dann gesichert. Und schreibst dir eine Unterroutine wo du dir die gesicherte Zahl in dein/e Register schreibst, $30 dazu addieren gefolgt von LCD_DATA. Vorher solltest du eine Adresse (00 bis 0F) + $80 für Zeile 1 oder für Zeile 2 ($40 bis $4F) + $80 definieren auf die bzw ab die das LCD mit dem setzen der Zeichen beginnen soll.

1. Adresse auf LCD setzen mit LCD_Command
2. Zeichen/Ziffer laden + bearbeiten
3. Zeichen mit LCD_DATA an LCD senden
4. bei weiteren Zeichen Sprung zu 2 solange bis EndeBedingung erkannt wurde die musst du dann für dich kreieren


:) Ist ja auch gut !! :)
avr_racer verstehts schon ;)

*LACHT*

HeSt
18.01.2019, 08:36
Ich möchte euch allen für eure Hilfe und Geduld danken!
Programm ist fertig - umgewandelt. :)
Ein paar kleine Schreib- und Definitionsfehler waren noch drin.
Die LCD-Funktionen hab ich - soweit mit dem T24 auf dem Miniboard möglich - getestet.
Schaut alles gut aus.
Demnächst wird die Platine entworfen.
Dann gehts weiter ...
Bei diesem Projekt hab ich wieder viel gelernt! Und auch die Scheu vor einem LCD verloren ;)
Es ist doch viel einfacher damit, wenn man immer wieder - zumindest anfangs - an ein paar Parametern "drehen" muss ...

PS:
Hab bei meiner alten MC20 Funke das LCD (ist um einiges größer als das neue 1602er) entfernt und bei meinem T24 Test probiert - läuft einwandfrei :)

HeSt
28.01.2019, 19:32
Bin wieder da ...

Frage:
Wie schalte ich ein LCD aus/ab, damit es keinen Strom mehr zieht - also nichts mehr verbraucht???

Der Grund - eine etwas kuriose Sache:
Ich hab ein Labornetzgerät, das ich zum Testen auf 5V und 65mA eingestellt hab.
Ich möchte das LCD nur dann in Betrieb haben, wenn ich Werte/Parameter anzeigen oder ändern, oder des Solarpanel manuell steuern will.
Schalte ich VDD (+) ab (gegen -), geht die Spannung etwas in die Knie = die Schaltung zieht mehr Strom.
Lege ich VDD oder VSS "floating" (also nirgendwo angeschlossen), bleibt zwar die Spannung stabil, dafür bleibt die Anzeige am LCD aktiv, wenn auch ein bisschen schwächer.

Der Suntracker wird an einem Akku betrieben.
Der Akku wird zwar bei genügend Sonnenenergie immer wieder geladen, aber trotzdem möchte ich den Stromverbrauch so gering wie möglich halten.
Die Schaltung wird zudem nachts oder bei zu wenig Sonnenenergie schlafen gelegt.

Sonst schaut's einstweilen gut aus :)

[edit]
Rätsel gelöst!
Solange am Datenport des LCD irgend ein Bit ein ist (=+):
1. Wenn VDD (+) gegen VSS (-) geschaltet wird, fließt offenbar über den Datenport Strom.
Deshalb auch der Spannungseinbruch (Sicherheitsschaltung des Labornetzgerätes).
2. Wenn VDD (+) oder VSS (-) "floating" sind, bekommt das LCD über den Datenport noch genug Strom um die Anzeige (schwächer) aufrecht zu erhalten.
Lösung:
Alle Bits des Datenport auf aus (-) setzen, dann VDD auf aus (-) und alles ist gut ;)
[endedit]

avr_racer
29.01.2019, 11:43
Hey hallo,

Es gibt ein extra Befehl was das LCD bzw nur die Anzeige selbst ausschaltet. Muss dann aber trotzdem mit Spannung versorgt werden.

Wenn du das LCD komplett spannungslos machst, muss es auch neu initalisiert werden.

Spanung anlegen an ein Bauteil was in der Versorgungsspannung weggeschaltet ist, sollte man tunlichst vermeiden aussser das DB erlaubt es.

HeSt
29.01.2019, 17:35
Es gibt ein extra Befehl was das LCD bzw nur die Anzeige selbst ausschaltet. Muss dann aber trotzdem mit Spannung versorgt werden.
Ja, ich weiß. Mach ich auch bevor ich das LCD stromlos setze.

Wenn du das LCD komplett spannungslos machst, muss es auch neu initalisiert werden.
Ist auch klar.

Spannung anlegen an ein Bauteil was in der Versorgungsspannung weggeschaltet ist, sollte man tunlichst vermeiden ausser das DB erlaubt es.
Nun, das weiß ich nicht. Aber warum sollte es ein Problem sein, wenn man das LCD von der Versorgungsspannung kappt??
Es funktioniert jedenfalls einwandfrei.:)

avr_racer
29.01.2019, 21:21
Okay war mir nicht sicher dir es bewusst war/ist...

LCD ausschalten per Befehl und nicht stromlos schalten Verbrauch wenige µA....
LCD bleibt eingeschaltet Strom ca. max. 3mA ohne LED-Beleuchtung.

Einige Pins/IC mögen eben die Kriechstöme nicht die an den Pins wirken wenn die UB fehlt. Je nach Schaltungsart können diese Kriechströme Umwege über die +Rail nehmen und somit weitere Teile des IC versorgen womit dieser aber nicht richtig funktioniert...

Klebwax
30.01.2019, 02:41
Einige Pins/IC mögen eben die Kriechstöme nicht die an den Pins wirken wenn die UB fehlt. Je nach Schaltungsart können diese Kriechströme Umwege über die +Rail nehmen und somit weitere Teile des IC versorgen womit dieser aber nicht richtig funktioniert...

Nun, es sind keine "Kriechströme", es ist der Strom durch die Substratdioden. Diese entstehen bei der Herstellung des Chips und werden vom Marketing gerne als ESD-Schutzdioden verkauft. In manchen Datenblättern ist ein Diagramm einer typischen I/O-Struktur, da sind sie eingezeichnet. Deswegen findet man vielfach auch die Angabe, daß die Spannung an einem I/O Pin nicht größer als die Versorgung + 0,5V oder nicht kleiner als GND - 0,5V sein darf, damit diese Dioden nicht anfangen zu leiten. Ist dann auch noch ein Abblockkondensator am Chip, bildet das einen Halbbrückengleichrichter, der selbst aus wechselden Signalen eine unzuverlässige Versorgung erzeugt. I/O Pins ohne diese Dioden sind schwerer (teurer) herzustellen und werden daher extra beworben, z.B. mit "over the rail".

MfG Klebwax

HeSt
31.01.2019, 07:22
Ok, danke für die Erklärungen!
Da ich alle Pins des LCD-Ports am µC für und somit auch die des LCDs auf GND lege, sollte es zu keinen der oben beschriebenen Problemen kommen.

HeSt
01.02.2019, 15:45
So, ein Problem, das ich seit Tagen zu klären versuche ...
Ich komm nicht dahinter :(
Deshalb bitte ich um eure Hilfe.

Das angehängte Progrämmchen ist ein Auszug aus meinem SunTracker Projekt.
Es soll in einer Schleife die Spannungen am LCD anzeigen und aktuell halten.
Angezeigt wird in der zweiten Zeile links der 8-Bit ADCH-Wert im ADLAR-Modus und
rechts der umgerechnete Wert im 10-Bit Modus in Volt (Basis: 15V = 1024).
Funktioniert super, ABER NUR DANN , wenn die in der Routine DSPVALS die zwischen den beiden ;???? Zeilen stehenden Befehle aktiv sind.

Werden die Befehle für die Anzeige im 8-Bit Modus deaktiviert, funktioniert die 10-Bit Anzeige/Umrechnung nicht mehr.
Beim ersten Durchlauf wird zwar die richtige Spannung angezeigt, aber nicht mehr aktualisiert. Die Schleife läuft zwar, aber warum vom ADC nichts mehr kommt oder woran es sonst liegt ????????????

Poti auf ADC7 hängen oder welchen ihr auch immer testen wollt/könnt.

Kann mir da jemand weiter helfen?

avr_racer
02.02.2019, 15:27
Hallo,

1. Warum erst SAVR pushen und dann das SREG sichern in einer normalen Unterroutine ? Register SAVR dient der bloßen Sicherung was der Stack genauso machen könnte und man so wieder ein Register frei hätte falls benötigt.
Sonst nur notwendig wenn man mit Interrupts arbeitet und z.B. Rechenoperatonen durchführt dann muss/sollte das SREG in der ISR gesichert werden wie folgt:


in Register , SREG
PUSH Register
Prgrammcode
POP REGISTER


2.

WADC: ;Schleife bis Messung
sbic ADCSRA,ADSC ;abgeschlossen = ADSC=0
rjmp wadc
cbi ADCSRA,ADEN ;ADC ausschalten
out SREG,savr
pop savr
ret


Wenn du den ADC jedesmal nach der Wandlung deaktivierst:
1. braucht der ADC jedesmal bei der ersten Wandlung 25 Zyklen alle weiteren ca 13 Zyklen
2. das erste Ergebniss ist meist Müll
3. Die Wandlungsgeschwindigkeit sollte zwischen 50kHz - 200kHz betragen, bei dir ist es 7812,5Hz
4. Erst alles einstellen und dann ADEN auf 1 setzen ist ungünstig da Spannungsreferenz und Kannalum/einstellung nicht angenommen werden!!!!

Also richtig


ADC_Init:
1. ADEN setzen
2. Kanal auf GND setzen
3. Referenz einstellen
4. Testwandlung starten, auslesen, Ergebniss verwerfen
ret

WADC:
1. Kanal GND auf Kanal X setzen
2. Wandlung anstoßen
3. Wandlungszeit warten
4. Ergebnis auslesen
(5. Kanal X auf Kanal GND setzen aber kein muss)
ret


Wenn man dann in den Sleep wechseln will wird vor dem Sleep der ADC deaktiviert und nach dem Sleep neu initalisiert.

3. Wann wird denn ein Key gepresst ?

rjmp bri ;loop until any key pressed
Lass die Routine komplett durchlaufen und mach die Keyabfrage ausserhalb dieser Routine (Wahrscheinlich auch beabsichtigt)
Ebenso bau dir mal eine Zeitverzögerung ein sonst springen deine Werte auf dem LCD zu stark.

4. Vorsichtig mit irgenwelchen Sprungadressen dieser Art mit dem jetzigen Wissensstand!

rjmp pc-1

Verbesserungsvorschlag:



Init:
1. STACK
2. Power
3. PORTS
4. ADC_INIT (ADEN = 1, REF = 5V, Chanel = 11111, Testwandlung
5. LCD_ON

Hauptprogramm:
0. 150ms warten
1. Pinabfrage(SBIS/SBIC ?) wenn Bedingung erfüllt Sprung zu 2. sonst 3.
2. dspvals
3. rjmp Hauptprogramm

dspvals:
dein Programm
ret


Ein weiterer Hinweis betrifft:


push savr
in savr,SREG
.
.
.
.
out SREG,savr
pop savr

Was keinerlei Nährwert hat und kann komplett in allen Routinen entfernt werden.

HeSt
02.02.2019, 16:45
Hi,
DANKE, dass du dir die Mühe gemacht hast, das Progrämmchen durchzusehen!

1. Warum erst SAVR pushen und dann das SREG sichern in einer normalen Unterroutine ? Register SAVR dient der bloßen Sicherung was der Stack genauso machen könnte und man so wieder ein Register frei hätte falls benötigt.
Das Register ersparst du dir nicht, man braucht es sowieso in den ISRs.
Deinen Vorschlag zur Sicherung nehme ich an.


Wenn du den ADC jedesmal nach der Wandlung deaktivierst:
1. braucht der ADC jedesmal bei der ersten Wandlung 25 Zyklen alle weiteren ca 13 Zyklen
2. das erste Ergebniss ist meist Müll
3. Die Wandlungsgeschwindigkeit sollte zwischen 50kHz - 200kHz betragen, bei dir ist es 7812,5Hz
4. Erst alles einstellen und dann ADEN auf 1 setzen ist ungünstig da Spannungsreferenz und Kannalum/einstellung nicht angenommen werden!!!!
Gut. Verstanden.
Allerdings hab ich nirgendwo im Datenblatt gelesen, dass die erste Messung Müll ist (beim Tiny13 wird z.B. dezidiert darauf hingewiesen). Zudem ist es zumindest bei dieser Routine egal, weil sowieso laufend gemessen und nur angezeigt wird.
Zu 3. An der Wandlungsgeschwindigkeit kann es nicht liegen. Sie ändert sich nicht, ob nur eine Wandlung oder beide erfolgen (8Bit+10Bit). Bei beiden funktioniert es ja und die 8Bit alleine auch. Weiter runter drehen kann man nicht. /128 ist der größte Teiler!
Was meinst du bei 4. mit "erst alles einstellen"?
Wie soll ich den Kanal auf GND setzen, wenn da Dauerspannung anliegt?

3. Wann wird denn ein Key gepresst ?
In dieser Testroutine gar nicht. Wird im Gesamtprogramm abgefragt. Der Kommentar ist beim Kopieren mitgegangen ...

Werd deine Vorschläge einbauen. Mal sehen, wie weit sie Wirkung zeigen.
Komm allerdings erst in 10 Tagen dazu ...

avr_racer
02.02.2019, 21:40
Das Register ersparst du dir nicht, man braucht es sowieso in den ISRs.

Doch meistens schon bzw du kannst es doppelt nutzen einmal ausserhalb der ISR und innerhalb der ISR. Frage hast du denn im Originalcode ISR in der Benutzung?



Allerdings hab ich nirgendwo im Datenblatt gelesen, dass die erste Messung Müll ist (beim Tiny13 wird z.B. dezidiert darauf hingewiesen). Zudem ist es zumindest bei dieser Routine egal, weil sowieso laufend gemessen und nur angezeigt wird.
Ja eben nicht wenn du nach der Wandlung sofort den ADEN = 0 setzt danach passiert mit dem ADC gor nix mehr der ist AUS.



Zu 3. An der Wandlungsgeschwindigkeit kann es nicht liegen. Sie ändert sich nicht, ob nur eine Wandlung oder beide erfolgen (8Bit+10Bit). Bei beiden funktioniert es ja und die 8Bit alleine auch. Weiter runter drehen kann man nicht. /128 ist der größte Teiler!
Naja du undersamplest eben deshalb soll ja diese Sample/Abtastfreweunz bei 50kHz bis 200kHz liegen damit der Hold-Kondensator nicht zu stark belastet wird. Und zum Ende der Wandlung das Ergebnis verfälschen kann.



Was meinst du bei 4. mit "erst alles einstellen"?
Wie soll ich den Kanal auf GND setzen, wenn da Dauerspannung anliegt?


Wenn du schläfst kannst du denn Daten aufnehmen also aktiv lernen ? (Der Mensch kanns schon ;) nur die Digitaltechnik nicht wenn was ausgeschaltet wurde) oder anders kannst du was auf CD schreiben wenn der Motor abgeschaltet wird der die CD bewegt ?
Im AVR ist nur EIN Wandler enthalten der durch umschalten der Eingänge auf die verschiedenen Pins zwischen verschiedenen Spannungen messen kann oder eben auf Kanal GND/Bandgabspannung wird der Eingang des Wandlers gelegt.
Hoffe du nimmst es mir nicht übel wenn ich meine das auch hier wieder Grundlagen zum ADC im AVR fehlen...;)



In dieser Testroutine gar nicht. Wird im Gesamtprogramm abgefragt. Der Kommentar ist beim Kopieren mitgegangen ...

Werd deine Vorschläge einbauen. Mal sehen, wie weit sie Wirkung zeigen.
Komm allerdings erst in 10 Tagen dazu ...
Noch ein Hinweis dein Text ist im Moment ein mix aus Spagehtticode und halbsinnvoller Routinen, zumindest könnte man noch weitere Teile in Unterroutinen auslagern um so die "mittleren Routinen" lesbarer zu gestalten...

HaWe
03.02.2019, 11:56
15 Forums-Seiten, um was auf LCD auszugeben ... Per Arduino wären das 3 Zeilen Code....
***duck-und-weg-renn*** :p

seite5
03.02.2019, 12:54
15 Forums-Seiten, um was auf LCD auszugeben ... Per Arduino wären das 3 Zeilen Code....
***duck-und-weg-renn*** :p

Ja genau, sogar mein Frisör hat's geschafft, sein Garagentor mittels Arduino zu steuern, obwohl er eine LED nicht von einem Widerstand
unterscheiden kann! "3 Zeilen Code": mehr kann man von den MEISTEN Arduino-Usern auch nicht verlangen.

mfg
Achim

HaWe
03.02.2019, 15:12
"3 Zeilen Code": mehr kann man von den MEISTEN Arduino-Usern auch nicht verlangen.
mfg
Achim
falsch: man kann schon, muss es aber gar nicht, weil es so einfach geht 8)

avr_racer
03.02.2019, 17:04
15 Forums-Seiten, um was auf LCD auszugeben ... Per Arduino wären das 3 Zeilen Code....
***duck-und-weg-renn*** :p

Und wer hat wohl die Bibliotheken geschrieben das ein User evtl es in 3 Zeilen schafft ?? Denn hinter diesen 3 Zeilen, in Hochsprache, stehen gute 250 Zeilen in ASM. Dazu stellt sich die Frage wieviel der Premiumprogrammierer von der Hardware überhaupt verstanden hat...:rolleyes:

Der Seitenhieb ist schon ganz schön heftig und extremst unfair. Zu den 15 Seiten die ersten 7 kannste mal subtrahiern....

HaWe
03.02.2019, 20:39
Und wer hat wohl die Bibliotheken geschrieben das ein User evtl es in 3 Zeilen schafft ?? Denn hinter diesen 3 Zeilen, in Hochsprache, stehen gute 250 Zeilen in ASM. Dazu stellt sich die Frage wieviel der Premiumprogrammierer von der Hardware überhaupt verstanden hat...:rolleyes:

Der Seitenhieb ist schon ganz schön heftig und extremst unfair. Zu den 15 Seiten die ersten 7 kannste mal subtrahiern....

das war 1.) nicht unfair gemeint, sondern ironisch (und zugegeben: ein wenig stichelnd), deswegen das
***duck-und-weg-renn*** :p
2.) [Besserwisser /ein] sind die Libs in ganz legalem C und C++ geschrieben, nicht in asm, und darauf kam es mir eigentlich an [Besserwisser /aus], und
3.) ist es ja gerade das schöne, die Hardware ansteuern zu können, ohne sich um die ganzen vertrackten low-level -details kümmern und sie auch noch verstehen zu müssen 8)

seite5
04.02.2019, 09:04
falsch: man kann schon, muss es aber gar nicht, weil es so einfach geht 8)

ich bezweifle, dass auch nur 1% der Arduino-freaks in der Lage ist, z.B. einen ATSAM3X8E (DUE) ohne Arduino-libs zu programmieren.
mfg
Achim

HaWe
04.02.2019, 11:15
es sollte hier keine Diskussion über Arduino-User werden...

ich bezweifle, dass auch nur 1% der Arduino-freaks in der Lage ist, z.B. einen ATSAM3X8E (DUE) ohne Arduino-libs zu programmieren.
mfg
Achim

Der Sinn der Arduino-IDE besteht gerade darin, alle von Arduino unterstützten Boards nicht ohne, sondern MIT der Arduino-IDE weitestgehend Plattform-unabhängig v.a. auch von nicht-IT-Profis programmieren zu können, u.a. mit Hilfe der zur Verfügung stehenden Libraries. Genau dafür wurde das Arduino (ursprünglich "Wiring") Konzept entwickelt.
Auf diese Weise lassen sich z.B. das LCD 1602 oder 2004 oder auch OLEDs oder andere TFTs mit jedem beliebigen Arduino inkl. weiteren 3rd party Boards (Uno, Mega, Nano, Zero, Due, aber auch M4, ESP8266 oder ESP32 u.a.m.), alle grundsätzlich mit identischem Sourcecode programmieren (Arduino verwendet C/C++11), und auch externe Editoren können in diese IDE eingebunden werden.
Durch Nutzung der Libs vereinfacht sich der nötige eigene Code für verschiedenste Devices erfreulicherweise auf nur sehr wenige Zeilen, und Arduino-Uno-AVR-Code sieht dabei überhaupt nicht anders aus als Arduino-Due-ARM-ATSAM3X8E-Code - und genau das sind die erwünschten Riesen-Vorteile.
Generell ist aber C/C++ immer Library-basiert, das fängt schon bei libc, stdio, stdlib oder stdint an und ist beliebig endlos erweiterbar, das ist das C-Konzept, das per Sprachdefinition nur rund 20 reservierte keywords oder statements vordefiniert hat: der Rest steht immer in Libs.
Eine Arduino-Programmierung völlig außerhalb der Arduino IDE samt API Libs entspricht gerade NICHT dem Arduino-Konzept, und dein Arduino-User-Bashing ist also völlig offtopic und irrelevant.

seite5
04.02.2019, 11:56
Du solltest vielleicht mal den Fortlauf des Threads im Auge behalten, meine Argumentation bezieht sich auf Dein "falsch: man kann schon -
muss es aber gar nicht" - man kann eben nicht!
mfg
Achim

HaWe
04.02.2019, 12:01
Du solltest vielleicht mal den Fortlauf des Threads im Auge behalten, meine Argumentation bezieht sich auf Dein "falsch: man kann schon -
muss es aber gar nicht" - man kann eben nicht!
mfg
Achim

Das ist hohler Quatsch! Man muss es nicht erwarten können, weil es komplett irrelevant ist. Genau so wenig muss ich als Raspi-C- oder Python-Programmierer die Raspi-Hardware oder als Autofahrer die Kfz-Mechatronik kennen.

Manf
04.02.2019, 15:03
Es geht doch um nichts als um die philosophische Betrachtung von Möglichkeiten etwas zu entwickeln, gestern, heute und morgen wohl noch ganz anders.
Dafür sind harte Bezeichnungen eher übertrieben.

avr_racer
04.02.2019, 18:51
Genau so wenig muss ich als Raspi-C- oder Python-Programmierer die Raspi-Hardware oder als Autofahrer die Kfz-Mechatronik kennen.

Fährst du denn ohne die Bremse, Lenkrad, Schaltbox, Motor zu benutzen ? Oder wie bedienst du dein Fahrzeug

taxonomisch heißt kennen = ich weiß das es das gibt.

;)

HaWe
04.02.2019, 22:05
Fährst du denn ohne die Bremse, Lenkrad, Schaltbox, Motor zu benutzen ? Oder wie bedienst du dein Fahrzeug

taxonomisch heißt kennen = ich weiß das es das gibt.

;)
da interpretierst du meine Aussage aber schon völlig grundverkehrt, das ist dir ja wohl klar: die Mechatronik kennen war zu verstehen als: die Dinge und Funktionen bis in alle Details samt allen Programmierungen und Steuerungen kennen, darum ging es ja im Disput Aduino versus asm und ARM cores direkt programmieren 8)

seite5
05.02.2019, 09:16
Das ist hohler Quatsch!

Da Du jetzt offenbar dabei bist, den letzten Rest Deiner guten Kinderstube zu vergessen, ist das Thema für mich beendet.
mfg
Achim

HaWe
05.02.2019, 09:56
Da Du jetzt offenbar dabei bist, den letzten Rest Deiner guten Kinderstube zu vergessen, ist das Thema für mich beendet.
mfg
Achim
Der Herr seis's getrommelt und gepfiffen...! :cool:

HeSt
08.02.2019, 18:45
So, früher als gedacht wieder retour ...

Und - können wir bitte beim Thema bleiben !?!?
hier gehts um AVR und LCD und nicht ob Arduino besser oder einfacher ist!

Ich hab nicht viel an meinem Testprogrämmchen geändert.
Aber ich hab eine Lösung gefunden.
Woran es letztendlich liegt, dass eine 10-Bit Abfrage des ADCs in einer Schleife nicht normal abläuft kann ich aber auch nicht beantworten.
Mag sein, dass das Problem an der Wandlungsgeschwindigkeit liegt ... aber:
Frage an avr_racer oder an jene, die meine Frage beantworten können:
Wie schaffe ich eine Wandlungsgeschwindigkeit zwischen 50kHz - 200kHz, wenn bei einer Taktfrequenz des µC von 1MHz nur ein Teiler von 128 zur Verfügung steht?

Meine Lösung ist eine doppelte Wandlung unmittelbar hintereinander.
Allerdings nicht im 10Bit-Modus sondern erst in 8Bit dann sofort in 10Bit.
Dann passt alles.

oberallgeier
08.02.2019, 20:10
.. Woran es letztendlich liegt, dass eine 10-Bit Abfrage des ADCs in einer Schleife nicht normal abläuft kann ich aber auch nicht beantworten ..Kann es sein, dass Du die beiden 8bittigen ERgebnisregister des ADC falsch ausliest?

....
USA: ;U-Solar/Akku
ldi lcdd,lcd_lin1+$0A ;Zahlenpos Solar-U
rcall lcd_cmd4
ldi muxr,$47 ;ADC7 10bit
rcall rd_adc
in wrk1,ADCH
in wrk2,ADCL
rcall clc_va ;Values to Chars
...

Damit liest Du doch zuerst ADCH aus? Das Datenblatt verlangt aber (must - engl. = müssen - dtsch) wie wohl immer beim 10bittigen Atmel-ADC, zuerst das ADCL und erst dann das ADCH auszulesen:


...
If the result is left adjusted and no more than 8-bit precision is required, it is sufficient to read ADCH. Otherwise, ADCL must be read first, then ADCH, to ensure that the content of the Data Registers belongs to the same conversion. Once ADCL is read, ADC access to Data Registers is blocked
...

avr_racer
09.02.2019, 09:01
Auslesen wenn ADLAR = 0 = 10bit
erst ADCL dann ADCH

Auslesen wenn ADLAR = 1 = 8bit
reicht ADCH auszulesen

BITTE das DB des ATMEGA 16 durcharbeiten ab Seite 204 http://ww1.microchip.com/downloads/en/devicedoc/doc2466.pdf


Woran es letztendlich liegt, dass eine 10-Bit Abfrage des ADCs in einer Schleife nicht normal abläuft kann ich aber auch nicht beantworten.
Bitte Seite 15 nochmal in Ruhe nachvollziehen. Dein Problem ist das du zuviel in deiner Routine umherspielst anstatt den ADC nur zu
1. Initalisieren + Testkanal** + Ergebnis verwerfen
2. Wandlungskanal auswählen
3. Ergebnis des eingestellten Kanals auslesen

** Testkanal kann auch den Eingang des Wandlers gegen 0V schalten Siehe Seite 218/219 beachten!!!!!

Hier mal ganz grob


;Einsetzen wo alle anderen Inits auch ablaufen
Init:
rcall ADC_Init

; das hier kann einzelnd im Hauptprgramm aufgerufen werden oder zusätzlich in deine Unterroutinen eingestezt werden
TEST_ADC_LESEN:
rcall ADC_channel_0 ;Kanal 0 einstellen
rcall RD_ADC ;ADC-Wandlung starten + auslesen in wrk2
ret

ADC_Init:
;hier wird AD-Wandler aktiviert und die Samplefreqnz eingestellt zwischen 50 bis 250kHz
;Teiler verfügbar von 2hochX, also bei 1Mhz nur Teiler 4/8/16 möglich
;Siehe Datenblatt Seite 220 Table 85. ADC Prescaler Selections
ldi muxr,(1<<ADEN | 0<<ADPS2 | 1<<ADPS1 | 0<<ADPS0)
out ADCSRA,muxr

rcall ADC_channel_GND
rcall RD_ADC ;ADC Testweise auslesen und Ergebnis verwerfen
ret

ADC_channel_0:
;Kanal ADC0 auf PA0 setzen mit 5V als UREF
ldi muxr,(0<<REFS1 | 1<<REFS0 | 1<<ADLAR | 0<<MUX4 | 0<<MUX3 | 0<<MUX2 | 0<<MUX1 | 0<<MUX0)
out ADMUX,muxr ;ADMUX setzen
ret

ADC_channel_GND:
;Hier wird Wandlungsreferenzspannung und der Kanal gleichzeitig gesetzt
;MUXR=128 bedeutet REFS1 = 1 und REFS0 =0 ist RESERVIERT siehe SEITE 217
ldi muxr,(0<<REFS1 | 1<<REFS0 | 1<<ADLAR | 1<<MUX4 | 1<<MUX3 | 1<<MUX2 | 1<<MUX1 | 1<<MUX0)
out ADMUX,muxr ;ADMUX setzen
ret

RD_ADC: ;Liest den selektierten ADC aus, AVCC OK
sbi ADCSRA,ADSC ;ADC Start Conversion
WADC: ;Schleife bis Messung
sbic ADCSRA,ADSC ;abgeschlossen = ADSC=0
rjmp wadc
; in wrk1,ADCL ;mit auslesen wenn ADLAR = 0
in wrk2,ADCH ;ADCH auslesen reicht bei ADLAR = 1
ret

Im Anhang deine alte Datei die ich angepasst habe
33980

HeSt
09.02.2019, 11:10
Hi allerseits!

DANKE für die Aufklärung! Tatsächlichen Fehler beseitigt!
Dank eures Hinweises!

Bei meinen bisherigen Projekten hab ich immer nur mit 8Bit ADC gearbeitet.
Dadurch ist mir der Fehler mit der Reihenfolge des Auslesens passiert. :(
Obwohl ich das Datenblatt genau (dachte ich jedenfalls) gelesen hab.

ADCL und dann ADCH auslesen und alles ist ok!! :)

@avr_racer
Wir dürften offenbar verschiedene Datenblätter besitzen.
Bei meinem beschäftigen sich die Seiten 218/219 mit TAP Controller, Using the Boundary-scan Chain und Using the On-chip Debug System.
Die Prescaler-Tabelle (84) ist bei mir auf Seite 214.
Aber du hast recht. Noch ein Fehler aus der Vergangenheit.
Hab dort, wo ich mit ADC arbeite, eine Taktfrequenz von 9,6MHz.
Dem hatte ich bei meinen Änderungen im Testprogramm noch nicht Rechnung getragen.
Hat jedoch keine Auswirkung auf den tatsächlichen Fehler und funktioniert auch mit /128.
Ist jetzt aber berichtigt!

Danke nochmals an alle, die sich die Mühe gemacht und mein Progrämmchen nach meinem Fehler durchsucht haben!! Besonders an avr_racer.

avr_racer
11.02.2019, 08:35
@avr_racer
Wir dürften offenbar verschiedene Datenblätter besitzen.
Bei meinem beschäftigen sich die Seiten 218/219 mit TAP Controller, Using the Boundary-scan Chain und Using the On-chip Debug System.
Die Prescaler-Tabelle (84) ist bei mir auf Seite 214.
Aber du hast recht. Noch ein Fehler aus der Vergangenheit.
Hab dort, wo ich mit ADC arbeite, eine Taktfrequenz von 9,6MHz.
Dem hatte ich bei meinen Änderungen im Testprogramm noch nicht Rechnung getragen.
Hat jedoch keine Auswirkung auf den tatsächlichen Fehler und funktioniert auch mit /128.
Ist jetzt aber berichtigt!

Danke nochmals an alle, die sich die Mühe gemacht und mein Progrämmchen nach meinem Fehler durchsucht haben!! Besonders an avr_racer.

Deshalb der Link worauf ich mich beziehe ;). Von Zeit zu Zeit sollte man die DB aktualisieren

oberallgeier
11.02.2019, 09:39
.. Wir dürften offenbar verschiedene Datenblätter besitzen ..Nur mal so, aus Neugier, würdest Du mal bitte die Version Deines Datenblattes nennen? Steht meist am Deckblatt rechts unten, auf den sonstigen Seiten üblicherweise links unten in der Form "Rev. 2466T–AVR–07/10". Ich hatte meine (wenigen) Datenblätter für mega16 durchgeforstet gehabt und Deine Angaben nicht nachvollziehen können - was die Seitenangaben betrifft.

Wie geschrieben - es ist pure Neugier (und - ich bin ein alter Datenblatt-Sammler *gg*).

HeSt
11.02.2019, 16:17
Deine "Neugierde" kann ich gern befriedigen ;)

Mein Datenblatt zeigt folgende Bezeichnung: 2466E–AVR–10/02.

Hab es vor ein paar Jahren von "http://www.datasheetcatalog.com/" geholt.

Jetzt ganz neu von
"http://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-8154-8-bit-AVR-ATmega16A_Datasheet.pdf"
geholt.
Das aktuelle hat die Bezeichnung Atmel-8154C-8-bit-AVR-ATmega16A_Datasheet-07/2014 und sieht gewaltig anders aus!

Werd nun alle meine Datenblätter durchforsten und ggf. von den Herstellerseiten aktualisieren!
Danke an oberallgeier + avr_racer für's "mit der Nase drauf zeigen"!! ;)

oberallgeier
11.02.2019, 18:22
.. Werd nun alle meine Datenblätter durchforsten und ggf. von den Herstellerseiten aktualisieren! ..Na hoffentlich hilft das. Ich hatte nämlich ziemlich schlechte Details an den "neuesten" Datenblättern zu Atmelcontrollern gefunden -siehe hier (https://www.roboternetz.de/community/threads/71472-ATmega328-P-TC1-Control-Register-A-schlecht-dokumentiert). Ist zwar ein mega328er - aber die werten microchip-Leute scheinen xxzensiertxx zu machen.

Deine Datenblattversion 2466E von 2002 kenne/habe ich leider nicht.

Nachtrag: JETZT habe ich die 2466E von 2002. Muss man schon ne Weile suchen bei ..datasheetcatalog.. - und: es ist eine "Preliminary". Aber das nur nebenbei, Hauptsache, dass es Dir jetzt läuft.

HeSt
12.02.2019, 10:17
Hab die alte nicht verworfen! Die bleibt neben der neuen.

Derzeit schaut alles was LCD betrifft gut aus.
Die anderen Funktionen kann ich erst testen, wenn ich die Platine fertig entworfen und aufgebaut hab.
Wird noch ein bisschen dauern.
Dann wird es nochmals ein Stück Arbeit ...