2025-03-22

Liebe Leute, ich hab ne Idee sogar gleich mehrere erstens mal ich hab gestern weiter Zeichen gesendet als ich dann das ituenix.de durch dvajda.de ersetzt hatte, hat leider einen Fehler stattgefunden. Es kam nur noch komische Zeichen. Das kam mir gestern davor durchaus komische Zeichnen kam nur noch komische Zeichen. Den Fehler muss ich suchen den suche ich jetzt Dann muss ich Übung mäßig die Programme schreiben d.h. ich muss transmit und recieve schreiben, wenn die Schaltung zu Weit geht So, jetzt hab ich aber ne neue Idee. Das erste war ja klar ist ich hab gestern das mit dem BCD Dekoda gemacht Um auf der sieben Segment Anzeige Ziffern dazustehen. Dazu habe ich das bcd dekoder verwendet. Mit gutem Grund, weil ich übe das anzubringen. Es gibt aber eine andere Möglichkeit natürlich erstens mal hat der atmega8 Porta portb Portc portd Und wenn ich an einer 7 Segmentanzeige die Ziffern von null bis A in Hexadezimal darstellen, d.h. 16 Ziffern und Hexadezimal kann ich darstellen, dann kann ich 8 acht eine Hexadezimalzahl, wenn eben nicht gleichzeitig noch das rs232 acht verschiedene Hexadezimal Ziffern auf einmal darstellen, wenn ich das benutze. Nur sieben oder weniger, aber trotzdem noch ne ganze Menge. Das lohnt sich auch deswegen, weil ich ja das Pascal Dreieck gemacht habe das kann ich benutzen einerseits, um des c Programm zu nehmen, was richtig ist Was ich neulich hatte und ich hab's ja in den Controller gemacht, um die Ziffern richtig dazustehen im Controller sind das konnte ich leider nicht sehen weil ich kann an den LED nicht sehen, welche Ziffer da kommt. Anders ist es wenn ich sozusagen die sieben Segment Anzeigen nehmen. In dem Fall würden zwei oder drei genügen Ich kann auch die die Zahlenwerte von 0-255 im ascii Code darstellen. Hexadezimal Zwei insofern kann ich den gesamten, die zwei Insofern kann ich den gesamten ascii Code darstellen. Der Unterschied besteht darin, dass ich die BCD Anzeige lässt. Erstens mal gewisse Ziffern nicht zun, nämlich von A bis F aber nicht nur das, sondern ich kann die Dekodierung gleich über den atmega8 selber vornehmen Das ist logisch, weil es sind ja einzelne Segmente beziehungsweise LEDs sind es auch an der Anzeige und es kann auch der Controller selber machen Ich habe das dekoder nur genommen, um diese speziell zu üben macht das der Controller kann ich anders benutzen, dann muss sie Dekodierung im Controller selber stattfinden. D.h. ich muss ihn Zusatzprogramm schreiben. Insgesamt ist das damit auch Zeichen geht mit Buchstaben darstellen kann sind zunächst mal A bis F Damit kann ich zum Beispiel wenn man ein Wort findet, was aus Buchstaben drei Zeichnung Buchstaben von A bis F besteht kann man das benutzen man kann aber sogar noch weitergehen. Es gibt gewisse Buchstaben, die später kommen, die man trotzdem darstellen kann Dazu gehört das L aber auch das. Wo kann man das O diesem Fall als Buchstaben deuten statt als Null? Oder man kann S darstellen. Oder G Erfinden sich noch ein ganz paar, habe aber noch ein Trick gefunden Es gibt außer sieben Segment Anzeigen gibt es Anzeigen die schräge Elemente in der Anzeige haben. Der Unterschied besteht darin, dass ich darauf, dass ich danach bei reichelt.de bisher nicht gesucht habe also das sind sieben Segment Anzeigen aber die haben ja sozusagen nur die geraden Elemente und es gibt ja schräge Elemente, wenn man an denen an das Zeichen M denkt oder K Diese lassen sich bequem darstellen, mit den Anzeigen mit den schrägen drin und danach kann ich mal bei reichelt.de suchen Damit lassen sich unter Umständen sogar relativ lange Zeichenketten darstellen und es geht so nicht, indem man vor jedes Segmentanzeige ein Register schaltet Sondern eine Adresskodierer. Nicht etwa, indem man jedes einzelne Segment sozusagen mit einem und steuert, sondern indem man die kothode bzw Anode an und ausschaltet und sie wissen, der Controller ist sehr schnell Und das Auge braucht 25 Bilder pro Sekunde. Um einen Film zu erkennen man mindestens und das kann der Controller, die gemultiplexed machen damit kann man dann doch ganze Zeichenketten dastehen, die relativ lang sind. Jetzt gehe ich erst mal rauchen, dann mache ich das Programm von gestern weiter mit der seriellen Schnittstelle

Also sie sehen selber die Zeichen sind sehr seltsam. Wohl beide da ist durchaus was normales erkennbar zum Beispiel www Und da Der Fehler jetzt liegt und wo ist es unsauber ist es muss sich jetzt suchen jetzt muss ich erst mal gucken ich glaube 25 in UBRR entspricht der Baud rate 2400

Image Screenshot_20250322_051949

Image Screenshot_20250322_051957

Image Screenshot_20250322_052016

https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-2486-8-bit-AVR-microcontroller-ATmega8_L_datasheet.pdf

Ja, hier steht es auf Seite 153 bei 1 MHz CPU Takt entspricht der Wert 25 in UBRR dieser baud rate 2400

Ich muss gucken, wo der Fehler genau liegt

Image Screenshot_20250322_052451

Man hier sieht ist das Ergebnis schon eindeutig besser und zwar nachdem ich an einem der Pins manipuliert habe oder Leitung und wie auch immer. Ich sag jetzt mal Leitung Kabel oh ich vermute deswegen dass da ein Kabel nicht richtig drin steckt.

Image Screenshot_20250322_052902

Image Screenshot_20250322_052912

Image Screenshot_20250322_053018

Nachdem ich das hier gesehen habe und ich eindeutig an dem Kabel vom Controller zum max232 herum manipuliert haben, also vom Transmit Kabel vermute ich liegt genau hier irgendwo der Fehler

Image Screenshot_20250322_053038

gucken sie mal

Image Screenshot_20250322_053045

Jetzt schauen in dem Programm Quelltext, ob ich zufälligerweise d mit e verwechselt habe

Image Screenshot_20250322_053312

Image Screenshot_20250322_053430

Image Screenshot_20250322_053512

Image Screenshot_20250322_053622

Image Screenshot_20250322_053710

;; Und die Antwort lautet ja also neue "Ubersetzen
;; (C) David Vajda
;; 2024-12-12
;; RS232 Transmit
.include "m8def.inc"
ldi r16, HIGH (RAMEND)
out SPH, r16
ldi r16, LOW (RAMEND)
out SPL, r16
ldi r16, HIGH (25)
out UBRRH, r16
ldi r16, LOW (25)
out UBRRL, r16
;; Rechnung - teiler 16 - CPU-clock (16 * Baudrate) -1
ldi r16, (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0)
out UCSRC, r16
ldi r16, (1 << TXEN)
out UCSRB, r16
loop1:
ldi r16, 'd'
rcall rs232transmit
ldi r16, 'a'
rcall rs232transmit
ldi r16, 'v'
rcall rs232transmit
ldi r16, 'i'
rcall rs232transmit
ldi r16, 'd'
rcall rs232transmit
ldi r16, '@'
rcall rs232transmit
ldi r16, 'w'
rcall rs232transmit
ldi r16, 'w'
rcall rs232transmit
ldi r16, 'w'
rcall rs232transmit
ldi r16, '.'
rcall rs232transmit
ldi r16, 'e'
rcall rs232transmit
ldi r16, 'v'
rcall rs232transmit
ldi r16, 'a'
rcall rs232transmit
ldi r16, 'j'
rcall rs232transmit
ldi r16, 'd'
rcall rs232transmit
ldi r16, 'a'
rcall rs232transmit
ldi r16, '.'
rcall rs232transmit
ldi r16, 'd'
rcall rs232transmit
ldi r16, 'e'
rcall rs232transmit
ldi r16, 10
rcall rs232transmit
ldi r16, 13
rcall rs232transmit
rjmp loop1
rs232transmit:
sbis UCSRA, UDRE
rjmp rs232transmit
out UDR, r16
ret

Image Screenshot_20250322_053843

Image Screenshot_20250322_053919

na also

Image Screenshot_20250322_054034

Image Screenshot_20250322_054045

jetzt raucherpause, ich versuche es etwas besser ein zu stellen, wenn ich das habe - schreibe ich aus dem kopf wieder zwei AVR programme als Übung Einerseits Transmit andererseits Receive Und der Witz bei der Sache ist ich kenne die flags. Ich hab bisher auf UCSZ1 und 0 angespielt keine Sorge, ich habe die Programme immer auswendig geschrieben. Allerdings hab ich mich ja noch nicht so lange der seriellen Schnittstelle zu gewendet, auch wenn ich schon oft diese Übungsprogramm geschrieben habe. Sie sehen es auf meiner Homepage. Also circa 20 mal aus dem Kopf trotzdem ist es noch relativ neu das Thema. Ich hab sie oft geschrieben und jedes Mal auswendig aber es ist relativ neu aber es gibt noch die Bits des Disput sich auch das hab ich reingeschrieben TXEN das ist klar genauso wie RXEN Brauchen Sie und das ist in UCSRB Während die andern ihn UCSRC sind, und sie müssen aber noch in UCSRC URSEL Reinschreiben, also diese 3 Bit bzw Flags UCSRC URSEL UCSZ1 u 0 Okay, sonst ist die Sache relativ einfach in UBRR noch den Wert 25

Image Screenshot_20250322_062004

Image Screenshot_20250322_062014

https://kryptografie.de/kryptografie/chiffre/14-segment.htm ... 14 segment anzeige.

#3415#>https://www.google.com/url?sa=t&source=web&rct=j&opi=89978449&url=https://www.reddit.com/r/arduino/comments/1fb4to5/all_26_letters_az_on_7segment_display/

...

also, ich kaufe gleich mal welche

https://www.reichelt.de/de/de/shop/produkt/alphanum_display_rot_20_3mm_gem_anode-31580?PROVID=2788&gad_source=1&gclid=CjwKCAjwnPS-BhBxEiwAZjMF0l24e_kE-TvmdW4DqT1XQFJKUctIDq-JuaNOQPbI-RoxiQOJkEp_IxoCQ3IQAvD_BwE

...

ich schreibe jetzt die programme fuer den atmega8 - rs232 transmit und recieve

Image Screenshot_20250322_062020

Image Screenshot_20250322_062215

Image Screenshot_20250322_062429

;; (C) David Vajda
;; 2025-03-22
;; rs-232-transmit
.include "m8def.inc"
;; Stack
ldi r16, HIGH (RAMEND)
out SPH, r16
ldi r16, LOW (RAMEND)
out SPL, r16
;; UBRR - Baud Rate - 2400
;; Atmega8 - 1MHz - CPU Freq
;; Value: 25
ldi r16, HIGH (25)
out UBRRH, r16
ldi r16, LOW (25)
out UBRRL, r16
;; Bits - UCSRC
;; UCSRC - USART Controll and Status Register
;; URSEL UCSZ1 UCSZ0
ldi r16, (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0)
out UCSRC, r16
;; Bits - UCSRB
;; RS232 - Transmit
;; TXEN
ldi r16, (1 << TXEN)
out UCSRB, r16
;; RS-232 - Transmit - routine
ldi YH, HIGH (str20250322)
ldi YL, LOW (str20250322)
;; repeat giving out string
loop1:
rcall rs232transmitstr
ldi YH, HIGH (str20250322)
ldi YL, LOW (str20250322)
rjmp loop1
;; giving out a string
rs232transmitstr:
ld r16, Y+
breq rs232transmitstrend
rcall rs232transmitch
rjmp rs232transmitstr
rs232transmitstrend:
ret
rs232transmitch:
;; die stelle kenne ich nicht auswendig, nur so weit, kommentar
;;sbis UDRE ...
;;rjmp rs232transmitch
;; und so geht es richtig
sbis UCSRA, UDRE
rjmp rs232transmitch
out UDR, r16
;; ich kenne den befehl sbis eigentlich nicht
;; das ist mein problem
;; out UDR, r16 ist logisch
;; UDRE in UCSRA auch, UDRE = USART Data Register Empty
;; aber ueber sbis habe ich bisher eigentlich nur hinweggelesen
;; habe vorstellung, solang gesetzt, naechster befehl
;; trotzdem nicht 100%
ret
;; the string
str20250322: .db "david@dvajda.de sagt hallo schoenen tag am 2025-03.25", 0
;; jetzt fertig - 20250322 - 06:19

Image Screenshot_20250322_062539

bisher nur scenseless chars ich muss den fehler finden, es geht sauberer, es liegt am eigenen max232 und verbindungen, auf dem stk500 immer gut, hier wenn daran machen, oft gut.

Image Screenshot_20250322_062215

Image Screenshot_20250322_062429

altes programm besser, noch mal pruefen.

altes programm auf anhieb, neues programm pruefen.

Image Screenshot_20250322_063337

also die uebertragung geht jetzt tatsaechlich besser und es ist ein programmierfehler drin Erstens Mal bei jedem Versuch ohne zurücksetzen funktioniert es auf Anhieb zweitens ich hab mal das Programm verändert. Ich habe an der entscheidenden Stelle nur ein den Buchstaben D übertragen und es hat prima funktioniert. D.h. an der Stelle wo die Verzweigung ist mit dem Test auf Null da stimmt etwas nicht. Ich zeige den Quelltext im nächsten Beitrag.

Image Screenshot_20250322_063429

;; (C) David Vajda
;; 2025-03-22
;; rs-232-transmit
.include "m8def.inc"
;; Stack
ldi r16, HIGH (RAMEND)
out SPH, r16
ldi r16, LOW (RAMEND)
out SPL, r16
;; UBRR - Baud Rate - 2400
;; Atmega8 - 1MHz - CPU Freq
;; Value: 25
ldi r16, HIGH (25)
out UBRRH, r16
ldi r16, LOW (25)
out UBRRL, r16
;; Bits - UCSRC
;; UCSRC - USART Controll and Status Register
;; URSEL UCSZ1 UCSZ0
ldi r16, (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0)
out UCSRC, r16
;; Bits - UCSRB
;; RS232 - Transmit
;; TXEN
ldi r16, (1 << TXEN)
out UCSRB, r16
;; RS-232 - Transmit - routine
ldi YH, HIGH (str20250322)
ldi YL, LOW (str20250322)
;; repeat giving out string
loop1:
rcall rs232transmitstr
ldi YH, HIGH (str20250322)
ldi YL, LOW (str20250322)
rjmp loop1
;; giving out a string
rs232transmitstr:
ldi r16, 'd'
;;ld r16, Y+
;;breq rs232transmitstrend
rcall rs232transmitch
rjmp rs232transmitstr
rs232transmitstrend:
ret
rs232transmitch:
;; die stelle kenne ich nicht auswendig, nur so weit, kommentar
;;sbis UDRE ...
;;rjmp rs232transmitch
;; und so geht es richtig
sbis UCSRA, UDRE
rjmp rs232transmitch
out UDR, r16
;; ich kenne den befehl sbis eigentlich nicht
;; das ist mein problem
;; out UDR, r16 ist logisch
;; UDRE in UCSRA auch, UDRE = USART Data Register Empty
;; aber ueber sbis habe ich bisher eigentlich nur hinweggelesen
;; habe vorstellung, solang gesetzt, naechster befehl
;; trotzdem nicht 100%
ret
;; the string
str20250322: .db "david@dvajda.de sagt hallo schoenen tag am 2025-03.25", 0
;; jetzt fertig - 20250322 - 06:19

Image Screenshot_20250322_063759

Image Screenshot_20250322_065151

https://www.mikrocontroller.net/articles/AVR-Tutorial:_Speicher

loop:
    ldi     ZL, LOW(text*2)             ; Adresse des Strings in den
    ldi     ZH, HIGH(text*2)            ; Z-Pointer laden
    rcall   print                       ; Funktion print a

Offensichtlich habe ich einen Fehler gemacht der scheint mir aber nicht logisch. Ich bin schon vor 10 Minuten drauf gekommen nachdem ich geguckt hab. Keine Sorge, ich bin gleich dahinter gekommen. Ich hab's noch nicht geglaubt und deswegen diesen Post wieder zurückgezogen, weil ich schon vor 10 Minuten drauf gekommen bin aber ich glaube das nicht. Es ist scheinbar doch so. Ich habe das Buch von Manfred schwabl schmidt leider mit an die Straße gestellt und es war sehr gut. Ich muss es neu kaufen das sind sehr gutes Buch nur

So wie es aussieht, muss ich im dseg zwar den XYZ Pointer mit der Adresse laden, wo die Zeichenkette ist allerdings im CSEG muss ich sie mit zweimal der Adresse laden der steht so auch im Datenblatt des atmega8

Und deswegen will ich das mal glauben deswegen hab ich den Post dann doch gemacht obwohl ich ihn erst zurückgezogen habe. Also ist ganz klar

Es gibt es cseg da ist unsere normale Code ist es quasi fest, aber es ist eben ein Flash eeprom Hier ist unser Code und am Ende kann man das einfügen. Logisch, das wird nicht ausgeführt, weil wir haben ja am Ende die Sprungmarke zur Wiederholung der letzten Routine. Dann gibt es das dseg Logisch ist der flüchtige Code, das ist unser sram Unternehmen gibt es noch das

Eeprom eseg mit Daten, die quasi fest sind, aber anders als im Code stehen gut, dann ist es wohl so da muss ich *2 machen

Image Screenshot_20250322_070711

Offensichtlich habe ich einen Fehler gemacht der scheint mir aber nicht logisch. Ich bin schon vor 10 Minuten drauf gekommen nachdem ich geguckt hab. Keine Sorge, ich bin gleich dahinter gekommen. Ich hab's noch nicht geglaubt und deswegen diesen Post wieder zurückgezogen, weil ich schon vor 10 Minuten drauf gekommen bin aber ich glaube das nicht. Es ist scheinbar doch so. Ich habe das Buch von Manfred schwabl schmidt leider mit an die Straße gestellt und es war sehr gut. Ich muss es neu kaufen das sind sehr gutes Buch nur So wie es aussieht, muss ich im dseg zwar den XYZ Pointer mit der Adresse laden, wo die Zeichenkette ist allerdings im CSEG muss ich sie mit zweimal der Adresse laden der steht so auch im Datenblatt des atmega8 Und deswegen will ich das mal glauben deswegen hab ich den Post dann doch gemacht obwohl ich ihn erst zurückgezogen habe. Also ist ganz klar Es gibt es cseg da ist unsere normale Code ist es quasi fest, aber es ist eben ein Flash eeprom Hier ist unser Code und am Ende kann man das einfügen. Logisch, das wird nicht ausgeführt, weil wir haben ja am Ende die Sprungmarke zur Wiederholung der letzten Routine. Dann gibt es das dseg Logisch ist der flüchtige Code, das ist unser sram Unternehmen gibt es noch das Eeprom eseg mit Daten, die quasi fest sind, aber anders als im Code stehen gut, dann ist es wohl so da muss ich *2 machen

Image Screenshot_20250322_071904

Image Screenshot_20250322_072211

erst mal habe ich jetzt den mantel des kabels sub d 9 - rs232 geerdet, es scheint gefuehlt bessere ergebnisse zu liefern.

Image Screenshot_20250322_073502

Image Screenshot_20250322_074302

das ergibt nebenbei einen sinn mit den 16 bit (2 byte) addressierbarkeit im code segment, weil ein befehl ist keine 8 bit gross mindestens 16 bit. ok, aber dann habe ich einen fehler auf mikrocontroller.net gefunden

adiw    ZL, 1
im datasheet steht
adiw ZH:ZL, 2
das ergibt dann sinn. stellt sich die frage, was der unsinn soll. wenn ich adiw 2 mache, kann ich ja genauso gut, die 1 byte grenze treffen, somit mir das *2 ersparen, weil ich immer 16 bit addressiere, aber mit normalen addressen ich halte das ganze fuer unsinn weil sonst muesste ich genauso schreiben
rjmp LABEL1*2
das ist ja totaler bloedsinn nebenbei - ich habe es so gemacht, das ergebnis war, dass in der konsole gar nichts mehr kam, ich kann mir vorstellen, dass es ausserhalb des bereichs geht. aber gut, wenn es so ist, ist es so, dann kann ich mich dagegen auflehnen und es ist trotzdem so. ich kann mich entscheiden und das ist immer meine maxime, wenn ich etwas lerne, es ist nicht so, und es ist doch so, was hilft es sich dagegen auf zu lehnen, wenn es in dem falle so ist. ich sage in dem falle, bei einem atmega8, wo es nun mal so ist.

Image Screenshot_20250322_074308

Image Screenshot_20250322_074329

Image Screenshot_20250322_074434

nachdem ich die kabel ausgetauscht habe und indem ich den reset knopf druecke scheint es jetzt jedes mal sauber zu gehen

Image Screenshot_20250322_075359

manchmal ohne reset

;; so geht es jedenfalls a uebertragen, stabilisieren, es wird uebtragen. ich muss etwas am string aendern.

;; (C) David Vajda
;; 2025-03-22
;; rs-232-transmit

.include "m8def.inc"

;; Stack
ldi r16, HIGH (RAMEND)
out SPH, r16
ldi r16, LOW (RAMEND)
out SPL, r16

;; UBRR - Baud Rate - 2400
;; Atmega8 - 1MHz - CPU Freq
;; Value: 25

ldi r16, HIGH (25)
out UBRRH, r16
ldi r16, LOW (25)
out UBRRL, r16

;; Bits - UCSRC
;; UCSRC - USART Controll and Status Register
;; URSEL UCSZ1 UCSZ0

ldi r16, (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0)
out UCSRC, r16

;; Bits - UCSRB
;; RS232 - Transmit
;; TXEN

ldi r16, (1 << TXEN)
out UCSRB, r16

;; RS-232 - Transmit - routine

ldi ZH, HIGH (str20250322x)
ldi ZL, LOW (str20250322x)

;; repeat giving out string
loop1:
rcall rs232transmitstr
ldi YH, HIGH (str20250322x)
ldi YL, LOW (str20250322x)
rjmp loop1

;; giving out a string
rs232transmitstr:
ld r16, Y+
breq rs232transmitstrend
ldi r16, 'a'
rcall rs232transmitch
rjmp rs232transmitstr
rs232transmitstrend:
ret

rs232transmitch:
;; die stelle kenne ich nicht auswendig, nur so weit, kommentar
;;sbis UDRE ...
;;rjmp rs232transmitch
;; und so geht es richtig
sbis UCSRA, UDRE
rjmp rs232transmitch
out UDR, r16
;; ich kenne den befehl sbis eigentlich nicht
;; das ist mein problem
;; out UDR, r16 ist logisch
;; UDRE in UCSRA auch, UDRE = USART Data Register Empty
;; aber ueber sbis habe ich bisher eigentlich nur hinweggelesen
;; habe vorstellung, solang gesetzt, naechster befehl
;; trotzdem nicht 100%
ret

;; the string
str20250322: .db "david@dvajda.de sagt hallo schoenen tag am 2025-03.25", 0

;; jetzt fertig - 20250322 - 06:19

.equ str20250322x = str20250322

Image Screenshot_20250322_081901

ehrlich gesagt, ich weiss jetzt wo der fehler lag, es klingt absurd das 'd' hier ist richtig uebertragen zunaechst bei einer lade und speicherarchitektur gibt es die befehle 1.) load 2.) store 3.) move 4.) load immidiate laden, speichern. auf dem atmega8 und damit kenne ich mich gut aus, gibt es

ld
ldd
ldi
st
std
was heisst das? zunaechst gibt es die pointer register
X, Y, Z
wer computersysteme 1 und 2 belegt hat, weiss es gibt auto postinkrement auto predecrement und indiziert also mit verschiebung bei x86 alles anders. 1.) direktwert 2.) register-register 3.) direkt 4.) indirekt 5.) indiziert direkt heisst, addresse absolut indirekt in register mov dx, offset LABEL1 mov ax, [dx] und indiziert mit addition zweites register und verschiebung.. bei jeder anderen klassischen lade und speicherarchitektur anders predekrement, postinkrement, auto dann verschiebewert gut, so bei atmega8
ld r16, Y
ld r16, -Y
ldi r16, Y+
das ganze mit X und Z ebenso bei st - store aber, wozu ist ldd? zufaelligerweise passt
Y+6
nicht in das schema, hier brauche ich
ldd r16, Y+15
oder so. aber.
X, Y, Z
setzen sich wie der Stackpointer SPH, SPL
aus einem HIGH und LOW Teil zusammen
YH, YL und sind in wirklichkeit Register:
\begin{verbatim}
Z: r31, r30
Y: r29, r28
X: r27, r26
jetzt gibt es ein problem. so weit konnte ich es verwenden. immer gut. es gibt aber die befehle
lds
ld, ldi, ldd, lds
st, std, sts?
daneben lpm ld und ldd laden ueberhaupt den Y Pointer das funktioniert lds vom SRAM logisch ist das nicht weil, ich habe jetzt lpm verwendet logisch ist das zunaechst nicht ich kann ld und ldd auf alle X, Y, Z pointer anwenden trotzdem: der unterschied ist, ich habe genug programme geschrieben, im dseg tut es, nur scheinbar ist das cseg eben anders. ich brauche lpm warum steht da d erwiesenermassen das erste zeichen im string nur - eines weiss ich nicht mit lpm zu inkrementieren gucken im Datenblatt.

Image Screenshot_20250322_083310

ja, siehe da es funktioniert, das ist jetzt eindeutig.

Image Screenshot_20250322_083540

;; (C) David Vajda
;; 2025-03-22
;; rs-232-transmit

.include "m8def.inc"

;; Stack
ldi r16, HIGH (RAMEND)
out SPH, r16
ldi r16, LOW (RAMEND)
out SPL, r16

;; UBRR - Baud Rate - 2400
;; Atmega8 - 1MHz - CPU Freq
;; Value: 25

ldi r16, HIGH (25)
out UBRRH, r16
ldi r16, LOW (25)
out UBRRL, r16

;; Bits - UCSRC
;; UCSRC - USART Controll and Status Register
;; URSEL UCSZ1 UCSZ0

ldi r16, (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0)
out UCSRC, r16

;; Bits - UCSRB
;; RS232 - Transmit
;; TXEN

ldi r16, (1 << TXEN)
out UCSRB, r16

;; RS-232 - Transmit - routine

ldi ZH, HIGH (str20250322x)
ldi ZL, LOW (str20250322x)

;; repeat giving out string
loop1:
rcall rs232transmitstr
ldi ZH, HIGH (str20250322x)
ldi ZL, LOW (str20250322x)
rjmp loop1

;; giving out a string
rs232transmitstr:
lpm r16, Z+
cpi r16, 0x00
breq rs232transmitstrend
rcall rs232transmitch
rjmp rs232transmitstr
rs232transmitstrend:
ret

rs232transmitch:
;; die stelle kenne ich nicht auswendig, nur so weit, kommentar
;;sbis UDRE ...
;;rjmp rs232transmitch
;; und so geht es richtig
sbis UCSRA, UDRE
rjmp rs232transmitch
out UDR, r16
;; ich kenne den befehl sbis eigentlich nicht
;; das ist mein problem
;; out UDR, r16 ist logisch
;; UDRE in UCSRA auch, UDRE = USART Data Register Empty
;; aber ueber sbis habe ich bisher eigentlich nur hinweggelesen
;; habe vorstellung, solang gesetzt, naechster befehl
;; trotzdem nicht 100%
ret

;; the string
str20250322: .db "david@dvajda.de sagt hallo schoenen tag am 2025-03.25", 10, 13, 0

;; jetzt fertig - 20250322 - 06:19

.equ str20250322x = str20250322*2


root@work:/home/david# stty -F /dev/ttyS3 2400 cs8 raw && cat /dev/ttyS3
H�,��˫�
       ����������յ�͹��)5��٥��م�������ͅ�с������͍�������х��������յ�͹��)5��٥��م�������ͅ�с������͍�������х��������յ�͹��)5��٥��م�������ͅ�с������͍�������х��������յ�͹��)5��٥��م�������ͅ�с������͍�������х��������յ�͹��)5��٥��م�������ͅ�с������͍�������х��������յ�͹��)5��٥��م�������ͅ�с������͍�������х��������յ�͹��)5��٥��م�������ͅ�с������͍�������х��������յ�͹��)5��٥��م�������ͅ�с������͍�������х��������յ�͹��)5��٥��م�������ͅ�с������͍�������х��������յ�͹��)5��٥��م�������ͅ�с������͍�������х��������յ�͹��)5��٥��م�������ͅ�с������͍�������х��������յ�͹��)5��٥��م�������ͅ�с������͍�������х����david@dvajda.de sagt hallo schoenen tag am 2025-03.25
david@dvajda.de sagt hallo schoenen tag am 2025-03.25
david@dvajda.de sagt hallo schoenen tag am 2025-03.25
david@dvajda.de sagt hallo schoenen tag am 2025-03.25
david@dvajda.de sagt hallo schoenen tag am 2025-03.25
david@dvajda.de sagt hallo schoenen tag am 2025-03.25
david@dvajda.de sagt hallo schoenen tag am 2025-03.25
david@dvajda.de sagt hallo schoenen tag am 2025-03.25
david@dvajda.de sagt hallo schoenen tag am 2025-03.25
david@dvajda.de sagt hallo schoenen tag am 2025-03.25
david@dvajda.de sagt hallo schoenen tag am 2025-03.25
david@dvajda.de sagt hallo schoenen tag am 2025-03.25
david@dvajda.de sagt hallo schoenen tag am 2025-^C
root@work:/home/david#

d@dvajda.de sagt hallo schoenen tag am 2025-03.25
david@dvajda.de sagt hallo schoenen tag am 2025-03.25
david@dvajda.de sagt hallo schoenen tag am 2025-03.25
david@dvajda.de sagt hallo schoenen tag am 2025-03.25
david@dvajda.de sagt hallo schoenen tag am 2025-03.25
david@dvajda.de sagt hallo schoenen tag am 2025-03.25
david@dvajda.de sagt hallo schoenen tag am 2025-03.25
david@dvajda.de sagt hallo schoenen tag am 2025-03.25
david@dvajda.de sagt hallo schoenen tag am 2025-03.25
david@dvajda.de sagt hallo schoenen tag am 2025-03.25
david@dvajda.de sagt hallo schoenen tag am 2025-03.25
david@dvajda.de sagt hallo schoenen tag am 2025-03.25
david@dvajda.de sagt hallo schoenen tag am 2025-^C
root@work:/home/david#

und die leitung ist gut, es tut auf anhieb.

bevor ich jetzt so weit gehe, nehme ich das siebensegment, nicht gemuxt, ein einzelnes, wie beim letzten, das Dekoder quasi durch das programm im ATmega8

jetzt probiere ich die siebensegmentanzeige zunaechst ohne multiplexing. ich habe 2 weitere. und ein steckboard ich werde zwei freie ports am atmega8 verwenden

ich benutze eine tabelle, zunaechst stelle ich die hex ziffern von 0-9,A-F dar.

ich benutze eine tabelle. Die Hex Ziffer wird als index in der tabelle verwendet und in der tabelle sind jeweils die segmente der Anzeige aktiviert

im zweiten schritt benutze ich multiplexing bei der anzeige. ich habe es vorher falsch gesagt, ich brauche nicht 4 bit pro sieben segment anzeige, sondern 8

fuer eine einzige anzeige brauche ich mindestens 7 bit

bei 5 anzeigen braeuchte ich so gesehen 5 ports

folgende methode funktioniert. wenn ich einen tristate nehme. oder ich wage sie etwas anders zu behandeln

zunaechst keine panik. die segmente in einer siebensegmentanzeige sind led's

problem. den vorwiderstand vor ein segment, mache ich natuerlich nicht unbedingt vor jeden pin des segments, sondern an K/A ausgang. so gesehen kann ich das Segment abschalten, indem ich es hier abtrenne

jetzt braeuchte ich einen tristate

tristate: 0, 1, hochohmig

0 ist nicht hochohmig. hochohmig heisst, es ist keine verbindung da, kabel durchgetrennt

wenn ich multiplexing mache, dann koennte ich 7 bit verwenden, fuer jedes segment

umgekehrt, liegt an einer LED an beiden Seiten

GND, GND, bzw 0 0 an, ist das kein problem. sonst koennte man sie nicht abschalten

das einzige problem: VCC, VCC, an beiden Seiten sollte einer LED nicht schaden

habe ich eine Diode und geht der Strom in die falsche richtigung, das ist die funktionweise einer klassischen diode ist sie nicht in durchlassrichtung gepolt, also fliesst keiner. sonst diode unnoetig

problem: ich weiss nicht, wie das bei einer led ist, diese ist eine diode, durchgangstester

aber, zum beispiel: ein LCD mit Controller HD44780 darf an A und K nicht falsch herum gepolt werden, GND muss an VSS und VDD an VCC, das darf man nicht falsch machen, sonst kaputt

sieben segment?

andere frage, was passiert, wenn an eine LED an beiden Seiten VCC, VCC-VCC und nicht etwa GND-VCC, GND-GND?

ich denke, dass nichts passiert und trotzdem bin ich nicht sicher, die siebensegment anzeige koennte leiden

multiplexing geht nur unter der voraussetzung und noch einer

entweder - ich nehme ein tristate oder ich erzeuge auf beiden seiten vcc

zunaechst: zwei Anzeigen

der Mensch sieht 25 Bilder pro Sekunde als film

also: der wechsel muss sich 25 mal in der Sekunde vollziehen. Bei zwei Anzeigen: 50 mal

bei 5 Anzeigen, 125 mal

da der Atmega8 1 MHz hat, sagen wir 100 mal, sind 10.000 lange wird ein segment beleuchtet, als mal, heisst, takte

10.000 takte, wiederholung auf das selbe segment, dann wechel.

da der code dafuer gut und gerne 50 takte oder 20 oder 100 ist, gehen wir davon aus, dieser abschnitt wird 100x wiederholt

problem:

ich hatte ja eine siebensegment anzeige von der ich ausging, die ging so. ich habe sie angemacht, und dann waren die zeichen invertiert, die segmente. ich musste glaube ich vcc an a/k dran machen

kein spass, deswegen habe ich inverter genommen. das ist kein spass. ich musste es invertiert drauf tun

und das habe ich jetzt gemacht, jetzt anders

so weit ich weiss, war aber a/k damals VCC

allerdings bringt mich das auf eine idee

zunaechst. ich habe -

warum ich von a/k rede, das ist egal

manchmal a... manchmal k

keine sorge: k elektrotechnisch minus, kathode - die elektronen in der roehre gehen raus, das ist zwar + aber negativ

anode ist +

egal, nur: ich sage gleich, warum a/k

sie haben recht, es gibt pnp und npn, aber nicht bei diode weil pn

trotzdem habe ich recht. und deswegen bevor sie argumentieren schauen sie ins datasheet. das ist vielleicht ihr problem, hingucken

also: warum eine siebensegment anzeige gut ist, wenn sie invertiert ist

zunaechst, die zeichen die sie am atmega8 raus senden, sind dann invertiert. wenn sie dekoder nehmen, muessen sie sie invertieren, also inverter 2x7404 ...

und bcd dekoder

aber die a/k ist jetzt VCC

das ist praktisch. sie muessen die tabelle am atmega8 jetzt umgekehrt raus geben. das multiplexing tut

weil ueber 5 V VCC anschalten, an A/K und der rest invertiert signal

multiplexing jetzt aber ueber die 5 V.

dann meinen sie geht sonst auch? umgekehrt MUX? ja, aber dann habe ich VCC-VCC, so VCC-GND, GND-GND, das ist OK

bei 5 Anzeigen, 5 Bit - 7+5 Bit= 2 Port

jetzt faellt mir aber was auf. nachdem das nicht invertiert war, schaue ich ins Datasheet. da steht nicht A oder K sondern A/K

ich kaufte inverter, wie gedacht. ich kann mir vorstellen, dass ich die siebensegmente in beide richtungen nutzen kann

zum beispiel in dem ich an K negativ mache, GND

K ist immer negativ A positiv uebrigens das ist richtig.

auch wenn von K elektronen raus

gut, aber: wenn das ginge, ich probiere es aus.

also, ich habe schon mal heraus gefunden, die sieben segment anzeige laesst sich nicht in beide richtungen verwenden, die rede ist von A/K gemeint sind damit wohl Siebensegmentanzeigen, die entweder A oder K haben und das Datasheet bezieht sich auf beide. Gut ist, dass A/K in diesem Falle an VCC also 5 V muss, nicht an GND, damit passt die Sache. und jetzt kann ich mir erklaeren, warum der inverter nicht notwendig war. ein altes Thema bei den Ports des Atmega8 meine led haben richtig gezaehlt? dafuer gibt es einen einfachen grund -

man tut jedes mal bevor man eine zahl auf dem port ausgibt

com r16
out PORTB, r16
com r16

schreiben. das hatte ich bei dem zaehler nicht bedacht. ich habe nicht darueber nachgedacht. dass der zaehler das macht, trotzdem kam es richtig raus

warum? eben weil sich das problem erledigt hat

A/K ist VCC = 5V.

und das ist auch hier so. damit kann ich bequem multiplexen

warum kommt es dann richtig raus, bei der schaltung mit sieben segment, ohne - inverter

ganz einfach, wenn ich den zaehler neu schreibe, ohne com also alle bits invertieren, kommt es so, dass ich den hex Inverter 7404 brauche

blos habe ich das alte zaehlprogramm genommen, fuer die siebensegmentanzeige, da steht com drin

und der witz ist naemlich, dass ohne der Atmega8

an den Ports PORTA, PORTB, PORTC, ...

0 fuer 1 ausgibt und 1 fuer 0

nicht intern, beim programmieren, alles richtig rum, aber aussen

;; (C) David Vajda
;; 2025-03-22
;; siebensegment 1fach klassisch
.include "m8def.inc"

ldi r16, HIGH (RAMEND)
out SPH, r16
ldi r16, LOW (RAMEND)
out SPL, r16

ldi r16, 0xff
out DDRC, r16

main:
ldi ZH, HIGH (telefonstrB)
ldi ZL, LOW (telefonstrB)
rcall telefonout
rjmp main

telefonout:
lpm r16, Z+
cpi r16, 0x00
breq telefonoutend
rcall bcddecode
out PORTC, r15
rcall sleep
rjmp telefonout
telefonoutend:
ret

bcddecode:
push r16
push ZH
push ZL
mov r18, r16
ldi ZH, HIGH (seg7B)
ldi ZL, LOW (seg7B)
;; das stimmte natuerlich nicht mit dem adiw - das ist konstante laut i
bcddecodeloop1:
lpm r15, Z+
dec r16
brne bcddecodeloop1
pop ZL
pop ZH
pop r16
ret

sleep:
push r16
push r17
ldi r16, 0xff
sleeploop1:
ldi r17, 0xff
sleeploop2:
dec r17
brne sleeploop2
dec r16
brne sleeploop1
pop r17
pop r16
ret

seg7: .db 0b00111111, 0b00001100, 0b01011011, 0b01011110, 0b01101100, 0b01110110, 0b01110111, 0b00011100, 0b01111111, 0b01111110
.equ seg7B = seg7*2

; 1 e
; 2 d
; 4 c
; 6 b
; 7 a
; 9 f
; 10 g

; 1 e
; 2 d
; 3 c
; 4 b
; 5 a
; 6 f
; 7 g

;; 0: abcdef 1 2 3 4 5 6      0b 0 0111 111
;; 1: bc 4 3
;; 2: abged 5 4 7 1 2
;; 3: abgcd 5 4 7 3 2
;; 4: fgbc 6 7 4 3
;; 5: afgcd 5 6 7 3 2
;; 6: afgcde 5 6 7 3 2 1
;; 7: abc 5 4 3
;; 8: abcdefg 1 2 3 4 5 6 7
;; 9: abcdfg  2 3 4 5 6 7

;; 1: bc 3 4                    0b 0 0001 100
;; 2: abged 1 2 4 5 7           0b 0 1011 011
;; 3: abgcd 2 3 4 5 7           0b 0 1011 110
;; 4: fgbc 3 4 6 7              0b 0 1101 100
;; 5: afgcd 2 3 5 6 7           0b 0 1110 110
;; 6: afgcde 1 2 3 5 6 7        0b 0 1110 111
;; 7: abc 3 4 5                 0b 0 0011 100
;; 8: abcdefg 1 2 3 4 5 6 7     0b 0 1111 111
;; 9: abcdfg  2 3 4 5 6 7       0b 0 1111 110

telefonstr: .db "01735807467", 0
.equ telefonstrB = telefonstr*2

es tut sich was bei dem programm auf jeden fall. ich stelle es erst am ende vor, paar kleinere fehler drin

also, ich habe schon mal heraus gefunden, die sieben segment anzeige laesst sich nicht in beide richtungen verwenden, die rede ist von A/K gemeint sind damit wohl Siebensegmentanzeigen, die entweder A oder K haben und das Datasheet bezieht sich auf beide. Gut ist, dass A/K in diesem Falle an VCC also 5 V muss, nicht an GND, damit passt die Sache. und jetzt kann ich mir erklaeren, warum der inverter nicht notwendig war. ein altes Thema bei den Ports des Atmega8 meine led haben richtig gezaehlt? dafuer gibt es einen einfachen grund - man tut jedes mal bevor man eine zahl auf dem port ausgibt

com r16
out PORTB, r16
com r16
schreiben. das hatte ich bei dem zaehler nicht bedacht. ich habe nicht darueber nachgedacht. dass der zaehler das macht, trotzdem kam es richtig raus warum? eben weil sich das problem erledigt hat A/K ist VCC = 5V. und das ist auch hier so. damit kann ich bequem multiplexen warum kommt es dann richtig raus, bei der schaltung mit sieben segment, ohne - inverter ganz einfach, wenn ich den zaehler neu schreibe, ohne com also alle bits invertieren, kommt es so, dass ich den hex Inverter 7404 brauche blos habe ich das alte zaehlprogramm genommen, fuer die siebensegmentanzeige, da steht com drin und der witz ist naemlich, dass ohne der Atmega8 an den Ports PORTA, PORTB, PORTC, ... 0 fuer 1 ausgibt und 1 fuer 0 nicht intern, beim programmieren, alles richtig rum, aber aussen damit muss ich mir beim multiplexing keine sorgen machen und es geht, wie ich es sagte.

;; (C) David Vajda
;; 2025-03-22
;; siebensegment 1fach klassisch
.include "m8def.inc"

ldi r16, HIGH (RAMEND)
out SPH, r16
ldi r16, LOW (RAMEND)
out SPL, r16

ldi r16, 0xff
out DDRC, r16
out DDRB, r16

main:
ldi ZH, HIGH (telefonstrB)
ldi ZL, LOW (telefonstrB)
rcall telefonout
rjmp main

telefonout:
lpm r16, Z+
cpi r16, 0x00
breq telefonoutend
rcall bcddecode
com r16
out PORTC, r16
sbrc r16, 6
rjmp next
ldi r16, 0x01
out PORTB, r16
next:
rcall sleep
rjmp telefonout
telefonoutend:
ret

bcddecode:
push r16
push ZH
push ZL
ldi ZH, HIGH (seg7B)
ldi ZL, LOW (seg7B)
;; das stimmte natuerlich nicht mit dem adiw - das ist konstante laut i
bcddecodeloop1:
lpm r15, Z+
dec r16
brne bcddecodeloop1
pop ZL
pop ZH
pop r16
ret

sleep:
push r16
push r17
ldi r16, 0xff
sleeploop1:
ldi r17, 0xff
sleeploop2:
dec r17
brne sleeploop2
dec r16
brne sleeploop1
pop r17
pop r16
ret

seg7: .db 0b00111111, 0b00001100, 0b01011011, 0b01011110, 0b01101100, 0b01110110, 0b01110111, 0b00011100, 0b01111111, 0b01111110
.equ seg7B = seg7*2

; 1 e
; 2 d
; 4 c
; 6 b
; 7 a
; 9 f
; 10 g

; 1 e
; 2 d
; 3 c
; 4 b
; 5 a
; 6 f
; 7 g

;; 0: abcdef 1 2 3 4 5 6      0b 0 0111 111
;; 1: bc 4 3
;; 2: abged 5 4 7 1 2
;; 3: abgcd 5 4 7 3 2
;; 4: fgbc 6 7 4 3
;; 5: afgcd 5 6 7 3 2
;; 6: afgcde 5 6 7 3 2 1
;; 7: abc 5 4 3
;; 8: abcdefg 1 2 3 4 5 6 7
;; 9: abcdfg  2 3 4 5 6 7

;; 1: bc 3 4                    0b 0 0001 100
;; 2: abged 1 2 4 5 7           0b 0 1011 011
;; 3: abgcd 2 3 4 5 7           0b 0 1011 110
;; 4: fgbc 3 4 6 7              0b 0 1101 100
;; 5: afgcd 2 3 5 6 7           0b 0 1110 110
;; 6: afgcde 1 2 3 5 6 7        0b 0 1110 111
;; 7: abc 3 4 5                 0b 0 0011 100
;; 8: abcdefg 1 2 3 4 5 6 7     0b 0 1111 111
;; 9: abcdfg  2 3 4 5 6 7       0b 0 1111 110

telefonstr: .db "01735807467", 0
.equ telefonstrB = telefonstr*2


;; da war natuerlich ein dummer fehler drin, die telefonnummer ein string, das sollt so nicht, der rest ist jetzt fast in ordnung, ausgabe geht,

;; (C) David Vajda
;; 2025-03-22
;; siebensegment 1fach klassisch
.include "m8def.inc"

ldi r16, HIGH (RAMEND)
out SPH, r16
ldi r16, LOW (RAMEND)
out SPL, r16

ldi r16, 0xff
out DDRC, r16
out DDRB, r16

main:
;ldi r16, 0x01
ldi ZH, HIGH (telefonstrB)
ldi ZL, LOW (telefonstrB)
;rcall telefonout
;ldi r16, 0x00
;rcall telefonout
rcall telefonout
;com r24
;out PORTC, r24
;sbrs r24, 6
;rjmp next
;ldi r24, 0x01
;out PORTB, r24
;next:
;rcall sleep
rjmp main

telefonout:
lpm r16, Z+
cpi r16, 0xff
breq telefonoutend
rcall bcddecode
com r24
out PORTC, r24
sbrs r24, 6
rjmp next
ldi r24, 0x01
out PORTB, r24s
next:
rcall sleep
rjmp telefonout
telefonoutend:
ret

bcddecode:
push r16
push ZH
push ZL
ldi ZH, HIGH (seg7B)
ldi ZL, LOW (seg7B)
;; das stimmte natuerlich nicht mit dem adiw - das ist konstante laut i
inc r16
bcddecodeloop1:
lpm r24, Z+
dec r16
brne bcddecodeloop1
pop ZL
pop ZH
pop r16
ret

sleep:
push r16
push r17
ldi r16, 0xff
sleeploop1:
ldi r17, 0xff
sleeploop2:
dec r17
brne sleeploop2
dec r16
brne sleeploop1
pop r17
pop r16
ret

seg7: .db 0b00111111, 0b00001100, 0b01011011, 0b01011110, 0b01101100, 0b01110110, 0b01110111, 0b00011100, 0b01111111, 0b01111110
.equ seg7B = seg7*2

; 1 e
; 2 d
; 4 c
; 6 b
; 7 a
; 9 f
; 10 g

; 1 e
; 2 d
; 3 c
; 4 b
; 5 a
; 6 f
; 7 g

;; 0: abcdef 1 2 3 4 5 6      0b 0 0111 111
;; 1: bc 4 3
;; 2: abged 5 4 7 1 2
;; 3: abgcd 5 4 7 3 2
;; 4: fgbc 6 7 4 3
;; 5: afgcd 5 6 7 3 2
;; 6: afgcde 5 6 7 3 2 1
;; 7: abc 5 4 3
;; 8: abcdefg 1 2 3 4 5 6 7
;; 9: abcdfg  2 3 4 5 6 7

;; 1: bc 3 4                    0b 0 0001 100
;; 2: abged 1 2 4 5 7           0b 0 1011 011
;; 3: abgcd 2 3 4 5 7           0b 0 1011 110
;; 4: fgbc 3 4 6 7              0b 0 1101 100
;; 5: afgcd 2 3 5 6 7           0b 0 1110 110
;; 6: afgcde 1 2 3 5 6 7        0b 0 1110 111
;; 7: abc 3 4 5                 0b 0 0011 100
;; 8: abcdefg 1 2 3 4 5 6 7     0b 0 1111 111
;; 9: abcdfg  2 3 4 5 6 7       0b 0 1111 110

telefonstr: .db 0,1,7,3,5,8,0,7,4,6,7,0xff
.equ telefonstrB = telefonstr*2

;; (C) David Vajda
;; 2025-03-22
;; siebensegment 1fach klassisch
.include "m8def.inc"

ldi r16, HIGH (RAMEND)
out SPH, r16
ldi r16, LOW (RAMEND)
out SPL, r16

ldi r16, 0xff
out DDRC, r16
out DDRB, r16

main:
;ldi r16, 0x01
ldi ZH, HIGH (telefonstrB)
ldi ZL, LOW (telefonstrB)
;rcall telefonout
;ldi r16, 0x00
;rcall telefonout
rcall telefonout
;com r24
;out PORTC, r24
;sbrs r24, 6
;rjmp next
;ldi r24, 0x01
;out PORTB, r24
;next:
;rcall sleep
rjmp main

telefonout:
lpm r16, Z+
cpi r16, 0x22
breq telefonoutend
rcall bcddecode
com r24
out PORTC, r24
sbrs r24, 6
rjmp next
ldi r24, 0x01
out PORTB, r24
rjmp next2
next:
ldi r24, 0x00
out PORTB, r24
next2:
rcall sleep
rjmp telefonout
telefonoutend:
ret

bcddecode:
push r16
push ZH
push ZL
ldi ZH, HIGH (seg7B)
ldi ZL, LOW (seg7B)
;; das stimmte natuerlich nicht mit dem adiw - das ist konstante laut i
inc r16
bcddecodeloop1:
lpm r24, Z+
dec r16
brne bcddecodeloop1
pop ZL
pop ZH
pop r16
ret

sleep:
push r16
push r17
ldi r16, 0xff
sleeploop1:
ldi r17, 0xff
sleeploop2:
dec r17
brne sleeploop2
dec r16
brne sleeploop1
pop r17
pop r16
ret

seg7: .db 0b00111111, 0b00001100, 0b01011011, 0b01011110, 0b01101100, 0b01110110, 0b01110111, 0b00011100, 0b01111111, 0b01111110
.equ seg7B = seg7*2

; 1 e
; 2 d
; 4 c
; 6 b
; 7 a
; 9 f
; 10 g

; 1 e
; 2 d
; 3 c
; 4 b
; 5 a
; 6 f
; 7 g

;; 0: abcdef 1 2 3 4 5 6      0b 0 0111 111
;; 1: bc 4 3
;; 2: abged 5 4 7 1 2
;; 3: abgcd 5 4 7 3 2
;; 4: fgbc 6 7 4 3
;; 5: afgcd 5 6 7 3 2
;; 6: afgcde 5 6 7 3 2 1
;; 7: abc 5 4 3
;; 8: abcdefg 1 2 3 4 5 6 7
;; 9: abcdfg  2 3 4 5 6 7

;; 1: bc 3 4                    0b 0 0001 100
;; 2: abged 1 2 4 5 7           0b 0 1011 011
;; 3: abgcd 2 3 4 5 7           0b 0 1011 110
;; 4: fgbc 3 4 6 7              0b 0 1101 100
;; 5: afgcd 2 3 5 6 7           0b 0 1110 110
;; 6: afgcde 1 2 3 5 6 7        0b 0 1110 111
;; 7: abc 3 4 5                 0b 0 0011 100
;; 8: abcdefg 1 2 3 4 5 6 7     0b 0 1111 111
;; 9: abcdfg  2 3 4 5 6 7       0b 0 1111 110

telefonstr: .db 0,1,7,3,5,8,0,7,4,6,7,0x22
.equ telefonstrB = telefonstr*2


;; ich mache es langsamer

;; (C) David Vajda
;; 2025-03-22
;; siebensegment 1fach klassisch
.include "m8def.inc"

ldi r16, HIGH (RAMEND)
out SPH, r16
ldi r16, LOW (RAMEND)
out SPL, r16

ldi r16, 0xff
out DDRC, r16
out DDRB, r16

main:
;ldi r16, 0x01
ldi ZH, HIGH (telefonstrB)
ldi ZL, LOW (telefonstrB)
;rcall telefonout
;ldi r16, 0x00
;rcall telefonout
rcall telefonout
;com r24
;out PORTC, r24
;sbrs r24, 6
;rjmp next
;ldi r24, 0x01
;out PORTB, r24
;next:
;rcall sleep
rjmp main

telefonout:
lpm r16, Z+
cpi r16, 0x22
breq telefonoutend
rcall bcddecode
rcall out7
rcall sleep
rjmp telefonout
telefonoutend:
ret

out7:
com r24
out PORTC, r24
sbrs r24, 6
rjmp next
ldi r24, 0x01
out PORTB, r24
rjmp next2
next:
ldi r24, 0x00
out PORTB, r24
next2:
ret

bcddecode:
push r16
push ZH
push ZL
ldi ZH, HIGH (seg7B)
ldi ZL, LOW (seg7B)
;; das stimmte natuerlich nicht mit dem adiw - das ist konstante laut i
inc r16
bcddecodeloop1:
lpm r24, Z+
dec r16
brne bcddecodeloop1
pop ZL
pop ZH
pop r16
ret

sleep:
push r16
push r17
ldi r16, 0xff
sleeploop1:
ldi r17, 0xff
sleeploop2:
dec r17
brne sleeploop2
dec r16
brne sleeploop1
pop r17
pop r16
ret

seg7: .db 0b00111111, 0b00001100, 0b01011011, 0b01011110, 0b01101100, 0b01110110, 0b01110111, 0b00011100, 0b01111111, 0b01111110
.equ seg7B = seg7*2

; 1 e
; 2 d
; 4 c
; 6 b
; 7 a
; 9 f
; 10 g

; 1 e
; 2 d
; 3 c
; 4 b
; 5 a
; 6 f
; 7 g

;; 0: abcdef 1 2 3 4 5 6      0b 0 0111 111
;; 1: bc 4 3
;; 2: abged 5 4 7 1 2
;; 3: abgcd 5 4 7 3 2
;; 4: fgbc 6 7 4 3
;; 5: afgcd 5 6 7 3 2
;; 6: afgcde 5 6 7 3 2 1
;; 7: abc 5 4 3
;; 8: abcdefg 1 2 3 4 5 6 7
;; 9: abcdfg  2 3 4 5 6 7

;; 1: bc 3 4                    0b 0 0001 100
;; 2: abged 1 2 4 5 7           0b 0 1011 011
;; 3: abgcd 2 3 4 5 7           0b 0 1011 110
;; 4: fgbc 3 4 6 7              0b 0 1101 100
;; 5: afgcd 2 3 5 6 7           0b 0 1110 110
;; 6: afgcde 1 2 3 5 6 7        0b 0 1110 111
;; 7: abc 3 4 5                 0b 0 0011 100
;; 8: abcdefg 1 2 3 4 5 6 7     0b 0 1111 111
;; 9: abcdfg  2 3 4 5 6 7       0b 0 1111 110

telefonstr: .db 0,1,7,3,5,8,0,7,4,6,7,0x22
.equ telefonstrB = telefonstr*2


\begin{verbatim}
;; (C) David Vajda
;; 2025-03-22
;; siebensegment 1fach klassisch
.include "m8def.inc"

ldi r16, HIGH (RAMEND)
out SPH, r16
ldi r16, LOW (RAMEND)
out SPL, r16

ldi r16, 0xff
out DDRC, r16
out DDRB, r16

main:
;ldi r16, 0x01
ldi ZH, HIGH (telefonstrB)
ldi ZL, LOW (telefonstrB)
;rcall telefonout
;ldi r16, 0x00
;rcall telefonout
rcall telefonout
;com r24
;out PORTC, r24
;sbrs r24, 6
;rjmp next
;ldi r24, 0x01
;out PORTB, r24
;next:
;rcall sleep
rjmp main

telefonout:
lpm r16, Z+
cpi r16, 0x22
breq telefonoutend
rcall bcddecode
rcall out7
rcall sleep
rjmp telefonout
telefonoutend:
ret

out7:
com r24
out PORTC, r24
sbrs r24, 6
rjmp next
ldi r24, 0x01
out PORTB, r24
rjmp next2
next:
ldi r24, 0x00
out PORTB, r24
next2:
ret

bcddecode:
push r16
push ZH
push ZL
ldi ZH, HIGH (seg7B)
ldi ZL, LOW (seg7B)
;; das stimmte natuerlich nicht mit dem adiw - das ist konstante laut i
inc r16
bcddecodeloop1:
lpm r24, Z+
dec r16
brne bcddecodeloop1
pop ZL
pop ZH
pop r16
ret

sleep:
push r16
push r17
push r18
ldi r16, 0xff
sleeploop1:
ldi r17, 0xff
sleeploop2:
ldi r18, 0x04
sleeploop3:
dec r18
brne sleeploop3
dec r17
brne sleeploop2
dec r16
brne sleeploop1
pop r18
pop r17
pop r16
ret

seg7: .db 0b00111111, 0b00001100, 0b01011011, 0b01011110, 0b01101100, 0b01110110, 0b01110111, 0b00011100, 0b01111111, 0b01111110
.equ seg7B = seg7*2

; 1 e
; 2 d
; 4 c
; 6 b
; 7 a
; 9 f
; 10 g

; 1 e
; 2 d
; 3 c
; 4 b
; 5 a
; 6 f
; 7 g

;; 0: abcdef 1 2 3 4 5 6      0b 0 0111 111
;; 1: bc 4 3
;; 2: abged 5 4 7 1 2
;; 3: abgcd 5 4 7 3 2
;; 4: fgbc 6 7 4 3
;; 5: afgcd 5 6 7 3 2
;; 6: afgcde 5 6 7 3 2 1
;; 7: abc 5 4 3
;; 8: abcdefg 1 2 3 4 5 6 7
;; 9: abcdfg  2 3 4 5 6 7

;; 1: bc 3 4                    0b 0 0001 100
;; 2: abged 1 2 4 5 7           0b 0 1011 011
;; 3: abgcd 2 3 4 5 7           0b 0 1011 110
;; 4: fgbc 3 4 6 7              0b 0 1101 100
;; 5: afgcd 2 3 5 6 7           0b 0 1110 110
;; 6: afgcde 1 2 3 5 6 7        0b 0 1110 111
;; 7: abc 3 4 5                 0b 0 0011 100
;; 8: abcdefg 1 2 3 4 5 6 7     0b 0 1111 111
;; 9: abcdfg  2 3 4 5 6 7       0b 0 1111 110

telefonstr: .db 0,1,7,3,5,8,0,7,4,6,7,0x22
.equ telefonstrB = telefonstr*2
\end{verbatim}


\begin{lstlisting}
0173587467

video 1

Den umständlichen Bit abfragen. Bei den umständlichen bedingten Verzweigung gibt es auch ein. Clear und Set Bit, einerseits für Ports und andererseits für Register. In dem Fall hat es fürs Register funktioniert beim Port irgendwas nicht getan das gucke ich mir genauer an deswegen ist es so umständlich. Sorry

Sieben Segmentanzeige gemultiplexed sobald ich zu Hause bin Ich muss nur eins tun die andere genau dahin, wo die andere jetzt auch ist, genauso verbinden und dann zusätzlich zwei Pins an einem Port reservieren, die noch frei sind. Und wenn da eine Eins ist, dann kommt die eine Ziffer auf die ein und die andere und es ist immer nur eine Eins

Ich fürchte, die 14 Segment anzeigen passen genauso wenig rein wie das lcd

Was mir auffällt, ist, dass der Stromverbrauch mit zwei 7 Segment Anzeigen Ich habe zwei genommen und parallel geschaltet. Größer wird oder durch die Parallelschaltung der Widerstände. Probier mal beide auf ein also es geht ja dann nachher nicht die brauchen ja einzelnen d.h. unter Umständen muss man die widerstehen kleiner berechnen.

Jetzt hab ich alle reingesteckt jetzt hab ich alle reingesteckt und komischerweise sind sie jetzt wieder hell. Also man könnte jetzt machen, dass sie beide dunkler geworden sind. Das wär ja das eine Prinzip, dass beide dunkler geworden sind und dass man das in Wirklichkeit immer noch als hell auffasst und dadurch dass beide gleich hell sind. Sozusagen könnte man meint die sind wieder sehr hell. Würde mir jetzt jemand sagen ich hab nicht den Eindruck es kann ja auch sein, dass da irgend Zusammenhang zwischen den einzelnen Segmenten besteht und das Währenddie einzigen der einen Anzeige alle dran sind und bei der anderen Anzeige. Da waren nicht alle Segmente dran, dass dadurch das irgendwie so verlaufen ist, weil bei der anderen Anzeige nicht alles Segmente dran waren. Das ist dadurch irgendwie auf der anderen dunkler wurde oder irgend sowas jedenfalls sieht ganz gut aus trotz allem mit dem Widerstand

Viel wichtiger ist, jetzt muss man geht. Es um Werte es geht zum Beispiel vielleicht da drum vor verschiedenste Parameter. Vielleicht im elektrotechnischen Sinne kann man drüber nachdenken aber es geht ja auch um wirklich um die Verzögerungschleife. Also um Sleep nenne ich halt wenn keiner da ist hab ich ausprobiert müsste eigentlich gehen es sind nur noch Achter. Wenn's zu langsam ist wird's auch nicht funktionieren. Das kann heller und dunkler sein als hier geht's wirklich dann da drum das perfekt einzustellen

;; (C) David Vajda
;; 2025-03-22
;; siebensegment 1fach klassisch
.include "m8def.inc"

ldi r16, HIGH (RAMEND)
out SPH, r16
ldi r16, LOW (RAMEND)
out SPL, r16

ldi r16, 0xff
out DDRC, r16
out DDRB, r16
ldi r16, 0xff
out DDRD, r16
ldi r16, 0b01010101
out PORTD, r16
push r16

main:
;ldi r16, 0x01
ldi ZH, HIGH (telefonstrB)
ldi ZL, LOW (telefonstrB)
;rcall telefonout
;ldi r16, 0x00
;rcall telefonout
pop r16
out PORTD, r16
push r16
rcall telefonout
pop r16
lsl r16
out PORTD, r16
push r16
;ldi ZH, HIGH (telefonstrB)
;ldi ZL, LOW (telefonstrB)
rcall telefonout
pop r16
lsr r16
push r16
;com r24
;out PORTC, r24
;sbrs r24, 6
;rjmp next
;ldi r24, 0x01
;out PORTB, r24
;next:
;rcall sleep
rjmp main

telefonout:
lpm r16, Z+
cpi r16, 0x22
breq telefonoutend
rcall bcddecode
rcall out7
rcall sleep
telefonoutend:
ret

out7:
com r24
out PORTC, r24
sbrs r24, 6
rjmp next
ldi r24, 0x01
out PORTB, r24
rjmp next2
next:
ldi r24, 0x00
out PORTB, r24
next2:
ret

bcddecode:
push r16
push ZH
push ZL
ldi ZH, HIGH (seg7B)
ldi ZL, LOW (seg7B)
;; das stimmte natuerlich nicht mit dem adiw - das ist konstante laut i
inc r16
bcddecodeloop1:
lpm r24, Z+
dec r16
brne bcddecodeloop1
pop ZL
pop ZH
pop r16
ret

sleep:
push r16
push r17
push r18
ldi r16, 0xff
sleeploop1:
ldi r17, 0x0b
sleeploop2:
dec r17
brne sleeploop2
dec r16
brne sleeploop1
pop r18
pop r17
pop r16
ret

seg7: .db 0b00111111, 0b00001100, 0b01011011, 0b01011110, 0b01101100, 0b01110110, 0b01110111, 0b00011100, 0b01111111, 0b01111110
.equ seg7B = seg7*2

; 1 e
; 2 d
; 4 c
; 6 b
; 7 a
; 9 f
; 10 g

; 1 e
; 2 d
; 3 c
; 4 b
; 5 a
; 6 f
; 7 g

;; 0: abcdef 1 2 3 4 5 6      0b 0 0111 111
;; 1: bc 4 3
;; 2: abged 5 4 7 1 2
;; 3: abgcd 5 4 7 3 2
;; 4: fgbc 6 7 4 3
;; 5: afgcd 5 6 7 3 2
;; 6: afgcde 5 6 7 3 2 1
;; 7: abc 5 4 3
;; 8: abcdefg 1 2 3 4 5 6 7
;; 9: abcdfg  2 3 4 5 6 7

;; 1: bc 3 4                    0b 0 0001 100
;; 2: abged 1 2 4 5 7           0b 0 1011 011
;; 3: abgcd 2 3 4 5 7           0b 0 1011 110
;; 4: fgbc 3 4 6 7              0b 0 1101 100
;; 5: afgcd 2 3 5 6 7           0b 0 1110 110
;; 6: afgcde 1 2 3 5 6 7        0b 0 1110 111
;; 7: abc 3 4 5                 0b 0 0011 100
;; 8: abcdefg 1 2 3 4 5 6 7     0b 0 1111 111
;; 9: abcdfg  2 3 4 5 6 7       0b 0 1111 110

telefonstr: .db 2,4,0x22, 0x22
.equ telefonstrB = telefonstr*2

Und bei den Fotos muss man aufpassen das sieht ohne Fotoapparat sieht's perfekt aus mit Fotoapparat aber das liegt nicht glaube ich so an der Sache selber aber dann ist dann werde ich das Licht im Zimmer anmachen ohne Licht direkt auf die Segmente sieht auf dem Foto nicht gut aus, wo es sonst perfekt aussieht eigentlich



Unterabschnitte