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
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
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.
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
gucken sie mal
Jetzt schauen in dem Programm Quelltext, ob ich zufälligerweise d mit e verwechselt habe
;; 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
na also
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
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
...
ich schreibe jetzt die programme fuer den atmega8 - rs232 transmit und recieve
;; (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
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.
altes programm besser, noch mal pruefen.
altes programm auf anhieb, neues programm pruefen.
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.
;; (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
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
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
erst mal habe ich jetzt den mantel des kabels sub d 9 - rs232 geerdet, es scheint gefuehlt bessere ergebnisse zu liefern.
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, 1im datasheet steht
adiw ZH:ZL, 2das 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*2das 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.
nachdem ich die kabel ausgetauscht habe und indem ich den reset knopf druecke scheint es jetzt jedes mal sauber zu gehen
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
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 stdwas heisst das? zunaechst gibt es die pointer register
X, Y, Zwer 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+6nicht in das schema, hier brauche ich
ldd r16, Y+15oder 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, r26jetzt 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.
ja, siehe da es funktioniert, das ist jetzt eindeutig.
;; (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 r16schreiben. 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