- 12V Akku mit 280 Ah bauen         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 17 von 17

Thema: Atmega 8 verzögerungsschleifen?

  1. #11
    Gast
    Anzeige

    E-Bike
    Zitat:
    "Wenn ich das Display an µC anschließe, dann erscheint ein schwarzer Balken in der ersten Zeile".
    Die Kontrastspannung, meist VEE genannt, darf nicht direkt mit der Versorgungsspannung oder GND verbunden werden. Meist hängt ein Poti
    10 kOhm zwischen der Versorgungsspannung und GND und der Abgriff an VEE. Damit stellt man den Kontrast erst mal so ein, das die Display Zeile gerade beginnt dunkel zu werden.
    Des Weiteren kann dein Programm einfach zu schnell sein.( Code nicht gecheckt). Man kann den display controller abfragen ob er "Busy" ist indem man seine Daten liest und prüft ob das "Busy Flag" gesetzt ist (Bit 7).
    Wenn Daten / Commands kommen wärend der Controller beschäftigt ist, dann gibt es meistens Mist.

  2. #12
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.07.2006
    Ort
    nähe Rottweil
    Alter
    40
    Beiträge
    240
    Hallo

    Der Kontrast kann nicht das Problem sein, habe schon von Anfang an ein Poti drin und habe auch nach jedem neuen Programm versucht ob es am Kontrast liegt.

    Wie kann ich jetzt herausbekommen ob mein Programm zu schnell ist?

    Kann es sein daß die Taktfrequenz von 12 MHz einfach zu hoch ist? Wenn ja wie kann ich das ändern? Ich meine auf die schnelle, hab grad leider kein langsameres Quarz da... Werd mir aber mal ein 4 Mhz Quarz besorgen.

    MFG

    Bean

  3. #13
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.05.2004
    Ort
    Wilhelmshaven
    Alter
    46
    Beiträge
    324
    du hast doch die ganzen Warteschleifen auf 12MHz angepasst, weil sie wohl für 4MHz gedacht waren, oder? Sonst kann es auch nicht funktionieren.
    Ich habe mir auch mal wieder die Mühe gemacht, nachdem mein UART jetzt mit dem externen Quarz läuft, mein LCD in Gang zu bekommen.
    Habe den gleichen Code von Mikrocontroller.net genommen und den Port auf C umgeschrieben, weil der noch frei war.
    Hat leider nicht funktioniert, also habe ich mit obigem Programm sämtliche Schleifen neu berechnet und eingefügt. Hat aber auch nichts gebracht.
    Ich schätze, dass ich irgendwelche Störungen in der Schaltung habe und es deswegen nicht funktioniert. Muß mal die Mikrocontroller.net Checkliste durchgehen und überall wo nötig Pullup-down Widerstände reinsetzen und das mit den Entstörkondensatoren sollte ich auch mal machen.
    Kann ich irgendwie nicht wahrhaben, dass jeder Hans und Franz so ein dummes LCD zum laufen kriegt und ich nicht. Aber ich benutze auch nicht das RN Board oder ähnliches sondern Marke-Eigenbau, weil mir das mehr Spaß macht, als irgendwelche Dinge nachzubauen. Dafür fehlt mir jetzt auch die Erfahrung und der Support von den Leuten, die schon länger mit diesen fertigen Boards arbeiten. Naja, aus Fehlern lernt man. (hoffentllich)

    Code:
    .include "m8def.inc"
    
    .def temp1 = r16
    .def temp2 = r17
    .def temp3 = r18
    
    
               ldi temp1, LOW(RAMEND)      ; LOW-Byte der obersten RAM-Adresse
               out SPL, temp1
               ldi temp1, HIGH(RAMEND)     ; HIGH-Byte der obersten RAM-Adresse
               out SPH, temp1
    
               ldi temp1, 0xFF    ;Port C = Ausgang
               out DDRC, temp1
    
               rcall lcd_init     ;Display initialisieren
               rcall lcd_clear    ;Display löschen
    
               ldi temp1, 'T'     ;Zeichen anzeigen
               rcall lcd_data
    
               ldi temp1, 'e'     ;Zeichen anzeigen
               rcall lcd_data
               
               ldi temp1, 's'     ;Zeichen anzeigen
               rcall lcd_data
    
               ldi temp1, 't'     ;Zeichen anzeigen
               rcall lcd_data
    
    loop:
               rjmp loop
    
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;;                 LCD-Routinen                ;;
    ;;                 ============                ;;
    ;;              (c)andreas-s@web.de            ;;
    ;;                                             ;;
    ;; 4bit-Interface                              ;;
    ;; DB4-DB7:       PC0-PC3                      ;;
    ;; RS:            PC4                          ;;
    ;; E:             PC5                          ;;
    ;; für 4MHz Quarz                              ;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    
     
     
     ;sendet ein Datenbyte an das LCD
    lcd_data:
               mov temp2, temp1             ;"Sicherungskopie" für
                                            ;die Übertragung des 2.Nibbles
               swap temp1                   ;Vertauschen
               andi temp1, 0b00001111       ;oberes Nibble auf Null setzen
               sbr temp1, 1<<4              ;entspricht 0b00010000
               out PORTC, temp1             ;ausgeben
               rcall lcd_enable             ;Enable-Routine aufrufen
                                            ;2. Nibble, kein swap da es schon
                                            ;an der richtigen stelle ist
               andi temp2, 0b00001111       ;obere Hälfte auf Null setzen 
               sbr temp2, 1<<4              ;entspricht 0b00010000
               out PORTC, temp2             ;ausgeben
               rcall lcd_enable             ;Enable-Routine aufrufen
               rcall delay50us              ;Delay-Routine aufrufen
               ret                          ;zurück zum Hauptprogramm
    
     ;sendet einen Befehl an das LCD
    lcd_command:                            ;wie lcd_data, nur ohne RS zu setzen
               mov temp2, temp1
               swap temp1
               andi temp1, 0b00001111
               out PORTC, temp1
               rcall lcd_enable
               andi temp2, 0b00001111
               out PORTC, temp2
               rcall lcd_enable
               rcall delay50us
               ret
    
     ;erzeugt den Enable-Puls
    lcd_enable:
               sbi PORTC, 5                 ;Enable high
               nop                          ;3 Taktzyklen warten
               nop
               nop
               cbi PORTC, 5                 ;Enable wieder low
               ret                          ;Und wieder zurück                     
    
     ;Pause nach jeder Übertragung
    delay50us:                              ;50us Pause
    ; ============================= 
    ;    delay loop generator 
    ;     200 cycles:
    ; ----------------------------- 
    ; delaying 198 cycles:
              ldi  R16, $42
    WGLOOP0:  dec  R16
              brne WGLOOP0
    ; ----------------------------- 
    ; delaying 2 cycles:
              nop
              nop
    		  ret
    ; ============================= 
    ;           ldi  temp1, $42
    ;delay50us_:dec  temp1
    ;           brne delay50us_
    ;           ret                          ;wieder zurück
    
     ;Längere Pause für manche Befehle
    delay5ms:                               ;5ms Pause
    ;           ldi  temp1, $21
    ;WGLOOP0:   ldi  temp2, $C9
    ;WGLOOP1:   dec  temp2
    ;           brne WGLOOP1
    ;           dec  temp1
    ;           brne WGLOOP0
    ; ============================= 
    ;    delay loop generator 
    ;     20000 cycles:
    ; ----------------------------- 
    ; delaying 19998 cycles:
              ldi  R16, $21
    WGLOOP1:  ldi  R17, $C9
    WGLOOP2:  dec  R17
              brne WGLOOP1
              dec  R16
              brne WGLOOP0
    ; ----------------------------- 
    ; delaying 2 cycles:
              nop
              nop
    ; =============================
               ret                          ;wieder zurück
    
     ;Initialisierung: muss ganz am Anfang des Programms aufgerufen werden
    lcd_init:
               ldi  temp3,50
    powerupwait:
               rcall  delay5ms
               dec  temp3
               brne powerupwait
               ldi temp1, 0b00000011        ;muss 3mal hintereinander gesendet
               out PORTC, temp1             ;werden zur Initialisierung
               rcall lcd_enable             ;1
               rcall delay5ms
               rcall lcd_enable             ;2
               rcall delay5ms
               rcall lcd_enable             ;und 3!
               rcall delay5ms
               ldi temp1, 0b00000010        ;4bit-Modus einstellen
               out PORTC, temp1
               rcall lcd_enable
               rcall delay5ms
               ldi temp1, 0b00101000        ;noch was einstellen...
               rcall lcd_command
               ldi temp1, 0b00001100        ;...nochwas...
               rcall lcd_command
               ldi temp1, 0b00000100        ;endlich fertig
               rcall lcd_command
               ret
    
     ;Sendet den Befehl zur Löschung des Displays
    lcd_clear:
               ldi temp1, 0b00000001   ;Display löschen
               rcall lcd_command
               rcall delay5ms
               ret

  4. #14
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.07.2006
    Ort
    nähe Rottweil
    Alter
    40
    Beiträge
    240
    Hallo

    Also so langsam versteh ich das ganze echt nichtmehr. Weiß nichtmehr was ich noch probieren soll. Ich hab mir jetzt mal ein 4 MHz Quarz bestellt und stütze mich auf die Hoffunung daß es damit funktioniert. Habe nämlich die Vermutung daß die Datenwörter einfach zu kurz am Display anliegen und dieses die Befehle gar nicht "mitbekommt" Ich hab jetzt nochmal meine letzte Codevariante angehängt... Kann ja eigentlich auch nicht sein daß hier eigentlich jeder diese Displays zum laufen bekommt nur ich nicht... Falls irgendjemand doch einen Fehler findet bitte melden...

    Vielen Dank im Voraus!!!!

    MFG

    Bean

    Code:
    .include "m8def.inc"
    
    .def temp1 = r16
    .def temp2 = r17
    .def temp3 = r18
    
    			ldi temp1, LOW(Ramend)
    			out SPL, temp1
    			ldi temp1, High(Ramend)
    			out SPH, temp1
    			
    			ldi temp1, 0xFF
    			out DDRB, temp1
    								
    			rcall delay5ms
    			rcall lcd_init
    			rcall lcd_clear
    
    loop:
    
    			rjmp loop
    
    ; LCD Routinen
    
    ;4-Bit Interface
    ;BDB4-BDB7: PB0 - Pb3
    ;RS: PB4
    ;E: PB7
    
    
    ;sendet ein Datenbyte an das LCD
    
    lcd_data:
    			mov temp2, temp1			;"Sicherungskopie" für die Übertragung des zweiten Nibbles
    			swap temp1					;vertauschen
    			andi temp1, 0b00001111		;oberes Nibble auf 0 setzen
    			sbr temp1, 1<<4				;entspricht 0b00010000
    			out PORTB, temp1			;ausgeben
    			rcall lcd_enable			;Enable-Routine aufrufen
    
    
    			andi temp1, 0b00001111		;obere Hälfte auf null setzen
    			sbr temp2, 1<<4				;entspricht 0b00010000
    			out PORTB, temp2			;ausgeben
    			rcall lcd_enable			;enable routine aufrufen
    			rcall delay50us			;Delay routine aufrufen
    			ret							;zurück zum Hauptprogramm
    			
    ;sendet einen Befehl an das LCD
    
    lcd_command:							;wie lcd_data, nur ohne RS zu setzen
    
    			mov temp2, temp1				
    			swap temp1	
    			andi temp1, 0b00001111
    			out PORTB, temp1
    			rcall lcd_enable
    			rcall delay50us
    			andi temp2, 0b00001111
    			out PORTB, temp2
    			rcall lcd_enable
    			rcall delay50us
    			ret
    
    ;erzeugt den Enable-Puls
    
    lcd_enable:
    
    			sbi PORTB, 7				;Enable high
    			rcall delay50us		
    			cbi PORTB, 7				;Enable wieder low
    			ret							;wieder zurück
    
    ;Pause nach jeder Übertragung
    
    delay50us:								;50us Pause
    			
    			ldi  temp2, $1E
    WGLOOP0:  	ldi  temp3, $14
    WGLOOP1:  	dec  temp3
              	brne WGLOOP1
              	dec  temp2
              	brne WGLOOP0						;wieder zurück
    
    ;Längere Pause für manche Befehle
    
    delay5ms:								;5ms Pause
    
    
    WGLOOP2:	ldi temp2, $01
    WGLOOP3:	dec temp2
    			brne WGLOOP3
    			dec temp1
    			brne WGLOOP2
    			
    			ret							;wieder zurück
    			
    ;Initialisierung: muss ganz am Anfang des Programms aufgerufen werden
    
    lcd_init:
    			ldi temp3,50
    powerupwait:
    			rcall delay5ms
    			dec temp3
    			brne powerupwait
    			ldi temp1, 0b00000011		;muss 3 mal hintereinander gesendet werden zur Initialisierung 
    			out PORTB, temp1			;1
    			rcall lcd_enable
    			rcall delay5ms
    			rcall lcd_enable			;2
    			rcall delay5ms
    			rcall lcd_enable			;3
    			rcall delay5ms
    			ldi temp1, 0b00000010		;4Bit Modus einstellen
    			out PORTB, temp1
    			rcall lcd_enable
    			rcall delay5ms
    			ldi temp1, 0b00101000
    			rcall lcd_command
    			ldi temp1, 0b00001100
    			rcall lcd_command
    			ldi temp1, 0b00000100
    			rcall lcd_command
    			ret
    
    ;sendet einen Befehl zur Löschung des Displays
    
    lcd_clear:
    
    			ldi temp1, 0b00000001		;Display Löschen
    			rcall lcd_command
    			rcall delay5ms
    			ret

  5. #15
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.05.2004
    Ort
    Wilhelmshaven
    Alter
    46
    Beiträge
    324
    Hallo Mr Bean.
    Könntest du mal bitte bischen mehr zu deinen Komponenten schreiben. LCD hast du ja genannt. Mein Quellcode über deinem ist auf 4MHz eingestellt. die Warteschleifen sogar neu berechnet mit dem Programm oben.
    Ich benutze ein Board Marke Eigenbau mit Steckbrettanbindung. Fotos versuche ich mal zu machen.
    Habe ein LCD Display, welches auch auf einem Foto hier bei RN abgebildet ist.
    Habe das Display schonmal mit einem Adapter am Parallelport getestet und es läuft.

    Wenn du deinen 4MHz Quarz hast, dann kannst ja mal meinen Code reinschreiben, mußt nur auf deinen Port abändern.

    LCD ist eine so wichtige Anwendung, dass ich es unbedingt hinbekommen muß. Wenn ich schon kein LCD hinbekomme, dann wird es auch nichts mit anderen sinnvollen Anwendungen.

  6. #16
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.05.2004
    Ort
    Wilhelmshaven
    Alter
    46
    Beiträge
    324
    habe das ganze eben noch auf 8bit umgesteckt und auf PD gelegt und RS und E auf PB1-2. Ein Programm geschrieben für eine Routine, die ich mit dem Datenblatt bekommen habe. Leider hat nichts funktioniert.
    Kann man die Leitungen direkt mit den Port-Pins verbinden oder müssen da noch Widerstände oder so zwischen?
    Habe schon soviele Routinen ausprobiert, dass ich jetzt nur noch mit einem Schaltungsfehler rechne.

    Code:
    .include "m8def.inc"
    
    .def temp1 = r16
    .def temp2 = r17
    .def temp3 = r18 
    
               ldi temp1, LOW(RAMEND)      ; LOW-Byte der obersten RAM-Adresse
               out SPL, temp1
               ldi temp1, HIGH(RAMEND)     ; HIGH-Byte der obersten RAM-Adresse
               out SPH, temp1
    
               ldi temp1, 0xFF    ;Port D = Ausgang
               out DDRD, temp1 
               ldi temp1, 0x02    ;Port B 1 als Ausgang und 2 als Eingang
               out DDRB, temp1 
    
               rcall lcd_init     ;Display initialisieren 
    
    loop:
    	rjmp loop
    
    lcd_init:
    	rcall wait1sek	;1Sek nach Einschalten warten
    	ldi temp1,0x00	;RS=0
    	out portb,temp1
    	ldi temp1,0x30	;30h senden
    	out portd,temp1
    	rcall wait4500us ;4,5ms warten
    	ldi temp1,0x00	;RS=0
    	out portb,temp1
    	ldi temp1,0x30	;30h senden
    	out portd,temp1
    	rcall wait120us
    	ldi temp1,0x00	;RS=0
    	out portb,temp1
    	ldi temp1,0x30	;30h senden
    	out portd,temp1
    	rcall busyflagcheck ;busyflag kontrollieren E=0 PB2=0
    	ldi temp1,0x00	;RS=0
    	out portb,temp1
    	ldi temp1,0x3c	;4 Displayzeilen, 8bit Ansteuerung
    	out portd,temp1
    	rcall busyflagcheck
    	ldi temp1,0x00	;RS=0
    	out portb,temp1
    	ldi temp1,0x08	;Display aus zum testen
    	out portd,temp1
    ret
    
    
    busyflagcheck:
    in temp1,portb
    sbrs temp1,2
    rjmp busyflagcheck
    ret
    
    wait1sek: 
    ; ============================= 
    ;    delay loop generator 
    ;     4000000 cycles:
    ; ----------------------------- 
    ; delaying 3999996 cycles:
              ldi  R17, $24
    WGLOOP0:  ldi  R18, $BC
    WGLOOP1:  ldi  R19, $C4
    WGLOOP2:  dec  R19
              brne WGLOOP2
              dec  R18
              brne WGLOOP1
              dec  R17
              brne WGLOOP0
    ; ----------------------------- 
    ; delaying 3 cycles:
              ldi  R17, $01
    WGLOOP3:  dec  R17
              brne WGLOOP3
    ; ----------------------------- 
    ; delaying 1 cycle:
              nop
    ; ============================= 
    ret
    
    wait4500us:
    ; ============================= 
    ;    delay loop generator 
    ;     18000 cycles:
    ; ----------------------------- 
    ; delaying 17985 cycles:
              ldi  R17, $37
    WGLOOP4:  ldi  R18, $6C
    WGLOOP5:  dec  R18
              brne WGLOOP1
              dec  R17
              brne WGLOOP0
    ; ----------------------------- 
    ; delaying 15 cycles:
              ldi  R17, $05
    WGLOOP6:  dec  R17
              brne WGLOOP2
    ; =============================
    ret
    
    wait120us:
    ; ============================= 
    ;    delay loop generator 
    ;     480 cycles:
    ; ----------------------------- 
    ; delaying 480 cycles:
              ldi  R17, $A0
    WGLOOP7:  dec  R17
              brne WGLOOP0
    ; ============================= 
    ret

  7. #17
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    08.02.2005
    Ort
    Freiburg
    Alter
    36
    Beiträge
    602
    ganz kurz, die Taktfrequenz kann man bis 8MHZ mit den Fusebits einstellen, schau mal ins Datenblatt. Aber aufpassen, je nach Programmer ist das einstellen der Fusebits etwas verwirrend.

    Bei der LCD ansteuerung halt ich mich mal lieber fein raus
    Hab hier nämlich auch ein LCD an dem ich bei seiner Ansteuerung verzweifelt bin (ist glaub auch nen KS0073). Am besten immer den HD4... Controller nehmen. Kann gut sein das der KS0073 anderst initialisiert werden muss.
    Ich glaub ich muss doch mal ne universal LCD ansteuerroutine schreiben in der man die Portbelegung und Taktfrequenz sehr einfach ändern kann.


    Viele Grüße,
    Mehto
    -

Seite 2 von 2 ErsteErste 12

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen