Hallo zusammen !!!
Der ursprüngliche Code, welcher in Assembler geschrieben ist:
....Code:.include "m8def.inc" ldi r16, 0xFF out DDRD,r16 ;Im Datenrichtungsregister PORTD als Ausgang deklarieren ldi r18, 0xFF ;Dem Diplay Zeit geben um sich selbst zu initialisieren ldi r16, HIGH(RAMEND) out sph, r16 ldi r16, LOW(RAMEND) out SPL, r16 rcall Warten ; ; cbi PORTD, 6 ;Den 6.Port (PD6) = R/W auf low setzen um in den Schreibmodus zu stellen cbi PORTD, 4 ;Den 4.PORT (PD4) auf low setzen um in den Komandomodus zu wechseln ; ;ldi r16,0b00000010 out PORTD, r16 sbi PORTD, 5 ;Den 5.PORTD (PD5) auf High setzen, um den Display zu Signalisieren, das es die Daten von PD0 bis PD4 übernehmen kann nop ; 3 Taktzyklen warten, um dem Display, für die Datenübernahme, genügend Zeit zu geben nop nop cbi PORTD, 5 ;PD5 wieder auf LOW setzen ; ; ldi r18, 0xFF ;Dem Diplay Zeit geben um sich selbst zu initialisieren ; ldi r16, HIGH(RAMEND) ; out sph, r16 ; ldi r16, LOW(RAMEND) ; out SPL, r16 ;; rcall Warten ;; ldi r16, 0b00000010 out PORTD, r16 ;Den 1.Port (PD1) am Display DB5 auf High setzen um in den 4-Bit Modus zu wechseln sbi PORTD, 5 ;Den 5.PORTD (PD5) auf High setzen, um den Display zu Signalisieren, das es die Daten von PD0 bis PD4 übernehmen kann nop ; 3 Taktzyklen warten, um dem Display, für die Datenübernahme, genügend Zeit zu geben nop nop cbi PORTD, 5 ;; ; ldi r18, 0xFF ;Dem Diplay Zeit geben um sich selbst zu initialisieren ; ldi r16, HIGH(RAMEND) ;; out sph, r16 ; ldi r16, LOW(RAMEND) ; out SPL, r16 rcall Warten ; rcall Befehl ;*********************************************************************************************************************************** ldi r18, 0xFF ;Dem Diplay Zeit geben um sich selbst zu initialisieren ldi r16, HIGH(RAMEND) out sph, r16 ldi r16, LOW(RAMEND) out SPL, r16 rcall Warten ldi r16, 0b01001101 ;M rcall Ausgabe ldi r18, 0xFF ;Dem Diplay Zeit geben um sich selbst zu initialisieren ldi r16, HIGH(RAMEND) out sph, r16 ldi r16, LOW(RAMEND) out SPL, r16 rcall Warten ldi r16, 0b01100001 ;a rcall Ausgabe ldi r18, 0xFF ;Dem Diplay Zeit geben um sich selbst zu initialisieren ldi r16, HIGH(RAMEND) out sph, r16 ldi r16, LOW(RAMEND) out SPL, r16 rcall Warten
hier wiederholt sich der Code immer wieder, nur der Eintrag in r16 wird auf andere Buchstaben (Binärcode) geändert
.....
und hier geht´s weiter:
Die Funktionen `Befehl` und `BussyAbfrage` habe ich im Code zweck´s Versuch ebenfalls eingebaut gehabt. Ich kann aber jetzt nicht mehr genau sagen wo, deshalb habe ich auch keinen `rcall` Befehl mehr dafür. Wenn ich diesen Code auf den Atmega brenne, ist das Display einfach leer.Code:ldi r16, 0b00100001 ;! rcall Ausgabe ldi r18, 0xFF ;Dem Diplay Zeit geben um sich selbst zu initialisieren ldi r16, HIGH(RAMEND) out sph, r16 ldi r16, LOW(RAMEND) out SPL, r16 rcall Warten loop1: rjmp loop1 Befehl: ;ldi r16, 125 ;Ab dieser Zeile ist das Programm nur Abgeschrieben mov r17,r16 ; Kopie von r16 in r17 eintragen swap r16 ; vertauscht die beiden Nibbles von r16 (Die Bit´s 0-3 und 4-8 werden vertauscht) andi r16, 0b00001111 ; Nur die vier unteren (mit 1 markierten) ; Bits werden übernommen, alle anderen werden null sbr r16, 0b00010000 ; Bit 4 auf low setzen, alle anderen Bits bleiben gleich out PORTD, r16 sbi PORTD, 5 ;Den 5.PORTD (PD5) auf High setzen, um den Display zu Signalisieren, das es die Daten von PD0 bis PD4 übernehmen kann nop ; 3 Taktzyklen warten, um dem Display, für die Datenübernahme, genügend Zeit zu geben nop nop cbi PORTD, 5 ;PD5 wieder auf LOW setzen andi r17, 0b00001111 sbr r17, 1<<4 ; nur eine andere Schreibweise von oben out PORTD, r17 sbi PORTD, 5 nop nop nop cbi PORTD, 5 sbi PORTD, 4 ret Ausgabe: ;ldi r16, 125 ;Ab dieser Zeile ist das Programm nur Abgeschrieben mov r17,r16 ; Kopie von r16 in r17 eintragen swap r16 ; vertauscht die beiden Nibbles von r16 (Die Bit´s 0-3 und 4-8 werden vertauscht) andi r16, 0b00001111 ; Nur die vier unteren (mit 1 markierten) ; Bits werden übernommen, alle anderen werden null ;sbr r16, 0b00010000 ; Bit 4 setzen, alle anderen Bits bleiben gleich sbr r17, 1<<4 out PORTD, r16 sbi PORTD, 5 ;Den 5.PORTD (PD5) auf High setzen, um den Display zu Signalisieren, das es die Daten von PD0 bis PD4 übernehmen kann nop ; 3 Taktzyklen warten, um dem Display, für die Datenübernahme, genügend Zeit zu geben nop nop cbi PORTD, 5 ;PD5 wieder auf LOW setzen andi r17, 0b00001111 sbr r17, 1<<4 ; nur eine andere Schreibweise von oben out PORTD, r17 sbi PORTD, 5 nop nop nop cbi PORTD, 5 ret Warten: dec r18 brne Warten ret BussyAbfrage : ldi r18, 0b00010100 ;Dem Diplay Zeit geben um sich selbst zu initialisieren ldi r16, HIGH(RAMEND) out sph, r16 ldi r16, LOW(RAMEND) out SPL, r16 rcall Warten sbi PORTD, 6 ;Port 6 (PD6) = R/W auf high setzen, für den lesemodus cbi DDRD, 3 ;PORTD-3 (PD3) von Ausgang auf Eingang (PIND-3) ändern nop sbi PORTD, 5 ; PD5 (E) auf High setzen nop nop nop in r16,PIND ; Einlesen des oberen Daten Nipples von Port D nop cbi PORTD, 5 ; PD5 (E) auf Low setzen (E-Wackeln) nop sbi PORTD, 5 ; PD5 (E) wieder auf High setzen nop in r17, PIND ; Einlesen des unteren Daten Nipples von Port D nop cbi PORTD, 5 ; PD5 (E) auf Low setzen (E-Wackeln) swap r16 andi r16, 0b10000000 brne BussyAbfrage cbi PORTD, 6 ;Den 6.Port (PD6) = R/W auf low setzen um in den Schreibmodus zu stellen sbi DDRD,3 ; PORT-3 (PD3) wieder als Ausgang deffinieren ret
Mit dem folgenden Code, dieser war, bzw. ist nur zum Testen, und deshalb auch nicht komplett. Aber hier zeigt sich wenigstens etwas am Display. Nur bis gestern hatte ich nur dann Bewegung am Display, wenn ich mit der Hand in die nähe der Anschlußleitungen (Vcc, GND, DB0-DB7...usw) gekommen bin. Ansonsten war ruhe am Display. Jetzt tut sich auch etwas, auch wenn ich nicht in der nähe bin. Die Lötstellen habe ich, wie bereits erwähnt, kontolliert und alle nachgelötet.
Hier der zweite Code:
Ich hoffe ihr könnt etwas damit anfangen.Code:.include "m8def.inc" ldi r16, 0xff out DDRD, r16 ;PORTD als Ausgang Initialisieren out DDRB, r16 ;PORTB als Ausgang initialisieren ldi r18, 0b1100100 ldi r16, HIGH(RAMEND) out sph, r16 ldi r16, LOW(RAMEND) out SPL, r16 rcall Warten ;Dem Diplay Zeit geben um sich selbst zu initialisieren ldi r16, 0b00000011 out DDRB, r16 ldi r18, 0b1100100 ldi r16, HIGH(RAMEND) out sph, r16 ldi r16, LOW(RAMEND) out SPL, r16 rcall Warten ;Dem Diplay Zeit geben um sich selbst zu initialisieren ldi r17, 0b00000001 loop: out DDRD, r17 ldi r18, 0b1100100 ldi r16, HIGH(RAMEND) out sph, r16 ldi r16, LOW(RAMEND) out SPL, r16 rcall Warten ;Dem Diplay Zeit geben um sich selbst zu initialisieren ;ldi r16, 0b00000010 ;out DDRB, r16 ldi r18, 0b1100100 ldi r16, HIGH(RAMEND) out sph, r16 ldi r16, LOW(RAMEND) out SPL, r16 rcall Warten inc r17 ldi r16, 0b00000000 out DDRB, r16 ldi r18, 0b1100100 ldi r16, HIGH(RAMEND) out sph, r16 ldi r16, LOW(RAMEND) out SPL, r16 rcall Warten rjmp loop Warten: dec r18 brne Warten ret
Spitfire








Zitieren


Lesezeichen